[2] | 1 | /* |
---|
[102] | 2 | * Copyright (C) 2005-2008 MaNGOS <http://www.mangosproject.org/> |
---|
| 3 | * |
---|
[44] | 4 | * Copyright (C) 2008 Trinity <http://www.trinitycore.org/> |
---|
[2] | 5 | * |
---|
| 6 | * This program is free software; you can redistribute it and/or modify |
---|
| 7 | * it under the terms of the GNU General Public License as published by |
---|
| 8 | * the Free Software Foundation; either version 2 of the License, or |
---|
| 9 | * (at your option) any later version. |
---|
| 10 | * |
---|
| 11 | * This program is distributed in the hope that it will be useful, |
---|
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
[44] | 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
[2] | 14 | * GNU General Public License for more details. |
---|
| 15 | * |
---|
| 16 | * You should have received a copy of the GNU General Public License |
---|
| 17 | * along with this program; if not, write to the Free Software |
---|
[44] | 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
---|
[2] | 19 | */ |
---|
[44] | 20 | #ifndef TRINITY_MAIL_H |
---|
| 21 | #define TRINITY_MAIL_H |
---|
[2] | 22 | |
---|
| 23 | #include "Common.h" |
---|
| 24 | #include <map> |
---|
| 25 | |
---|
| 26 | class Item; |
---|
| 27 | |
---|
| 28 | #define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889 |
---|
| 29 | #define MAX_MAIL_ITEMS 12 |
---|
| 30 | |
---|
| 31 | enum MAIL_RESPONSE |
---|
| 32 | { |
---|
| 33 | MAIL_OK = 0, |
---|
| 34 | MAIL_MONEY_TAKEN = 1, |
---|
| 35 | MAIL_ITEM_TAKEN = 2, |
---|
| 36 | MAIL_RETURNED_TO_SENDER = 3, |
---|
| 37 | MAIL_DELETED = 4, |
---|
| 38 | MAIL_MADE_PERMANENT = 5 |
---|
| 39 | }; |
---|
| 40 | |
---|
| 41 | enum MAIL_ERRORS |
---|
| 42 | { |
---|
| 43 | MAIL_ERR_BAG_FULL = 1, |
---|
| 44 | MAIL_ERR_CANNOT_SEND_TO_SELF = 2, |
---|
| 45 | MAIL_ERR_NOT_ENOUGH_MONEY = 3, |
---|
| 46 | MAIL_ERR_RECIPIENT_NOT_FOUND = 4, |
---|
| 47 | MAIL_ERR_NOT_YOUR_TEAM = 5, |
---|
| 48 | MAIL_ERR_INTERNAL_ERROR = 6, |
---|
| 49 | MAIL_ERR_DISABLED_FOR_TRIAL_ACC = 14, |
---|
| 50 | MAIL_ERR_RECIPIENT_CAP_REACHED = 15, |
---|
| 51 | MAIL_ERR_CANT_SEND_WRAPPED_COD = 16, |
---|
| 52 | MAIL_ERR_MAIL_AND_CHAT_SUSPENDED = 17 |
---|
| 53 | }; |
---|
| 54 | |
---|
| 55 | enum MailCheckMask |
---|
| 56 | { |
---|
| 57 | MAIL_CHECK_MASK_NONE = 0, |
---|
| 58 | MAIL_CHECK_MASK_READ = 1, |
---|
| 59 | MAIL_CHECK_MASK_AUCTION = 4, |
---|
| 60 | MAIL_CHECK_MASK_COD_PAYMENT = 8, |
---|
| 61 | MAIL_CHECK_MASK_RETURNED = 16 |
---|
| 62 | }; |
---|
| 63 | |
---|
| 64 | enum MailMessageType |
---|
| 65 | { |
---|
| 66 | MAIL_NORMAL = 0, |
---|
| 67 | MAIL_AUCTION = 2, |
---|
| 68 | MAIL_CREATURE = 3, // client send CMSG_CREATURE_QUERY on this mailmessagetype |
---|
| 69 | MAIL_GAMEOBJECT = 4, // client send CMSG_GAMEOBJECT_QUERY on this mailmessagetype |
---|
| 70 | MAIL_ITEM = 5, // client send CMSG_ITEM_QUERY on this mailmessagetype |
---|
| 71 | }; |
---|
| 72 | |
---|
| 73 | enum MailState |
---|
| 74 | { |
---|
| 75 | MAIL_STATE_UNCHANGED = 1, |
---|
| 76 | MAIL_STATE_CHANGED = 2, |
---|
| 77 | MAIL_STATE_DELETED = 3 |
---|
| 78 | }; |
---|
| 79 | |
---|
| 80 | enum MailAuctionAnswers |
---|
| 81 | { |
---|
| 82 | AUCTION_OUTBIDDED = 0, |
---|
| 83 | AUCTION_WON = 1, |
---|
| 84 | AUCTION_SUCCESSFUL = 2, |
---|
| 85 | AUCTION_EXPIRED = 3, |
---|
| 86 | AUCTION_CANCELLED_TO_BIDDER = 4, |
---|
| 87 | AUCTION_CANCELED = 5, |
---|
| 88 | AUCTION_SALE_PENDING = 6 |
---|
| 89 | }; |
---|
| 90 | |
---|
| 91 | // gathered from Stationery.dbc |
---|
| 92 | enum MailStationery |
---|
| 93 | { |
---|
| 94 | MAIL_STATIONERY_UNKNOWN = 0x01, |
---|
| 95 | MAIL_STATIONERY_NORMAL = 0x29, |
---|
| 96 | MAIL_STATIONERY_GM = 0x3D, |
---|
| 97 | MAIL_STATIONERY_AUCTION = 0x3E, |
---|
| 98 | MAIL_STATIONERY_VAL = 0x40, |
---|
| 99 | MAIL_STATIONERY_CHR = 0x41 |
---|
| 100 | }; |
---|
| 101 | |
---|
| 102 | struct MailItemInfo |
---|
| 103 | { |
---|
| 104 | uint32 item_guid; |
---|
| 105 | uint32 item_template; |
---|
| 106 | }; |
---|
| 107 | |
---|
| 108 | struct MailItem |
---|
| 109 | { |
---|
| 110 | MailItem() : item_slot(0), item_guidlow(0), item_template(0), item(NULL) {} |
---|
| 111 | |
---|
| 112 | uint8 item_slot; // slot in mail |
---|
| 113 | uint32 item_guidlow; // item guid (low part) |
---|
| 114 | uint32 item_template; // item entry |
---|
| 115 | Item *item; // item pointer |
---|
| 116 | |
---|
| 117 | void deleteItem(bool inDB = false); |
---|
| 118 | }; |
---|
| 119 | |
---|
| 120 | typedef std::map<uint32, MailItem> MailItemMap; |
---|
| 121 | |
---|
| 122 | class MailItemsInfo |
---|
| 123 | { |
---|
| 124 | public: |
---|
| 125 | MailItemMap::const_iterator begin() const { return i_MailItemMap.begin(); } |
---|
| 126 | MailItemMap::const_iterator end() const { return i_MailItemMap.end(); } |
---|
| 127 | MailItemMap::iterator begin() { return i_MailItemMap.begin(); } |
---|
| 128 | MailItemMap::iterator end() { return i_MailItemMap.end(); } |
---|
| 129 | |
---|
| 130 | void AddItem(uint32 guidlow, uint32 _template, Item *item, uint8 slot = 0) |
---|
| 131 | { |
---|
| 132 | MailItem mailItem; |
---|
| 133 | mailItem.item_slot = slot; |
---|
| 134 | mailItem.item_guidlow = guidlow; |
---|
| 135 | mailItem.item_template = _template; |
---|
| 136 | mailItem.item = item; |
---|
| 137 | i_MailItemMap[guidlow] = mailItem; |
---|
| 138 | } |
---|
| 139 | |
---|
| 140 | void AddItem(uint32 guidlow, uint8 slot = 0) |
---|
| 141 | { |
---|
| 142 | MailItem mailItem; |
---|
| 143 | mailItem.item_guidlow = guidlow; |
---|
| 144 | mailItem.item_slot = slot; |
---|
| 145 | i_MailItemMap[guidlow] = mailItem; |
---|
| 146 | } |
---|
| 147 | |
---|
| 148 | uint8 size() const { return i_MailItemMap.size(); } |
---|
| 149 | bool empty() const { return i_MailItemMap.empty(); } |
---|
| 150 | |
---|
| 151 | void deleteIncludedItems(bool inDB = false) |
---|
| 152 | { |
---|
| 153 | for(MailItemMap::iterator mailItemIter = begin(); mailItemIter != end(); ++mailItemIter) |
---|
| 154 | { |
---|
| 155 | MailItem& mailItem = mailItemIter->second; |
---|
| 156 | mailItem.deleteItem(inDB); |
---|
| 157 | } |
---|
| 158 | } |
---|
| 159 | private: |
---|
| 160 | MailItemMap i_MailItemMap; // Keep the items in a map to avoid duplicate guids (which can happen), store only low part of guid |
---|
| 161 | }; |
---|
| 162 | |
---|
| 163 | struct Mail |
---|
| 164 | { |
---|
| 165 | uint32 messageID; |
---|
| 166 | uint8 messageType; |
---|
| 167 | uint8 stationery; |
---|
| 168 | uint16 mailTemplateId; |
---|
| 169 | uint32 sender; |
---|
| 170 | uint32 receiver; |
---|
| 171 | std::string subject; |
---|
| 172 | uint32 itemTextId; |
---|
| 173 | std::vector<MailItemInfo> items; |
---|
| 174 | std::vector<uint32> removedItems; |
---|
| 175 | time_t expire_time; |
---|
| 176 | time_t deliver_time; |
---|
| 177 | uint32 money; |
---|
| 178 | uint32 COD; |
---|
| 179 | uint32 checked; |
---|
| 180 | MailState state; |
---|
| 181 | |
---|
| 182 | void AddItem(uint32 itemGuidLow, uint32 item_template) |
---|
| 183 | { |
---|
| 184 | MailItemInfo mii; |
---|
| 185 | mii.item_guid = itemGuidLow; |
---|
| 186 | mii.item_template = item_template; |
---|
| 187 | items.push_back(mii); |
---|
| 188 | } |
---|
| 189 | |
---|
| 190 | void AddAllItems(MailItemsInfo& pMailItemsInfo) |
---|
| 191 | { |
---|
| 192 | for(MailItemMap::iterator mailItemIter = pMailItemsInfo.begin(); mailItemIter != pMailItemsInfo.end(); ++mailItemIter) |
---|
| 193 | { |
---|
| 194 | MailItem& mailItem = mailItemIter->second; |
---|
| 195 | AddItem(mailItem.item_guidlow, mailItem.item_template); |
---|
| 196 | } |
---|
| 197 | } |
---|
| 198 | |
---|
| 199 | bool RemoveItem(uint32 itemId) |
---|
| 200 | { |
---|
| 201 | for(std::vector<MailItemInfo>::iterator itr = items.begin(); itr != items.end(); ++itr) |
---|
| 202 | { |
---|
| 203 | if(itr->item_guid == itemId) |
---|
| 204 | { |
---|
| 205 | items.erase(itr); |
---|
| 206 | return true; |
---|
| 207 | } |
---|
| 208 | } |
---|
| 209 | return false; |
---|
| 210 | } |
---|
| 211 | |
---|
| 212 | bool HasItems() const { return !items.empty(); } |
---|
| 213 | }; |
---|
| 214 | #endif |
---|