public static void WhoListRequest(RealmClient client, RealmPacketIn packet) { WhoSearch search = new WhoSearch(); search.MaxResultCount = MAX_RESULT_COUNT; search.Faction = client.ActiveCharacter.Faction.Group; search.MinLevel = (byte)packet.ReadUInt32(); search.MaxLevel = (byte)packet.ReadUInt32(); search.Name = packet.ReadString(); byte unkown1 = packet.ReadByte(); uint unkown2 = packet.ReadUInt32(); uint unkown3 = packet.ReadUInt32(); uint zoneCount = packet.ReadUInt32(); if (zoneCount > 0 && zoneCount <= 10) { for (int i = 0; i < zoneCount; i++) search.Zones.Add((ZoneId)packet.ReadUInt32()); } uint nameCount = packet.ReadUInt32(); if (nameCount > 0 && nameCount <= 10) { for (int i = 0; i < nameCount; i++) search.Names.Add(packet.ReadString().ToLower()); } uint totalMatches; //Performs the search and retrieves matching characters List<Character> characters = search.RetrieveMatchedCharacters(out totalMatches); //Send the character list to the client SendWhoList(client, characters, totalMatches); }
public static void AuthSessionRequest(RealmClient client, RealmPacketIn packet) { packet.SkipBytes(8); string accName = packet.ReadString(); uint clientSeed = packet.ReadUInt32(); BigInteger clientDigest = packet.ReadBigInteger(20); AuthenticationInfo authInfo; SecureRemotePassword srp; AuthenticationErrorCodes errorCode = AuthenticationErrorCodes.AuthFailed; client.Account = new Account(client, accName); if (!client.Account.Initialize()) { errorCode = AuthenticationErrorCodes.UnknownAccount; goto sendErrorReply; } if (client.Server.RequestAuthenticationInfo(accName, out authInfo)) { srp = new SecureRemotePassword(accName, authInfo.Verifier, new BigInteger(authInfo.Salt, 32)); client.Account.SessionKey = authInfo.SessionKey; client.SystemInfo = SystemInformation.Deserialize(authInfo.SystemInformation); } else { goto sendErrorReply; } BigInteger clientVerifier = srp.Hash(srp.Username, new byte[4], clientSeed, client.Server.AuthSeed, client.Account.SessionKey); client.IsEncrypted = true; // all packets from here on are encrypted, including the AuthSessionReplys if (clientVerifier == clientDigest) { AddonHandler.ReadAddOns(client, packet); client.Server.LoginAccount(client.Account.Username); if (AuthQueue.QueuedClients > 0 || client.Server.NumberOfClients > client.Server.Config.ServerCapacity) { AuthQueue.EnqueueClient(client); return; } SendAuthSessionSuccess(client); return; } else { goto sendErrorReply; } sendErrorReply: SendAuthSessionErrorReply(client, errorCode); client.Disconnect(); }
public static void CreatureNameQueryRequest(RealmClient client, RealmPacketIn packet) { uint creatureEntry = packet.ReadUInt32(); EntityId creatureEntityId = packet.ReadEntityId(); var npc = WorldMgr.GetObject(creatureEntityId) as NPC; if (npc != null) { var entry = npc.Entry; var name = entry.Name; var title = entry.Title; var info = entry.Info; using (RealmPacketOut pkt = new RealmPacketOut(RealmServerOpCode.SMSG_CREATURE_QUERY_RESPONSE, 5 + 4 + 1 + 36 + 2 + name.Length + title.Length)) { pkt.WriteUInt(creatureEntry); pkt.Write(name); pkt.WriteByte(0); // Name2 pkt.WriteByte(0); // Name3 pkt.WriteByte(0); // Name4 pkt.WriteCString(title); //pkt.WriteCString(info); pkt.WriteUInt(entry.Flags); pkt.Write((uint)entry.Type); pkt.WriteUInt(entry.Family); pkt.Write((uint)entry.Rank); pkt.WriteUInt(entry.UInt1); pkt.WriteUInt(entry.SpellDataId); pkt.WriteUInt(npc.DisplayId); pkt.Write(entry.Float1); pkt.Write(entry.Float2); pkt.WriteByte(0); pkt.WriteByte(entry.IsLeader); client.Send(pkt); } } }
public static void HandleZoneUpdate(RealmClient client, RealmPacketIn packet) { ZoneId newZoneId = (ZoneId)packet.ReadUInt32(); ZoneId oldZoneId = client.ActiveCharacter.CurrentZone.ID; if (oldZoneId != newZoneId) { Zone newZone = WorldMgr.GetZone(newZoneId); if (newZone != null) { client.ActiveCharacter.CurrentZone = newZone; Channel.UpdatePlayerChannels(client.ActiveCharacter, oldZoneId); } } }
public static void PingRequest(RealmClient client, RealmPacketIn packet) { SendPingReply(client, packet.ReadUInt32()); client.Latency = packet.ReadUInt32(); }