상속: WoWClassic.Common.Network.Connection
        public static bool HandleAuthSession(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_AUTH_SESSION>(br);

            // TODO: verify build

            client.Crypt = new AuthCrypt(LoginService.GetSessionKey(pkt.Account));

            var serverDigest = HashUtil.ComputeHash(Encoding.ASCII.GetBytes(pkt.Account),
                new byte[] { 0, 0, 0, 0 },
                BitConverter.GetBytes(pkt.ClientSeed),
                BitConverter.GetBytes(client.Seed),
                client.Crypt.SessionKey);
            if (!serverDigest.SequenceEqual(pkt.ClientDigest))
                return false;

            // TODO: Move to LoginService?
            using (var db = new DBLogin())
            {
                var acc = db.Account.FirstOrDefault(a => a.Username == pkt.Account);
                client.AccountName = acc.Username;
                client.AccountID = acc.AccountID;
            }

            client.SendPacket(WorldOpcodes.SMSG_AUTH_RESPONSE, PacketHelper.Build(new SMSG_AUTH_RESPONSE
            {
                Response = (byte)ResponseCodes.AUTH_OK,
                BillingTimeRemaining = 0,
                BillingPlanFlags = 0,
                BillingTimeRested = 0
            }));

            return true;
        }
예제 #2
0
        public static bool HandlePing(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_PING>(br);

            // TODO: implement ping checks

            client.SendPacket(WorldOpcodes.SMSG_PONG, PacketHelper.Build(new SMSG_PONG {
                Ping = pkt.Ping
            }));
            return(true);
        }
예제 #3
0
        public static bool HandleCharCreate(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_CREATE>(br);

            pkt.Name = pkt.Name.UppercaseFirst();

            using (var db = new DBGateway())
            {
                // TODO: If PvP-server, make sure same-faction
                // TODO: Check for reserved names

                // Check if name already is taken
                if (db.Character.Count(c => c.Name == pkt.Name) > 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE {
                        Code = CharacterCreationCode.NameInUse
                    }));
                    return(true);
                }

                db.Insert(new Character
                {
                    AccountID = client.AccountID,

                    Name       = pkt.Name,
                    Race       = (byte)pkt.Race,
                    Class      = (byte)pkt.Class,
                    Gender     = (byte)pkt.Gender,
                    Skin       = pkt.Skin,
                    Face       = pkt.Face,
                    HairStyle  = pkt.HairStyle,
                    HairColor  = pkt.HairColor,
                    FacialHair = pkt.FacialHair,

                    Level = 1,
                    // TODO: Get spawn information based on race
                    Zone = 12,
                    Map  = 0,
                    X    = -8954.42f,
                    Y    = -158.558f,
                    Z    = 81.8225f,

                    GuildId        = 0,     // New characters don't have guilds!
                    CharacterFlags = 0,
                    FirstLogin     = false, //TODO: set true
                });
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE {
                Code = CharacterCreationCode.Success
            }));
            return(true);
        }
예제 #4
0
        public static bool HandlePlayerLogin(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_PLAYER_LOGIN>(br);

            // TODO:
            // - Figure out where this character spawns
            // - Put it in the correct world
            client.CharacterGUID = pkt.GUID;
            // Map guid to object for easy lookup
            client.GatewaySrv.WorldGatewayServer.GUIDClientMap.Add(client.CharacterGUID, client);

            return(false); // Return false so world server also receives this packet, however, beforehand world server needs to know who it is
        }
 public void SendWorldPacket(GatewayConnection connection, byte[] data)
 {
     WorldGatewayConnection worldServer;
     if (!WorldGatewayServer.ClientConnectionMap.TryGetValue(connection, out worldServer))
     {
         if (WorldGatewayServer.Connections.Count == 0)
             throw new Exception("We have client connections, but no world servers");
         worldServer = WorldGatewayServer.Connections.Cast<WorldGatewayConnection>().FirstOrDefault();
         if (worldServer == null)
             throw new Exception("Can't find suitable world server for client");
         WorldGatewayServer.ClientConnectionMap[connection] = worldServer;
     }
     worldServer.Send(data);
 }
예제 #6
0
        public static bool HandleCharDelete(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_DELETE>(br);

            using (var db = new DBGateway())
            {
                db.Character.Delete(c => c.CharacterID == pkt.GUID);
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_DELETE, PacketHelper.Build(new SMSG_CHAR_DELETE {
                Code = CharacterDeleteCode.Success
            }));

            return(true);
        }
        public static bool HandleCharCreate(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_CHAR_CREATE>(br);
            pkt.Name = pkt.Name.UppercaseFirst();

            using (var db = new DBGateway())
            {
                // TODO: If PvP-server, make sure same-faction
                // TODO: Check for reserved names

                // Check if name already is taken
                if (db.Character.Count(c => c.Name == pkt.Name) > 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE { Code = CharacterCreationCode.NameInUse }));
                    return true;
                }

                db.Insert(new Character
                {
                    AccountID = client.AccountID,

                    Name = pkt.Name,
                    Race = (byte)pkt.Race,
                    Class = (byte)pkt.Class,
                    Gender = (byte)pkt.Gender,
                    Skin = pkt.Skin,
                    Face = pkt.Face,
                    HairStyle = pkt.HairStyle,
                    HairColor = pkt.HairColor,
                    FacialHair = pkt.FacialHair,

                    Level = 1,
                    // TODO: Get spawn information based on race
                    Zone = 12,
                    Map = 0,
                    X = -8954.42f,
                    Y = -158.558f,
                    Z = 81.8225f,

                    GuildId = 0, // New characters don't have guilds!
                    CharacterFlags = 0,
                    FirstLogin = false, //TODO: set true
                });
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_CREATE, PacketHelper.Build(new SMSG_CHAR_CREATE { Code = CharacterCreationCode.Success }));
            return true;
        }
예제 #8
0
        public void SendWorldPacket(GatewayConnection connection, byte[] data)
        {
            WorldGatewayConnection worldServer;

            if (!WorldGatewayServer.ClientConnectionMap.TryGetValue(connection, out worldServer))
            {
                if (WorldGatewayServer.Connections.Count == 0)
                {
                    throw new Exception("We have client connections, but no world servers");
                }
                worldServer = WorldGatewayServer.Connections.Cast <WorldGatewayConnection>().FirstOrDefault();
                if (worldServer == null)
                {
                    throw new Exception("Can't find suitable world server for client");
                }
                WorldGatewayServer.ClientConnectionMap[connection] = worldServer;
            }
            worldServer.Send(data);
        }
예제 #9
0
        public static bool HandleAuthSession(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_AUTH_SESSION>(br);

            // TODO: verify build

            client.Crypt = new AuthCrypt(LoginService.GetSessionKey(pkt.Account));

            var serverDigest = HashUtil.ComputeHash(Encoding.ASCII.GetBytes(pkt.Account),
                                                    new byte[] { 0, 0, 0, 0 },
                                                    BitConverter.GetBytes(pkt.ClientSeed),
                                                    BitConverter.GetBytes(client.Seed),
                                                    client.Crypt.SessionKey);

            if (!serverDigest.SequenceEqual(pkt.ClientDigest))
            {
                return(false);
            }

            // TODO: Move to LoginService?
            using (var db = new DBLogin())
            {
                var acc = db.Account.FirstOrDefault(a => a.Username == pkt.Account);
                client.AccountName = acc.Username;
                client.AccountID   = acc.AccountID;
            }

            client.SendPacket(WorldOpcodes.SMSG_AUTH_RESPONSE, PacketHelper.Build(new SMSG_AUTH_RESPONSE
            {
                Response             = (byte)ResponseCodes.AUTH_OK,
                BillingTimeRemaining = 0,
                BillingPlanFlags     = 0,
                BillingTimeRested    = 0
            }));

            return(true);
        }
예제 #10
0
        public static bool HandleCharEnum(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse <CMSG_CHAR_ENUM>(br);

            // TODO: Move to gateway service?

            using (var db = new DBGateway())
            {
                var dbCharacters = db.Character.Where(c => c.AccountID == client.AccountID);
                if (dbCharacters.Count() == 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM {
                        Length = 0
                    }));
                    return(true);
                }

                var characters = new List <CharEnumEntry>();
                foreach (var character in dbCharacters)
                {
                    var gameChar = new CharEnumEntry
                    {
                        GUID = character.CharacterID,

                        Name       = character.Name,
                        Race       = (WoWRace)character.Race,
                        Class      = (WoWClass)character.Class,
                        Gender     = (WoWGender)character.Gender,
                        Skin       = character.Skin,
                        Face       = character.Face,
                        HairStyle  = character.HairStyle,
                        HairColor  = character.HairColor,
                        FacialHair = character.FacialHair,

                        Level = character.Level,
                        Zone  = character.Zone,
                        Map   = character.Zone,
                        X     = character.X,
                        Y     = character.Y,
                        Z     = character.Z,

                        GuildId        = character.GuildId,
                        CharacterFlags = character.CharacterFlags,
                        FirstLogin     = (byte)(character.FirstLogin ? 1 : 0),

                        // TODO: Get rest from database
                        PetDisplayId = 0,
                        PetLevel     = 0,
                        PetFamily    = 0,

                        Equipment             = new CharEnumEquipmentEntry[(int)WoWEquipSlot.Tabard + 1],
                        FirstBagDisplayId     = 0,
                        FirstBagInventoryType = 0,
                    };

                    for (int i = (int)WoWEquipSlot.Head; i < (int)WoWEquipSlot.Tabard + 1; i++)
                    {
                        gameChar.Equipment[i] = new CharEnumEquipmentEntry {
                            DisplayInfoId = 0, InventoryType = 0
                        }
                    }
                    ;

                    characters.Add(gameChar);
                }

                client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM
                {
                    Length     = (byte)characters.Count,
                    Characters = characters.ToArray(),
                }));
            }

            return(true);
        }
        public static bool HandlePlayerLogin(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_PLAYER_LOGIN>(br);
            // TODO:
            // - Figure out where this character spawns
            // - Put it in the correct world
            client.CharacterGUID = pkt.GUID;
            // Map guid to object for easy lookup
            client.GatewaySrv.WorldGatewayServer.GUIDClientMap.Add(client.CharacterGUID, client);

            return false; // Return false so world server also receives this packet, however, beforehand world server needs to know who it is
        }
        public static bool HandlePing(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_PING>(br);
            // TODO: implement ping checks

            client.SendPacket(WorldOpcodes.SMSG_PONG, PacketHelper.Build(new SMSG_PONG { Ping = pkt.Ping }));
            return true;
        }
        public static bool HandleCharEnum(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_CHAR_ENUM>(br);

            // TODO: Move to gateway service?

            using (var db = new DBGateway())
            {
                var dbCharacters = db.Character.Where(c => c.AccountID == client.AccountID);
                if (dbCharacters.Count() == 0)
                {
                    client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM { Length = 0 }));
                    return true;
                }

                var characters = new List<CharEnumEntry>();
                foreach (var character in dbCharacters)
                {
                    var gameChar = new CharEnumEntry
                    {
                        GUID = character.CharacterID,

                        Name = character.Name,
                        Race = (WoWRace)character.Race,
                        Class = (WoWClass)character.Class,
                        Gender = (WoWGender)character.Gender,
                        Skin = character.Skin,
                        Face = character.Face,
                        HairStyle = character.HairStyle,
                        HairColor = character.HairColor,
                        FacialHair = character.FacialHair,

                        Level = character.Level,
                        Zone = character.Zone,
                        Map = character.Zone,
                        X = character.X,
                        Y = character.Y,
                        Z = character.Z,

                        GuildId = character.GuildId,
                        CharacterFlags = character.CharacterFlags,
                        FirstLogin = (byte)(character.FirstLogin ? 1 : 0),

                        // TODO: Get rest from database
                        PetDisplayId = 0,
                        PetLevel = 0,
                        PetFamily = 0,

                        Equipment = new CharEnumEquipmentEntry[(int)WoWEquipSlot.Tabard + 1],
                        FirstBagDisplayId = 0,
                        FirstBagInventoryType = 0,
                    };

                    for (int i = (int)WoWEquipSlot.Head; i < (int)WoWEquipSlot.Tabard + 1; i++)
                        gameChar.Equipment[i] = new CharEnumEquipmentEntry { DisplayInfoId = 0, InventoryType = 0 };

                    characters.Add(gameChar);
                }

                client.SendPacket(WorldOpcodes.SMSG_CHAR_ENUM, PacketHelper.Build(new SMSG_CHAR_ENUM
                {
                    Length = (byte)characters.Count,
                    Characters = characters.ToArray(),
                }));
            }

            return true;
        }
        public static bool HandleCharDelete(GatewayConnection client, BinaryReader br)
        {
            var pkt = PacketHelper.Parse<CMSG_CHAR_DELETE>(br);

            using (var db = new DBGateway())
            {
                db.Character.Delete(c => c.CharacterID == pkt.GUID);
            }

            client.SendPacket(WorldOpcodes.SMSG_CHAR_DELETE, PacketHelper.Build(new SMSG_CHAR_DELETE { Code = CharacterDeleteCode.Success }));

            return true;
        }