diff options
-rw-r--r-- | src/game/Item.cpp | 10 | ||||
-rw-r--r-- | src/game/Item.h | 7 | ||||
-rw-r--r-- | src/game/ItemPrototype.h | 4 | ||||
-rw-r--r-- | src/game/Mail.cpp | 44 | ||||
-rw-r--r-- | src/game/Mail.h | 24 | ||||
-rw-r--r-- | src/game/Player.cpp | 6 | ||||
-rw-r--r-- | src/game/Player.h | 2 | ||||
-rw-r--r-- | src/game/SharedDefines.h | 28 |
8 files changed, 71 insertions, 54 deletions
diff --git a/src/game/Item.cpp b/src/game/Item.cpp index 02a9b37d994..5f281f6b98d 100644 --- a/src/game/Item.cpp +++ b/src/game/Item.cpp @@ -701,16 +701,16 @@ bool Item::IsEquipped() const bool Item::CanBeTraded() const { - if(IsSoulBound()) + if (IsSoulBound()) return false; - if(IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) ) + if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) ) return false; - if(Player* owner = GetOwner()) + if (Player* owner = GetOwner()) { - if(owner->CanUnequipItem(GetPos(),false) != EQUIP_ERR_OK ) + if (owner->CanUnequipItem(GetPos(),false) != EQUIP_ERR_OK ) return false; - if(owner->GetLootGUID()==GetGUID()) + if (owner->GetLootGUID()==GetGUID()) return false; } diff --git a/src/game/Item.h b/src/game/Item.h index 9237c6715f2..1b04dacbc3b 100644 --- a/src/game/Item.h +++ b/src/game/Item.h @@ -118,8 +118,11 @@ enum InventoryChangeFailure EQUIP_ERR_TOO_MUCH_GOLD = 77, EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78, EQUIP_ERR_CANNOT_TRADE_THAT = 79, - EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80 - // probably exist more + EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80, + // no output = 81, + EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS = 82, + // no output = 83, + // crash client = 84, }; enum BuyFailure diff --git a/src/game/ItemPrototype.h b/src/game/ItemPrototype.h index e7a37dc8e14..64c57d2c7fc 100644 --- a/src/game/ItemPrototype.h +++ b/src/game/ItemPrototype.h @@ -103,7 +103,7 @@ enum ItemBondingType // masks for ITEM_FIELD_FLAGS field enum ITEM_FLAGS { - ITEM_FLAGS_BINDED = 0x00000001, + ITEM_FLAGS_BINDED = 0x00000001, // set in game at binding, not set in template ITEM_FLAGS_CONJURED = 0x00000002, ITEM_FLAGS_OPENABLE = 0x00000004, ITEM_FLAGS_WRAPPED = 0x00000008, @@ -116,7 +116,7 @@ enum ITEM_FLAGS ITEM_FLAGS_USEABLE_IN_ARENA = 0x00200000, ITEM_FLAGS_THROWABLE = 0x00400000, // not used in game for check trow possibility, only for item in game tooltip ITEM_FLAGS_SPECIALUSE = 0x00800000, // last used flag in 2.3.0 - ITEM_FLAGS_BOA = 0x08000000, // bind on account + ITEM_FLAGS_BOA = 0x08000000, // bind on account (set in template for items that can binded in like way) ITEM_FLAGS_TRIGGERED_CAST = 0x10000000, // used by enchanting scrolls made with vellum ITEM_FLAGS_MILLABLE = 0x20000000 }; diff --git a/src/game/Mail.cpp b/src/game/Mail.cpp index 8f682a858ee..8e1077cef97 100644 --- a/src/game/Mail.cpp +++ b/src/game/Mail.cpp @@ -80,7 +80,10 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) recv_data >> items_count; // attached items count if(items_count > 12) // client limit + { + GetPlayer()->SendMailResult(0, MAIL_SEND, MAIL_ERR_TOO_MANY_ATTACHMENTS); return; + } // recheck CHECK_PACKET_SIZE(recv_data, 8+(receiver.size()+1)+(subject.size()+1)+(body.size()+1)+4+4+1+items_count*(1+8)+4+4+8+1); @@ -116,7 +119,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) { sLog.outDetail("Player %u is sending mail to %s (GUID: not existed!) with subject %s and body %s includes %u items, %u copper and %u COD copper with unk1 = %u, unk2 = %u", pl->GetGUIDLow(), receiver.c_str(), subject.c_str(), body.c_str(), items_count, money, COD, unk1, unk2); - pl->SendMailResult(0, 0, MAIL_ERR_RECIPIENT_NOT_FOUND); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_RECIPIENT_NOT_FOUND); return; } @@ -124,7 +127,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) if(pl->GetGUID() == rc) { - pl->SendMailResult(0, 0, MAIL_ERR_CANNOT_SEND_TO_SELF); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_CANNOT_SEND_TO_SELF); return; } @@ -134,7 +137,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) if (pl->GetMoney() < reqmoney) { - pl->SendMailResult(0, 0, MAIL_ERR_NOT_ENOUGH_MONEY); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_NOT_ENOUGH_MONEY); return; } @@ -162,13 +165,13 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) //do not allow to have more than 100 mails in mailbox.. mails count is in opcode uint8!!! - so max can be 255.. if (mails_count > 100) { - pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_RECIPIENT_CAP_REACHED); return; } // test the receiver's Faction... if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL) && pl->GetTeam() != rc_team && GetSecurity() == SEC_PLAYER) { - pl->SendMailResult(0, 0, MAIL_ERR_NOT_YOUR_TEAM); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_NOT_YOUR_TEAM); return; } @@ -180,31 +183,38 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data ) if(!mailItem.item_guidlow) { - pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_MAIL_ATTACHMENT_INVALID); return; } mailItem.item = pl->GetItemByGuid(MAKE_NEW_GUID(mailItem.item_guidlow, 0, HIGHGUID_ITEM)); // prevent sending bag with items (cheat: can be placed in bag after adding equipped empty bag to mail) - if(!mailItem.item || !mailItem.item->CanBeTraded()) + if(!mailItem.item) { - pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_MAIL_ATTACHMENT_INVALID); return; } + + if(!mailItem.item->CanBeTraded()) + { + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_MAIL_BOUND_ITEM); + return; + } + if (mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_CONJURED) || mailItem.item->GetUInt32Value(ITEM_FIELD_DURATION)) { - pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_EQUIP_ERROR, EQUIP_ERR_MAIL_BOUND_ITEM); return; } if(COD && mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED)) { - pl->SendMailResult(0, 0, MAIL_ERR_CANT_SEND_WRAPPED_COD); + pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_CANT_SEND_WRAPPED_COD); return; } } } - pl->SendMailResult(0, 0, MAIL_OK); + pl->SendMailResult(0, MAIL_SEND, MAIL_OK); uint32 itemTextId = 0; if (!body.empty()) @@ -316,7 +326,7 @@ void WorldSession::HandleMailDelete(WorldPacket & recv_data ) Mail *m = pl->GetMail(mailId); if(m) m->state = MAIL_STATE_DELETED; - pl->SendMailResult(mailId, MAIL_DELETED, 0); + pl->SendMailResult(mailId, MAIL_DELETED, MAIL_OK); } void WorldSession::HandleReturnToSender(WorldPacket & recv_data ) @@ -375,7 +385,7 @@ void WorldSession::HandleReturnToSender(WorldPacket & recv_data ) } delete m; //we can deallocate old mail - pl->SendMailResult(mailId, MAIL_RETURNED_TO_SENDER, 0); + pl->SendMailResult(mailId, MAIL_RETURNED_TO_SENDER, MAIL_OK); } void WorldSession::SendReturnToSender(uint8 messageType, uint32 sender_acc, uint32 sender_guid, uint32 receiver_guid, const std::string& subject, uint32 itemTextId, MailItemsInfo *mi, uint32 money, uint16 mailTemplateId ) @@ -518,7 +528,7 @@ void WorldSession::HandleTakeItem(WorldPacket & recv_data ) pl->SendMailResult(mailId, MAIL_ITEM_TAKEN, MAIL_OK, 0, itemId, count); } else - pl->SendMailResult(mailId, MAIL_ITEM_TAKEN, MAIL_ERR_BAG_FULL, msg); + pl->SendMailResult(mailId, MAIL_ITEM_TAKEN, MAIL_ERR_EQUIP_ERROR, msg); } void WorldSession::HandleTakeMoney(WorldPacket & recv_data ) @@ -542,7 +552,7 @@ void WorldSession::HandleTakeMoney(WorldPacket & recv_data ) return; } - pl->SendMailResult(mailId, MAIL_MONEY_TAKEN, 0); + pl->SendMailResult(mailId, MAIL_MONEY_TAKEN, MAIL_OK); pl->ModifyMoney(m->money); m->money = 0; @@ -735,11 +745,11 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data ) pl->StoreItem(dest, bodyItem, true); //bodyItem->SetState(ITEM_NEW, pl); is set automatically - pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, 0); + pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_OK); } else { - pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_ERR_BAG_FULL, msg); + pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_ERR_EQUIP_ERROR, msg); delete bodyItem; } } diff --git a/src/game/Mail.h b/src/game/Mail.h index 6bac6d60735..8cbe46e6396 100644 --- a/src/game/Mail.h +++ b/src/game/Mail.h @@ -28,30 +28,6 @@ class Item; #define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889 #define MAX_MAIL_ITEMS 12 -enum MAIL_RESPONSE -{ - MAIL_OK = 0, - MAIL_MONEY_TAKEN = 1, - MAIL_ITEM_TAKEN = 2, - MAIL_RETURNED_TO_SENDER = 3, - MAIL_DELETED = 4, - MAIL_MADE_PERMANENT = 5 -}; - -enum MAIL_ERRORS -{ - MAIL_ERR_BAG_FULL = 1, - MAIL_ERR_CANNOT_SEND_TO_SELF = 2, - MAIL_ERR_NOT_ENOUGH_MONEY = 3, - MAIL_ERR_RECIPIENT_NOT_FOUND = 4, - MAIL_ERR_NOT_YOUR_TEAM = 5, - MAIL_ERR_INTERNAL_ERROR = 6, - MAIL_ERR_DISABLED_FOR_TRIAL_ACC = 14, - MAIL_ERR_RECIPIENT_CAP_REACHED = 15, - MAIL_ERR_CANT_SEND_WRAPPED_COD = 16, - MAIL_ERR_MAIL_AND_CHAT_SUSPENDED = 17 -}; - enum MailCheckMask { MAIL_CHECK_MASK_NONE = 0, diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 55def579532..b7a5698e998 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2657,13 +2657,13 @@ void Player::RemoveMail(uint32 id) } } -void Player::SendMailResult(uint32 mailId, uint32 mailAction, uint32 mailError, uint32 equipError, uint32 item_guid, uint32 item_count) +void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError, uint32 item_guid, uint32 item_count) { - WorldPacket data(SMSG_SEND_MAIL_RESULT, (4+4+4+(mailError == MAIL_ERR_BAG_FULL?4:(mailAction == MAIL_ITEM_TAKEN?4+4:0)))); + WorldPacket data(SMSG_SEND_MAIL_RESULT, (4+4+4+(mailError == MAIL_ERR_EQUIP_ERROR?4:(mailAction == MAIL_ITEM_TAKEN?4+4:0)))); data << (uint32) mailId; data << (uint32) mailAction; data << (uint32) mailError; - if ( mailError == MAIL_ERR_BAG_FULL ) + if ( mailError == MAIL_ERR_EQUIP_ERROR ) data << (uint32) equipError; else if( mailAction == MAIL_ITEM_TAKEN ) { diff --git a/src/game/Player.h b/src/game/Player.h index db30ae4941c..26892cde3f3 100644 --- a/src/game/Player.h +++ b/src/game/Player.h @@ -1278,7 +1278,7 @@ class TRINITY_DLL_SPEC Player : public Unit void ClearComboPoints(); void SendComboPoints(); - void SendMailResult(uint32 mailId, uint32 mailAction, uint32 mailError, uint32 equipError = 0, uint32 item_guid = 0, uint32 item_count = 0); + void SendMailResult(uint32 mailId, MailResponseType mailAction, MailResponseResult mailError, uint32 equipError = 0, uint32 item_guid = 0, uint32 item_count = 0); void SendNewMail(); void UpdateNextMailTimeAndUnreads(); void AddNewMailDeliverTime(time_t deliver_time); diff --git a/src/game/SharedDefines.h b/src/game/SharedDefines.h index bed65c4859c..23f32601df7 100644 --- a/src/game/SharedDefines.h +++ b/src/game/SharedDefines.h @@ -2564,5 +2564,33 @@ enum BattleGroundTypeId }; #define MAX_BATTLEGROUND_TYPE_ID 12 +enum MailResponseType +{ + MAIL_SEND = 0, + MAIL_MONEY_TAKEN = 1, + MAIL_ITEM_TAKEN = 2, + MAIL_RETURNED_TO_SENDER = 3, + MAIL_DELETED = 4, + MAIL_MADE_PERMANENT = 5 +}; + +enum MailResponseResult +{ + MAIL_OK = 0, + MAIL_ERR_EQUIP_ERROR = 1, + MAIL_ERR_CANNOT_SEND_TO_SELF = 2, + MAIL_ERR_NOT_ENOUGH_MONEY = 3, + MAIL_ERR_RECIPIENT_NOT_FOUND = 4, + MAIL_ERR_NOT_YOUR_TEAM = 5, + MAIL_ERR_INTERNAL_ERROR = 6, + MAIL_ERR_DISABLED_FOR_TRIAL_ACC = 14, + MAIL_ERR_RECIPIENT_CAP_REACHED = 15, + MAIL_ERR_CANT_SEND_WRAPPED_COD = 16, + MAIL_ERR_MAIL_AND_CHAT_SUSPENDED = 17, + MAIL_ERR_TOO_MANY_ATTACHMENTS = 18, + MAIL_ERR_MAIL_ATTACHMENT_INVALID = 19, + MAIL_ERR_ITEM_HAS_EXPIRED = 21, +}; + #endif |