diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-04-09 00:05:31 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-04-09 00:05:31 +0200 |
commit | 3e063be39987c4f02addca580cef775fa24506be (patch) | |
tree | 6b7cb014b8e672e1ec3619b036019b5da988fff2 | |
parent | e651dbec0ebb7e864c837741977f0412ec068281 (diff) |
Core/PacketIO: Reimplemented SMSG_SET_FORCED_REACTIONS as a response to client request instead of sending it automatically during map change
-rw-r--r-- | src/server/game/Battlegrounds/ArenaTeam.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Handlers/CharacterHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Reputation/ReputationMgr.cpp | 15 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ReputationPackets.cpp | 18 | ||||
-rw-r--r-- | src/server/game/Server/Packets/ReputationPackets.h | 29 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 6 |
9 files changed, 72 insertions, 14 deletions
diff --git a/src/server/game/Battlegrounds/ArenaTeam.cpp b/src/server/game/Battlegrounds/ArenaTeam.cpp index b0015bf80c1..d635b40badc 100644 --- a/src/server/game/Battlegrounds/ArenaTeam.cpp +++ b/src/server/game/Battlegrounds/ArenaTeam.cpp @@ -408,7 +408,7 @@ void ArenaTeam::NotifyStatsChanged() SendStats(player->GetSession()); } -void ArenaTeam::Inspect(WorldSession* session, ObjectGuid guid) +void ArenaTeam::Inspect(WorldSession* /*session*/, ObjectGuid guid) { ArenaTeamMember* member = GetMember(guid); if (!member) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index d491818a290..9d5c40b4601 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -22472,8 +22472,6 @@ void Player::SendInitialPacketsBeforeAddToMap() /// SMSG_INITIALIZE_FACTIONS m_reputationMgr->SendInitialReputations(); - /// SMSG_SET_FORCED_REACTIONS - m_reputationMgr->SendForceReactions(); /// SMSG_SETUP_CURRENCY SendCurrencies(); /// SMSG_EQUIPMENT_SET_LIST diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 557e31ce74a..906a209ff84 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1198,6 +1198,11 @@ void WorldSession::HandleSetFactionInactiveOpcode(WorldPacket& recvData) _player->GetReputationMgr().SetInactive(replistid, inactive != 0); } +void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation::RequestForcedReactions& /*requestForcedReactions*/) +{ + _player->GetReputationMgr().SendForceReactions(); +} + void WorldSession::HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet) { if (packet.ShowHelm) diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index a5288b274a4..a6971966026 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -406,7 +406,7 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet) DB2StorageBase const* store = sDB2Manager.GetStorage(packet.TableHash); if (!store) { - TC_LOG_ERROR("network", "CMSG_DB_QUERY_BULK: Received unknown hotfix type: %u", packet.TableHash); + TC_LOG_ERROR("network", "CMSG_DB_QUERY_BULK: %s requested unsupported unknown hotfix type: %u", GetPlayerInfo().c_str(), packet.TableHash); return; } @@ -423,7 +423,7 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet) } else { - TC_LOG_ERROR("network", "CMSG_DB_QUERY_BULK: Entry %u does not exist in datastore: %u", rec.RecordID, packet.TableHash); + TC_LOG_TRACE("network", "CMSG_DB_QUERY_BULK: %s requested non-existing entry %u in datastore: %u", GetPlayerInfo().c_str(), rec.RecordID, packet.TableHash); response.RecordID = -int32(rec.RecordID); response.Timestamp = time(NULL); } diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp index d2fdc9b1da8..48f3bf79088 100644 --- a/src/server/game/Reputation/ReputationMgr.cpp +++ b/src/server/game/Reputation/ReputationMgr.cpp @@ -157,15 +157,18 @@ uint32 ReputationMgr::GetDefaultStateFlags(FactionEntry const* factionEntry) con void ReputationMgr::SendForceReactions() { - WorldPacket data; - data.Initialize(SMSG_SET_FORCED_REACTIONS, 4+_forcedReactions.size()*(4+4)); - data << uint32(_forcedReactions.size()); + WorldPackets::Reputation::SetForcedReactions setForcedReactions; + setForcedReactions.Reactions.resize(_forcedReactions.size()); + + std::size_t i = 0; for (ForcedReactions::const_iterator itr = _forcedReactions.begin(); itr != _forcedReactions.end(); ++itr) { - data << uint32(itr->first); // faction_id (Faction.dbc) - data << uint32(itr->second); // reputation rank + WorldPackets::Reputation::ForcedReaction& forcedReaction = setForcedReactions.Reactions[i++]; + forcedReaction.Faction = int32(itr->first); + forcedReaction.Reaction = int32(itr->second); } - _player->SendDirectMessage(&data); + + _player->SendDirectMessage(setForcedReactions.Write()); } void ReputationMgr::SendState(FactionState const* faction) diff --git a/src/server/game/Server/Packets/ReputationPackets.cpp b/src/server/game/Server/Packets/ReputationPackets.cpp index 8dce2936835..edcef8da40d 100644 --- a/src/server/game/Server/Packets/ReputationPackets.cpp +++ b/src/server/game/Server/Packets/ReputationPackets.cpp @@ -32,3 +32,21 @@ WorldPacket const* WorldPackets::Reputation::InitializeFactions::Write() return &_worldPacket; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Reputation::ForcedReaction const& forcedReaction) +{ + data << int32(forcedReaction.Faction); + data << int32(forcedReaction.Reaction); + return data; +} + +WorldPacket const* WorldPackets::Reputation::SetForcedReactions::Write() +{ + _worldPacket.WriteBits(Reactions.size(), 6); + for (ForcedReaction const& reaction : Reactions) + _worldPacket << reaction; + + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h index 578e6e35911..59245544c02 100644 --- a/src/server/game/Server/Packets/ReputationPackets.h +++ b/src/server/game/Server/Packets/ReputationPackets.h @@ -15,7 +15,8 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -#pragma once +#ifndef ReputationPackets_h__ +#define ReputationPackets_h__ #include "Packet.h" @@ -44,5 +45,31 @@ namespace WorldPackets bool FactionHasBonus[FactionCount]; ///< @todo: implement faction bonus uint8 FactionFlags[FactionCount]; ///< @see enum FactionFlags }; + + class RequestForcedReactions final : public ClientPacket + { + public: + RequestForcedReactions(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_FORCED_REACTIONS, std::move(packet)) { } + + void Read() override { } + }; + + struct ForcedReaction + { + int32 Faction = 0; + int32 Reaction = 0; + }; + + class SetForcedReactions final : public ServerPacket + { + public: + SetForcedReactions() : ServerPacket(SMSG_SET_FORCED_REACTIONS) { } + + WorldPacket const* Write() override; + + std::vector<ForcedReaction> Reactions; + }; } } + +#endif // ReputationPackets_h__ diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index cd33bef7335..8b6836f04ab 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -43,6 +43,7 @@ #include "Packets/QueryPackets.h" #include "Packets/QuestPackets.h" #include "Packets/ReferAFriendPackets.h" +#include "Packets/ReputationPackets.h" #include "Packets/SocialPackets.h" #include "Packets/TalentPackets.h" #include "Packets/TradePackets.h" @@ -665,7 +666,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Spells::RequestCategoryCooldowns, &WorldSession::HandleRequestCategoryCooldowns); DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_FORCED_REACTIONS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Reputation::RequestForcedReactions, &WorldSession::HandleRequestForcedReactionsOpcode); DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::RequestGuildPartyState, &WorldSession::HandleGuildRequestPartyState); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); @@ -1608,7 +1609,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LFG_TIME_WALKER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index faf5edfbe73..27d64da7137 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -362,6 +362,11 @@ namespace WorldPackets class GrantLevel; } + namespace Reputation + { + class RequestForcedReactions; + } + namespace Social { class AddFriend; @@ -940,6 +945,7 @@ class WorldSession void HandleSetFactionCheat(WorldPacket& recvData); void HandleSetWatchedFactionOpcode(WorldPacket& recvData); void HandleSetFactionInactiveOpcode(WorldPacket& recvData); + void HandleRequestForcedReactionsOpcode(WorldPackets::Reputation::RequestForcedReactions& requestForcedReactions); void HandleUpdateAccountData(WorldPackets::ClientConfig::UserClientUpdateAccountData& packet); void HandleRequestAccountData(WorldPackets::ClientConfig::RequestAccountData& request); |