[7898] Improve client error output at different mail send errors, cleanup code. Author: VladimirMangos
--HG-- branch : trunk
This commit is contained in:
+5
-5
@@ -701,16 +701,16 @@ bool Item::IsEquipped() const
|
|||||||
|
|
||||||
bool Item::CanBeTraded() const
|
bool Item::CanBeTraded() const
|
||||||
{
|
{
|
||||||
if(IsSoulBound())
|
if (IsSoulBound())
|
||||||
return false;
|
return false;
|
||||||
if(IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) )
|
if (IsBag() && (Player::IsBagPos(GetPos()) || !((Bag const*)this)->IsEmpty()) )
|
||||||
return false;
|
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;
|
return false;
|
||||||
if(owner->GetLootGUID()==GetGUID())
|
if (owner->GetLootGUID()==GetGUID())
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -118,8 +118,11 @@ enum InventoryChangeFailure
|
|||||||
EQUIP_ERR_TOO_MUCH_GOLD = 77,
|
EQUIP_ERR_TOO_MUCH_GOLD = 77,
|
||||||
EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78,
|
EQUIP_ERR_NOT_DURING_ARENA_MATCH = 78,
|
||||||
EQUIP_ERR_CANNOT_TRADE_THAT = 79,
|
EQUIP_ERR_CANNOT_TRADE_THAT = 79,
|
||||||
EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80
|
EQUIP_ERR_PERSONAL_ARENA_RATING_TOO_LOW = 80,
|
||||||
// probably exist more
|
// no output = 81,
|
||||||
|
EQUIP_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS = 82,
|
||||||
|
// no output = 83,
|
||||||
|
// crash client = 84,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum BuyFailure
|
enum BuyFailure
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ enum ItemBondingType
|
|||||||
// masks for ITEM_FIELD_FLAGS field
|
// masks for ITEM_FIELD_FLAGS field
|
||||||
enum ITEM_FLAGS
|
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_CONJURED = 0x00000002,
|
||||||
ITEM_FLAGS_OPENABLE = 0x00000004,
|
ITEM_FLAGS_OPENABLE = 0x00000004,
|
||||||
ITEM_FLAGS_WRAPPED = 0x00000008,
|
ITEM_FLAGS_WRAPPED = 0x00000008,
|
||||||
@@ -116,7 +116,7 @@ enum ITEM_FLAGS
|
|||||||
ITEM_FLAGS_USEABLE_IN_ARENA = 0x00200000,
|
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_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_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_TRIGGERED_CAST = 0x10000000, // used by enchanting scrolls made with vellum
|
||||||
ITEM_FLAGS_MILLABLE = 0x20000000
|
ITEM_FLAGS_MILLABLE = 0x20000000
|
||||||
};
|
};
|
||||||
|
|||||||
+27
-17
@@ -80,7 +80,10 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
|
|||||||
recv_data >> items_count; // attached items count
|
recv_data >> items_count; // attached items count
|
||||||
|
|
||||||
if(items_count > 12) // client limit
|
if(items_count > 12) // client limit
|
||||||
|
{
|
||||||
|
GetPlayer()->SendMailResult(0, MAIL_SEND, MAIL_ERR_TOO_MANY_ATTACHMENTS);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// recheck
|
// 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);
|
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",
|
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->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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +127,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
|
|||||||
|
|
||||||
if(pl->GetGUID() == rc)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +137,7 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
|
|||||||
|
|
||||||
if (pl->GetMoney() < reqmoney)
|
if (pl->GetMoney() < reqmoney)
|
||||||
{
|
{
|
||||||
pl->SendMailResult(0, 0, MAIL_ERR_NOT_ENOUGH_MONEY);
|
pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_NOT_ENOUGH_MONEY);
|
||||||
return;
|
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..
|
//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)
|
if (mails_count > 100)
|
||||||
{
|
{
|
||||||
pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR);
|
pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_RECIPIENT_CAP_REACHED);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// test the receiver's Faction...
|
// test the receiver's Faction...
|
||||||
if (!sWorld.getConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL) && pl->GetTeam() != rc_team && GetSecurity() == SEC_PLAYER)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,31 +183,38 @@ void WorldSession::HandleSendMail(WorldPacket & recv_data )
|
|||||||
|
|
||||||
if(!mailItem.item_guidlow)
|
if(!mailItem.item_guidlow)
|
||||||
{
|
{
|
||||||
pl->SendMailResult(0, 0, MAIL_ERR_INTERNAL_ERROR);
|
pl->SendMailResult(0, MAIL_SEND, MAIL_ERR_MAIL_ATTACHMENT_INVALID);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mailItem.item = pl->GetItemByGuid(MAKE_NEW_GUID(mailItem.item_guidlow, 0, HIGHGUID_ITEM));
|
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)
|
// 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;
|
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))
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(COD && mailItem.item->HasFlag(ITEM_FIELD_FLAGS, ITEM_FLAGS_WRAPPED))
|
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;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pl->SendMailResult(0, 0, MAIL_OK);
|
pl->SendMailResult(0, MAIL_SEND, MAIL_OK);
|
||||||
|
|
||||||
uint32 itemTextId = 0;
|
uint32 itemTextId = 0;
|
||||||
if (!body.empty())
|
if (!body.empty())
|
||||||
@@ -316,7 +326,7 @@ void WorldSession::HandleMailDelete(WorldPacket & recv_data )
|
|||||||
Mail *m = pl->GetMail(mailId);
|
Mail *m = pl->GetMail(mailId);
|
||||||
if(m)
|
if(m)
|
||||||
m->state = MAIL_STATE_DELETED;
|
m->state = MAIL_STATE_DELETED;
|
||||||
pl->SendMailResult(mailId, MAIL_DELETED, 0);
|
pl->SendMailResult(mailId, MAIL_DELETED, MAIL_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorldSession::HandleReturnToSender(WorldPacket & recv_data )
|
void WorldSession::HandleReturnToSender(WorldPacket & recv_data )
|
||||||
@@ -375,7 +385,7 @@ void WorldSession::HandleReturnToSender(WorldPacket & recv_data )
|
|||||||
}
|
}
|
||||||
|
|
||||||
delete m; //we can deallocate old mail
|
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 )
|
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);
|
pl->SendMailResult(mailId, MAIL_ITEM_TAKEN, MAIL_OK, 0, itemId, count);
|
||||||
}
|
}
|
||||||
else
|
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 )
|
void WorldSession::HandleTakeMoney(WorldPacket & recv_data )
|
||||||
@@ -542,7 +552,7 @@ void WorldSession::HandleTakeMoney(WorldPacket & recv_data )
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pl->SendMailResult(mailId, MAIL_MONEY_TAKEN, 0);
|
pl->SendMailResult(mailId, MAIL_MONEY_TAKEN, MAIL_OK);
|
||||||
|
|
||||||
pl->ModifyMoney(m->money);
|
pl->ModifyMoney(m->money);
|
||||||
m->money = 0;
|
m->money = 0;
|
||||||
@@ -735,11 +745,11 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket & recv_data )
|
|||||||
|
|
||||||
pl->StoreItem(dest, bodyItem, true);
|
pl->StoreItem(dest, bodyItem, true);
|
||||||
//bodyItem->SetState(ITEM_NEW, pl); is set automatically
|
//bodyItem->SetState(ITEM_NEW, pl); is set automatically
|
||||||
pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, 0);
|
pl->SendMailResult(mailId, MAIL_MADE_PERMANENT, MAIL_OK);
|
||||||
}
|
}
|
||||||
else
|
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;
|
delete bodyItem;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,30 +28,6 @@ class Item;
|
|||||||
#define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889
|
#define MAIL_BODY_ITEM_TEMPLATE 8383 // - plain letter, A Dusty Unsent Letter: 889
|
||||||
#define MAX_MAIL_ITEMS 12
|
#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
|
enum MailCheckMask
|
||||||
{
|
{
|
||||||
MAIL_CHECK_MASK_NONE = 0,
|
MAIL_CHECK_MASK_NONE = 0,
|
||||||
|
|||||||
+3
-3
@@ -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) mailId;
|
||||||
data << (uint32) mailAction;
|
data << (uint32) mailAction;
|
||||||
data << (uint32) mailError;
|
data << (uint32) mailError;
|
||||||
if ( mailError == MAIL_ERR_BAG_FULL )
|
if ( mailError == MAIL_ERR_EQUIP_ERROR )
|
||||||
data << (uint32) equipError;
|
data << (uint32) equipError;
|
||||||
else if( mailAction == MAIL_ITEM_TAKEN )
|
else if( mailAction == MAIL_ITEM_TAKEN )
|
||||||
{
|
{
|
||||||
|
|||||||
+1
-1
@@ -1278,7 +1278,7 @@ class TRINITY_DLL_SPEC Player : public Unit
|
|||||||
void ClearComboPoints();
|
void ClearComboPoints();
|
||||||
void SendComboPoints();
|
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 SendNewMail();
|
||||||
void UpdateNextMailTimeAndUnreads();
|
void UpdateNextMailTimeAndUnreads();
|
||||||
void AddNewMailDeliverTime(time_t deliver_time);
|
void AddNewMailDeliverTime(time_t deliver_time);
|
||||||
|
|||||||
@@ -2564,5 +2564,33 @@ enum BattleGroundTypeId
|
|||||||
};
|
};
|
||||||
#define MAX_BATTLEGROUND_TYPE_ID 12
|
#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
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user