aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2015-04-04 13:33:58 +0200
committerShauren <shauren.trinity@gmail.com>2015-04-04 13:33:58 +0200
commit250d85b559c175ee7ad35d12879aec01b01a4179 (patch)
treec85db38f58aa4384a0897fefdca8a0551f5c860d
parent76cbf05a2e4db61872faeb0f34bee9ee8d37db73 (diff)
Core/PacketIO: Updated and enabled RaF packets
-rw-r--r--src/server/game/Entities/Player/Player.h30
-rw-r--r--src/server/game/Handlers/ReferAFriendHandler.cpp38
-rw-r--r--src/server/game/Server/Packets/ReferAFriendPackets.cpp44
-rw-r--r--src/server/game/Server/Packets/ReferAFriendPackets.h71
-rw-r--r--src/server/game/Server/Packets/TradePackets.h8
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp9
-rw-r--r--src/server/game/Server/WorldSession.h10
-rw-r--r--src/server/game/World/World.cpp6
8 files changed, 166 insertions, 50 deletions
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 83627ede64f..e263dd70bee 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1033,20 +1033,22 @@ enum CharDeleteMethod
enum ReferAFriendError
{
- ERR_REFER_A_FRIEND_NONE = 0x00,
- ERR_REFER_A_FRIEND_NOT_REFERRED_BY = 0x01,
- ERR_REFER_A_FRIEND_TARGET_TOO_HIGH = 0x02,
- ERR_REFER_A_FRIEND_INSUFFICIENT_GRANTABLE_LEVELS = 0x03,
- ERR_REFER_A_FRIEND_TOO_FAR = 0x04,
- ERR_REFER_A_FRIEND_DIFFERENT_FACTION = 0x05,
- ERR_REFER_A_FRIEND_NOT_NOW = 0x06,
- ERR_REFER_A_FRIEND_GRANT_LEVEL_MAX_I = 0x07,
- ERR_REFER_A_FRIEND_SUMMON_LEVEL_MAX_I = 0x08,
- ERR_REFER_A_FRIEND_SUMMON_COOLDOWN = 0x09,
- ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S = 0x0A,
- ERR_REFER_A_FRIEND_INSUF_EXPAN_LVL = 0x0B,
- ERR_REFER_A_FRIEND_NOT_IN_LFG = 0x0C,
- ERR_REFER_A_FRIEND_NO_XREALM = 0x0D
+ ERR_REFER_A_FRIEND_NONE = 0,
+ ERR_REFER_A_FRIEND_NOT_REFERRED_BY = 1,
+ ERR_REFER_A_FRIEND_TARGET_TOO_HIGH = 2,
+ ERR_REFER_A_FRIEND_INSUFFICIENT_GRANTABLE_LEVELS = 3,
+ ERR_REFER_A_FRIEND_TOO_FAR = 4,
+ ERR_REFER_A_FRIEND_DIFFERENT_FACTION = 5,
+ ERR_REFER_A_FRIEND_NOT_NOW = 6,
+ ERR_REFER_A_FRIEND_GRANT_LEVEL_MAX_I = 7,
+ ERR_REFER_A_FRIEND_NO_TARGET = 8,
+ ERR_REFER_A_FRIEND_NOT_IN_GROUP = 9,
+ ERR_REFER_A_FRIEND_SUMMON_LEVEL_MAX_I = 10,
+ ERR_REFER_A_FRIEND_SUMMON_COOLDOWN = 11,
+ ERR_REFER_A_FRIEND_INSUF_EXPAN_LVL = 12,
+ ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S = 13,
+ ERR_REFER_A_FRIEND_NO_XREALM = 14,
+ ERR_REFER_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 15
};
enum PlayerRestState
diff --git a/src/server/game/Handlers/ReferAFriendHandler.cpp b/src/server/game/Handlers/ReferAFriendHandler.cpp
index 4610f737fce..a7cee1e25b9 100644
--- a/src/server/game/Handlers/ReferAFriendHandler.cpp
+++ b/src/server/game/Handlers/ReferAFriendHandler.cpp
@@ -20,18 +20,13 @@
#include "ObjectMgr.h"
#include "Opcodes.h"
#include "Log.h"
+#include "ReferAFriendPackets.h"
-void WorldSession::HandleGrantLevel(WorldPacket& recvData)
+void WorldSession::HandleGrantLevel(WorldPackets::RaF::GrantLevel& grantLevel)
{
- TC_LOG_DEBUG("network", "WORLD: CMSG_GRANT_LEVEL");
-
- ObjectGuid guid;
- recvData >> guid.ReadAsPacked();
-
- Player* target = ObjectAccessor::GetObjectInWorld(guid, _player);
+ Player* target = ObjectAccessor::GetObjectInWorld(grantLevel.Target, _player);
// check cheating
- /* TODO: 6.x update lfg system
uint8 levels = _player->GetGrantableLevels();
uint8 error = 0;
if (!target)
@@ -48,31 +43,28 @@ void WorldSession::HandleGrantLevel(WorldPacket& recvData)
error = ERR_REFER_A_FRIEND_GRANT_LEVEL_MAX_I;
else if (target->GetGroup() != _player->GetGroup())
error = ERR_REFER_A_FRIEND_NOT_IN_GROUP;
+ else if (target->getLevel() >= GetMaxLevelForExpansion(target->GetSession()->GetExpansion()))
+ error = ERR_REFER_A_FRIEND_INSUF_EXPAN_LVL;
if (error)
{
- WorldPacket data(SMSG_REFER_A_FRIEND_FAILURE, 24);
- data << uint32(error);
+ WorldPackets::RaF::ReferAFriendFailure failure;
+ failure.Reason = error;
if (error == ERR_REFER_A_FRIEND_NOT_IN_GROUP)
- data << target->GetName();
+ failure.Str = target->GetName();
- SendPacket(&data);
+ SendPacket(failure.Write());
return;
- }*/
+ }
- WorldPacket data2(SMSG_PROPOSE_LEVEL_GRANT, 8);
- data2 << _player->GetPackGUID();
- target->GetSession()->SendPacket(&data2);
+ WorldPackets::RaF::ProposeLevelGrant proposeLevelGrant;
+ proposeLevelGrant.Sender = _player->GetGUID();
+ target->SendDirectMessage(proposeLevelGrant.Write());
}
-void WorldSession::HandleAcceptGrantLevel(WorldPacket& recvData)
+void WorldSession::HandleAcceptGrantLevel(WorldPackets::RaF::AcceptLevelGrant& acceptLevelGrant)
{
- TC_LOG_DEBUG("network", "WORLD: CMSG_ACCEPT_LEVEL_GRANT");
-
- ObjectGuid guid;
- recvData >> guid.ReadAsPacked();
-
- Player* other = ObjectAccessor::GetObjectInWorld(guid, _player);
+ Player* other = ObjectAccessor::GetObjectInWorld(acceptLevelGrant.Granter, _player);
if (!(other && other->GetSession()))
return;
diff --git a/src/server/game/Server/Packets/ReferAFriendPackets.cpp b/src/server/game/Server/Packets/ReferAFriendPackets.cpp
new file mode 100644
index 00000000000..d5b33fd3f46
--- /dev/null
+++ b/src/server/game/Server/Packets/ReferAFriendPackets.cpp
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "ReferAFriendPackets.h"
+
+void WorldPackets::RaF::AcceptLevelGrant::Read()
+{
+ _worldPacket >> Granter;
+}
+
+void WorldPackets::RaF::GrantLevel::Read()
+{
+ _worldPacket >> Target;
+}
+
+WorldPacket const* WorldPackets::RaF::ProposeLevelGrant::Write()
+{
+ _worldPacket << Sender;
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::RaF::ReferAFriendFailure::Write()
+{
+ _worldPacket << int32(Reason);
+ // Client uses this sring only if Reason == ERR_REFER_A_FRIEND_NOT_IN_GROUP || Reason == ERR_REFER_A_FRIEND_SUMMON_OFFLINE_S
+ // but always reads it from packet
+ _worldPacket.WriteBits(Str.length(), 6);
+ _worldPacket.WriteString(Str);
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/ReferAFriendPackets.h b/src/server/game/Server/Packets/ReferAFriendPackets.h
new file mode 100644
index 00000000000..c312b8b6935
--- /dev/null
+++ b/src/server/game/Server/Packets/ReferAFriendPackets.h
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2008-2015 TrinityCore <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, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef ReferAFriendPackets_h__
+#define ReferAFriendPackets_h__
+
+#include "Packets.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets
+{
+ namespace RaF
+ {
+ class AcceptLevelGrant final : public ClientPacket
+ {
+ public:
+ AcceptLevelGrant(WorldPacket&& packet) : ClientPacket(CMSG_ACCEPT_LEVEL_GRANT, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Granter;
+ };
+
+ class GrantLevel final : public ClientPacket
+ {
+ public:
+ GrantLevel(WorldPacket&& packet) : ClientPacket(CMSG_GRANT_LEVEL, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Target;
+ };
+
+ class ProposeLevelGrant final : public ServerPacket
+ {
+ public:
+ ProposeLevelGrant() : ServerPacket(SMSG_PROPOSE_LEVEL_GRANT, 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Sender;
+ };
+
+ class ReferAFriendFailure final : public ServerPacket
+ {
+ public:
+ ReferAFriendFailure() : ServerPacket(SMSG_REFER_A_FRIEND_FAILURE, 1 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ std::string Str;
+ int32 Reason = 0;
+ };
+ }
+}
+
+#endif // ReferAFriendPackets_h__
diff --git a/src/server/game/Server/Packets/TradePackets.h b/src/server/game/Server/Packets/TradePackets.h
index 8831135f4e5..5ac2c44bc41 100644
--- a/src/server/game/Server/Packets/TradePackets.h
+++ b/src/server/game/Server/Packets/TradePackets.h
@@ -150,10 +150,6 @@ namespace WorldPackets
class TradeUpdated final : public ServerPacket
{
public:
- TradeUpdated() : ServerPacket(SMSG_TRADE_UPDATED) { }
-
- WorldPacket const* Write() override;
-
struct UnwrappedTradeItem
{
WorldPackets::Item::ItemInstance Item;
@@ -176,6 +172,10 @@ namespace WorldPackets
Optional<UnwrappedTradeItem> Unwrapped;
};
+ TradeUpdated() : ServerPacket(SMSG_TRADE_UPDATED, 8 + 4 + 1 + 4 + 7 * sizeof(UnwrappedTradeItem) + 4 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
uint64 Gold = 0;
uint32 CurrentStateIndex = 0;
uint8 WhichPlayer = 0;
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index a637e8f8966..b950525a672 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -41,6 +41,7 @@
#include "Packets/PetitionPackets.h"
#include "Packets/QueryPackets.h"
#include "Packets/QuestPackets.h"
+#include "Packets/ReferAFriendPackets.h"
#include "Packets/SocialPackets.h"
#include "Packets/TalentPackets.h"
#include "Packets/TradePackets.h"
@@ -144,7 +145,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(opcode, status, processing, WorldPacket, handler);
DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::AcceptGuildInvite, &WorldSession::HandleGuildAcceptInvite);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptGrantLevel );
+ DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel );
DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
@@ -400,7 +401,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_GM_TICKET_RESPONSE_RESOLVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketResponseResolve, &WorldSession::HandleGMResponseResolve);
DEFINE_HANDLER(CMSG_GM_TICKET_UPDATE_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketUpdateText, &WorldSession::HandleGMTicketUpdateTextOpcode);
DEFINE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::GossipSelectOption, &WorldSession::HandleGossipSelectOptionOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GRANT_LEVEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGrantLevel );
+ DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank);
DEFINE_HANDLER(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAssignMemberRank, &WorldSession::HandleGuildAssignRank);
@@ -1482,7 +1483,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1536,7 +1537,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_ITEM_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 9c2457e7b5e..ddd545ba68f 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -347,6 +347,12 @@ namespace WorldPackets
class QuestLogRemoveQuest;
}
+ namespace RaF
+ {
+ class AcceptLevelGrant;
+ class GrantLevel;
+ }
+
namespace Social
{
class AddFriend;
@@ -1296,8 +1302,8 @@ class WorldSession
void HandleGuildBankSetTabText(WorldPackets::Guild::GuildBankSetTabText& packet);
// Refer-a-Friend
- void HandleGrantLevel(WorldPacket& recvData);
- void HandleAcceptGrantLevel(WorldPacket& recvData);
+ void HandleGrantLevel(WorldPackets::RaF::GrantLevel& grantLevel);
+ void HandleAcceptGrantLevel(WorldPackets::RaF::AcceptLevelGrant& acceptLevelGrant);
// Calendar
void HandleCalendarGetCalendar(WorldPacket& recvData);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 00e0abfa922..bd0e023af0e 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -915,12 +915,12 @@ void World::LoadConfigSettings(bool reload)
}
m_int_configs[CONFIG_CURRENCY_CONQUEST_POINTS_ARENA_REWARD] *= 100; //precision mod
- m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("RecruitAFriend.MaxLevel", 60);
+ m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = sConfigMgr->GetIntDefault("RecruitAFriend.MaxLevel", 85);
if (m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
{
TC_LOG_ERROR("server.loading", "RecruitAFriend.MaxLevel (%i) must be in the range 0..MaxLevel(%u). Set to %u.",
- m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], 60);
- m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = 60;
+ m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], 85);
+ m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL] = 85;
}
m_int_configs[CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL_DIFFERENCE] = sConfigMgr->GetIntDefault("RecruitAFriend.MaxDifference", 4);