aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/AuthHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/AuthHandler.cpp')
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp72
1 files changed, 59 insertions, 13 deletions
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index 5fafeea9991..6ffe0b7f024 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -15,33 +15,79 @@
* with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "ObjectMgr.h"
#include "Opcodes.h"
#include "WorldSession.h"
#include "WorldPacket.h"
void WorldSession::SendAuthResponse(uint8 code, bool queued, uint32 queuePos)
{
+ ExpansionRequirementContainer const& raceExpansions = sObjectMgr->GetRaceExpansionRequirements();
+ ExpansionRequirementContainer const& classExpansions = sObjectMgr->GetClassExpansionRequirements();
+
+ std::list<uint32> realmsToSend;
+ // Send current home realm. Also there is no need to send it later in realm queries.
+ realmsToSend.push_back(realmHandle.Index);
+
WorldPacket packet(SMSG_AUTH_RESPONSE, 1 /*bits*/ + 4 + 1 + 4 + 1 + 4 + 1 + 1 + (queued ? 4 : 0));
+ packet << uint8(code);
+ packet.WriteBit(code == AUTH_OK);
packet.WriteBit(queued);
- if (queued)
- packet.WriteBit(0);
- packet.WriteBit(1); // has account info
+ if (code == AUTH_OK)
+ {
+ packet << uint32(realmHandle.Index);
+ packet << uint32(realmsToSend.size()); // RealmNamesCount
+ packet << uint32(0); // BillingTimeRemaining
+ packet << uint32(0); // BillingPlanFlags
+ packet << uint32(0); // BillingTimeRested
+ packet << uint8(Expansion()); // ActiveExpansion
+ packet << uint8(Expansion()); // AccountExpansion
+ packet << uint32(0); // TimeSecondsUntilPCKick
+ packet << uint32(raceExpansions.size()); // Races
+ packet << uint32(classExpansions.size()); // Classes
+ packet << uint32(0); // Templates
+ packet << uint32(0); // AccountCurrency (probably for ingame shop)
- packet.FlushBits();
+ for (auto realm : realmsToSend)
+ {
+ std::string realmName = sObjectMgr->GetRealmName(realm);
- // account info
- packet << uint32(0); // BillingTimeRemaining
- packet << uint8(Expansion()); // 0 - normal, 1 - TBC, 2 - WOTLK, 3 - CATA; must be set in database manually for each account
- packet << uint32(0);
- packet << uint8(Expansion()); // Unknown, these two show the same
- packet << uint32(0); // BillingTimeRested
- packet << uint8(0); // BillingPlanFlags
+ packet << uint32(realm); // realmID
+ packet.WriteBit(realm == realmHandle.Index);// IsHomeRealm
+ packet.WriteBit(0); // IsInternalRealm = guessed
+ packet.WriteBits(realmName.length(), 8);
+ packet.WriteBits(realmName.length(), 8);
+ packet.WriteString(realmName); // RealmNameActual
+ packet.WriteString(realmName); // RealmNameNormalized
+ }
+
+ for (auto raceExpansion : raceExpansions)
+ {
+ packet << uint8(raceExpansion.first); // Race
+ packet << uint8(raceExpansion.second); // RequiredExpansion
+ }
+
+ for (auto classExpansion : classExpansions)
+ {
+ packet << uint8(classExpansion.first); // Class
+ packet << uint8(classExpansion.second); // RequiredExpansion
+ }
+
+ packet.WriteBit(0); // Trial
+ packet.WriteBit(0); // ForceCharacterTemplate
+ packet.WriteBit(0); // NumPlayersHorde (uint16)
+ packet.WriteBit(0); // NumPlayersAlliance (uint16)
+ packet.WriteBit(0); // IsVeteranTrial
+ }
- packet << uint8(code);
if (queued)
- packet << uint32(queuePos); // Queue position
+ {
+ packet << uint32(queuePos); // Queue position
+ packet.WriteBit(0); // HasFCM
+ }
+ packet.FlushBits();
SendPacket(&packet);
}