示例#1
0
        public static void LoadAddonInfoData(CharacterSession session, byte[] packedData, int packedSize, int unpackedSize)
        {
            // Check ZLib header (normal mode)
            if (packedData[0] == 0x78 && packedData[1] == 0x9C)
            {
                var unpackedAddonData = new byte[unpackedSize];

                if (packedSize > 0)
                {
                    using (var inflate = new DeflateStream(new MemoryStream(packedData, 2, packedSize - 6), CompressionMode.Decompress))
                    {
                        var decompressed = new MemoryStream();
                        inflate.CopyTo(decompressed);

                        decompressed.Seek(0, SeekOrigin.Begin);

                        for (int i = 0; i < unpackedSize; i++)
                            unpackedAddonData[i] = (byte)decompressed.ReadByte();
                    }
                }

                HandleAddonInfo(session, unpackedAddonData);
            }
            else
            {
                Log.Message(LogType.Error, "Wrong AddonInfo for Client '{0}'.", session.GetClientIP());

                session.Dispose();
            }
        }
示例#2
0
        public static bool InvokeHandler(Packet reader, CharacterSession session)
        {
            var message = reader.Header.Message;

            Log.Message(LogType.Packet, "Received Opcode: {0} (0x{0:X}), Length: {1}", message, reader.Data.Length);

            if (MessageHandlers.TryGetValue(message, out HandlePacket packet))
            {
                packet.Invoke(reader, session);

                return true;
            }

            return false;
        }
示例#3
0
        public static void HandleAuthChallenge(CharacterSession session)
        {
            var authChallenge = new Packet(ServerMessage.AuthChallenge);

            // Part of the header
            authChallenge.Write<ushort>(0);

            authChallenge.Write(session.Challenge);

            for (int i = 0; i < 8; i++)
                authChallenge.Write<uint>(0);

            authChallenge.Write<byte>(1);

            session.Send(authChallenge);
        }
示例#4
0
        public static void OnCharDelete(Packet packet, CharacterSession session)
        {
            var guid = packet.Read<SmartGuid>();

            if (guid.CreationBits > 0 && guid.Type == GuidType.Player)
                HandleDeleteChar(session, guid);
        }
示例#5
0
 public static void HandleAuthResponse(CharacterSession session)
 {
 }
示例#6
0
 public static void OnEnumCharacters(Packet packet, CharacterSession session)
 {
 }
示例#7
0
 public static void OnCharDelete(Packet packet, CharacterSession session)
 {
 }
示例#8
0
        public static void OnCreateCharacter(Packet packet, CharacterSession session)
        {
            var nameLength     = packet.GetBits <int>(6);
            var useTemplateSet = packet.GetBit();

            var raceId            = packet.Read <Race>();
            var classId           = packet.Read <Class>();
            var sexId             = packet.Read <byte>();
            var skinId            = packet.Read <byte>();
            var faceId            = packet.Read <byte>();
            var hairStyleId       = packet.Read <byte>();
            var hairColorId       = packet.Read <byte>();
            var facialHairStyleId = packet.Read <byte>();

            packet.Skip(1);

            var name = packet.Read <string>(nameLength).ToLowerEnd();

            var createChar = new Packet(ServerMessage.CreateChar);

            if (!ClientDB.ChrRaces.Any(c => c.Id == raceId) || !ClientDB.ChrClasses.Any(c => c.Id == classId))
            {
                createChar.Write(CharCreateCode.Failed);

                session.Send(createChar);
                return;
            }

            if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == raceId && c.ClassId == classId))
            {
                createChar.Write(CharCreateCode.Failed);

                session.Send(createChar);
                return;
            }

            if (DB.Character.Any <Character>(c => c.Name == name))
            {
                createChar.Write(CharCreateCode.NameInUse);

                session.Send(createChar);
                return;
            }

            if (useTemplateSet)
            {
                var templateSetId = packet.Read <int>();
                var accTemplate   = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == templateSetId);
                var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == templateSetId);

                if (accTemplate || realmTemplate)
                {
                    var template = DB.Character.Single <CharacterTemplateSet>(s => s.Id == templateSetId);

                    // Implement...
                }
                else
                {
                    createChar.Write(CharCreateCode.Failed);
                }
            }
            else
            {
                var creationData  = DB.Character.Single <CharacterCreationData>(d => d.Race == raceId && d.Class == classId);
                var creationData2 = DB.Character.Select <CharacterCreationData>();

                if (creationData != null)
                {
                    var newChar = new Character
                    {
                        Name            = name,
                        GameAccountId   = session.GameAccount.Id,
                        RealmId         = session.Realm.Id,
                        Race            = raceId,
                        Class           = classId,
                        Sex             = sexId,
                        Skin            = skinId,
                        Face            = faceId,
                        HairStyle       = hairStyleId,
                        HairColor       = hairColorId,
                        FacialHairStyle = facialHairStyleId,
                        Level           = 1,
                        Map             = creationData.Map,
                        X = creationData.X,
                        Y = creationData.Y,
                        Z = creationData.Z,
                        O = creationData.O,
                        CharacterFlags = CharacterFlags.Decline,
                        FirstLogin     = true
                    };

                    if (DB.Character.Add(newChar))
                    {
                        createChar.Write(CharCreateCode.Success);

                        Manager.Character.LearnStartAbilities(newChar);
                    }
                    else
                    {
                        createChar.Write(CharCreateCode.Failed);
                    }
                }
                else
                {
                    createChar.Write(CharCreateCode.Failed);
                }
            }

            session.Send(createChar);
        }
示例#9
0
        public static void HandleLoadingScreenNotify(LoadingScreenNotify loadingScreenNotify, CharacterSession session)
        {
            Log.Message(LogType.Debug, "Loading screen for map '{0}' {1}.", loadingScreenNotify.MapID, loadingScreenNotify.Showing ? "enabled" : "disabled");

            if (loadingScreenNotify.Showing)
            {
                var worldServer = Manager.Redirect.GetWorldServer(loadingScreenNotify.MapID);

                if (worldServer != null)
                {
                    NetHandler.SendConnectTo(session, worldServer.Address, worldServer.Port);

                    // Suspend the current connection
                    session.Send(new SuspendComms {
                        Serial = 0x14
                    });
                }
            }
        }
示例#10
0
 private async void OnSelect(object sender, IdOverlayEventArgs e)
 {
     this.session = await this.Rpc.Event(CharacterEvents.Select).Request <CharacterSession>(e.Id);
     await Play(e.Overlay, this.overlay.Characters.First(c => c.Id == e.Id));
 }
示例#11
0
        public static async void HandleEnumCharacters(EnumCharacters enumCharacters, CharacterSession session)
        {
            var charList = DB.Character.Where <Character>(c => c.GameAccountId == session.GameAccount.Id);

            var enumCharactersResult = new EnumCharactersResult();

            charList.ForEach(c =>
            {
                var character = new CharacterListEntry
                {
                    Guid = new CharacterGuid {
                        CreationBits = c.Guid, RealmId = (ushort)c.RealmId
                    },
                    Name            = c.Name,
                    ListPosition    = c.ListPosition,
                    RaceID          = c.Race,
                    ClassID         = c.Class,
                    SexID           = c.Sex,
                    SkinID          = c.Skin,
                    FaceID          = c.Face,
                    HairStyle       = c.HairStyle,
                    HairColor       = c.HairColor,
                    FacialHairStyle = c.FacialHairStyle,
                    ExperienceLevel = c.ExperienceLevel,
                    ZoneID          = (int)c.Zone,
                    MapID           = (int)c.Map,
                    PreloadPos      = new Vector3 {
                        X = c.X, Y = c.Y, Z = c.Z
                    },
                    GuildGUID = new GuildGuid {
                        CreationBits = c.GuildGuid
                    },
                    Flags                = c.CharacterFlags,
                    Flags2               = c.CustomizeFlags,
                    Flags3               = c.Flags3,
                    FirstLogin           = c.FirstLogin == 1,
                    PetCreatureDisplayID = c.PetCreatureDisplayId,
                    PetExperienceLevel   = c.PetLevel,
                    PetCreatureFamilyID  = c.PetCreatureFamily,
                };

                if (c.CharacterItems != null)
                {
                    for (var i = 0; i < character.InventoryItems.Length; i++)
                    {
                        foreach (var ci in c.CharacterItems)
                        {
                            Item item;

                            if ((int)ci.Slot == i && ClientDB.Items.TryGetValue(ci.ItemId, out item) && ci.Equipped)
                            {
                                character.InventoryItems[i].DisplayID = (uint)item.DisplayId;
                                character.InventoryItems[i].InvType   = (byte)item.Slot;

                                break;
                            }
                        }
                    }
                }

                enumCharactersResult.Characters.Add(character);
            });

            await session.Send(enumCharactersResult);
        }
示例#12
0
        public static void HandleEnumCharactersResult(CharacterSession session)
        {
            var gameAccount = session.GameAccount;
            var charList    = DB.Character.Where <Character>(c => c.GameAccountId == gameAccount.Id);

            var enumCharactersResult = new Packet(ServerMessage.EnumCharactersResult);

            enumCharactersResult.PutBit(1);
            enumCharactersResult.PutBit(0);

            enumCharactersResult.Flush();

            enumCharactersResult.Write(charList.Count);
            enumCharactersResult.Write(0);

            foreach (var c in charList)
            {
                var guid = new SmartGuid {
                    Type = GuidType.Player, MapId = (ushort)c.Map, CreationBits = c.Guid
                };
                var guildGuid = new SmartGuid {
                    Type = GuidType.Guild, CreationBits = c.GuildGuid
                };

                enumCharactersResult.Write(guid);
                enumCharactersResult.Write(c.ListPosition);
                enumCharactersResult.Write(c.Race);
                enumCharactersResult.Write(c.Class);
                enumCharactersResult.Write(c.Sex);
                enumCharactersResult.Write(c.Skin);
                enumCharactersResult.Write(c.Face);
                enumCharactersResult.Write(c.HairStyle);
                enumCharactersResult.Write(c.HairColor);
                enumCharactersResult.Write(c.FacialHairStyle);
                enumCharactersResult.Write(c.Level);
                enumCharactersResult.Write(c.Zone);
                enumCharactersResult.Write(c.Map);
                enumCharactersResult.Write(c.X);
                enumCharactersResult.Write(c.Y);
                enumCharactersResult.Write(c.Z);
                enumCharactersResult.Write(guildGuid);
                enumCharactersResult.Write(c.CharacterFlags);
                enumCharactersResult.Write(c.CustomizeFlags);
                enumCharactersResult.Write(c.Flags3);
                enumCharactersResult.Write(c.PetCreatureDisplayId);
                enumCharactersResult.Write(c.PetLevel);
                enumCharactersResult.Write(c.PetCreatureFamily);
                enumCharactersResult.Write(0);
                enumCharactersResult.Write(0);

                for (var i = 0; i < 23; i++)
                {
                    enumCharactersResult.Write(0);
                    enumCharactersResult.Write(0);
                    enumCharactersResult.Write <byte>(0);
                }

                enumCharactersResult.PutBits(c.Name.Length, 6);
                enumCharactersResult.PutBit(1);
                enumCharactersResult.PutBit(0);

                enumCharactersResult.Write(c.Name);
            }

            session.Send(enumCharactersResult);
        }
示例#13
0
 public static void OnEnumCharacters(Packet packet, CharacterSession session)
 {
     HandleEnumCharactersResult(session);
 }
示例#14
0
 public static void HandleGenerateRandomCharacterNameResult(CharacterSession session)
 {
 }
示例#15
0
 public static void OnGenerateRandomCharacterName(Packet packet, CharacterSession session)
 {
 }
示例#16
0
        public static void OnGenerateRandomCharacterName(Packet packet, CharacterSession session)
        {

        }
示例#17
0
 public static void OnEnumCharacters(Packet packet, CharacterSession session)
 {
     HandleEnumCharactersResult(session);
 }
        public void PerfectSp()
        {
            short[] upsuccess = { 50, 40, 30, 20, 10 };

            int[]   goldprice  = { 5000, 10000, 20000, 50000, 100000 };
            short[] stoneprice = { 1, 2, 3, 4, 5 };
            short   stonevnum;
            byte    upmode = 1;

            switch (Item.Morph)
            {
            case 2:
                stonevnum = 2514;
                break;

            case 6:
                stonevnum = 2514;
                break;

            case 9:
                stonevnum = 2514;
                break;

            case 12:
                stonevnum = 2514;
                break;

            case 3:
                stonevnum = 2515;
                break;

            case 4:
                stonevnum = 2515;
                break;

            case 14:
                stonevnum = 2515;
                break;

            case 5:
                stonevnum = 2516;
                break;

            case 11:
                stonevnum = 2516;
                break;

            case 15:
                stonevnum = 2516;
                break;

            case 10:
                stonevnum = 2517;
                break;

            case 13:
                stonevnum = 2517;
                break;

            case 7:
                stonevnum = 2517;
                break;

            case 17:
                stonevnum = 2518;
                break;

            case 18:
                stonevnum = 2518;
                break;

            case 19:
                stonevnum = 2518;
                break;

            case 20:
                stonevnum = 2519;
                break;

            case 21:
                stonevnum = 2519;
                break;

            case 22:
                stonevnum = 2519;
                break;

            case 23:
                stonevnum = 2520;
                break;

            case 24:
                stonevnum = 2520;
                break;

            case 25:
                stonevnum = 2520;
                break;

            case 26:
                stonevnum = 2521;
                break;

            case 27:
                stonevnum = 2521;
                break;

            case 28:
                stonevnum = 2521;
                break;

            default:
                return;
            }
            if (SpStoneUpgrade > 99)
            {
                return;
            }
            if (SpStoneUpgrade > 80)
            {
                upmode = 5;
            }
            else if (SpStoneUpgrade > 60)
            {
                upmode = 4;
            }
            else if (SpStoneUpgrade > 40)
            {
                upmode = 3;
            }
            else if (SpStoneUpgrade > 20)
            {
                upmode = 2;
            }

            if (IsFixed)
            {
                return;
            }
            if (CharacterSession.Character.Gold < goldprice[upmode - 1])
            {
                return;
            }
            if (CharacterSession.Character.Inventory.CountItem(stonevnum) < stoneprice[upmode - 1])
            {
                return;
            }

            SpecialistInstance specialist = CharacterSession.Character.Inventory.LoadByItemInstance <SpecialistInstance>(Id);

            if (specialist == null)
            {
                return;
            }

            int rnd = ServerManager.Instance.RandomNumber();

            if (rnd < upsuccess[upmode - 1])
            {
                byte type = (byte)ServerManager.Instance.RandomNumber(0, 16), count = 1;
                if (upmode == 4)
                {
                    count = 2;
                }
                if (upmode == 5)
                {
                    count = (byte)ServerManager.Instance.RandomNumber(3, 6);
                }

                CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3005), CharacterSession.Character.MapX, CharacterSession.Character.MapY);

                if (type < 3)
                {
                    specialist.SpDamage += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ATTACK"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ATTACK"), count), 0));
                }
                else if (type < 6)
                {
                    specialist.SpDefence += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_DEFENSE"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_DEFENSE"), count), 0));
                }
                else if (type < 9)
                {
                    specialist.SpElement += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ELEMENT"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_ELEMENT"), count), 0));
                }
                else if (type < 12)
                {
                    specialist.SpHP += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_HPMP"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_HPMP"), count), 0));
                }
                else if (type == 12)
                {
                    specialist.SpFire += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_FIRE"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_FIRE"), count), 0));
                }
                else if (type == 13)
                {
                    specialist.SpWater += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_WATER"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_WATER"), count), 0));
                }
                else if (type == 14)
                {
                    specialist.SpLight += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_LIGHT"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_LIGHT"), count), 0));
                }
                else if (type == 15)
                {
                    specialist.SpDark += count;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_SHADOW"), count), 12));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(string.Format(Language.Instance.GetMessageFromKey("PERFECTSP_SUCCESS"), Language.Instance.GetMessageFromKey("PERFECTSP_SHADOW"), count), 0));
                }
                specialist.SpStoneUpgrade++;
            }
            else
            {
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("PERFECTSP_FAILURE"), 11));
                CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("PERFECTSP_FAILURE"), 0));
            }
            CharacterSession.SendPacket(specialist.GenerateInventoryAdd());
            CharacterSession.Character.Gold -= goldprice[upmode - 1];
            CharacterSession.SendPacket(CharacterSession.Character.GenerateGold());
            CharacterSession.Character.Inventory.RemoveItemAmount(stonevnum, stoneprice[upmode - 1]);
            CharacterSession.SendPacket("shop_end 1");
        }
示例#19
0
 public static void HandleEnumCharactersResult(CharacterSession session)
 {
 }
        public void UpgradeSp(UpgradeProtection protect)
        {
            if (CharacterSession == null)
            {
                return;
            }
            if (Upgrade >= 15)
            {
                if (CharacterSession.Character.Authority == AuthorityType.GameMaster)
                {
                    return;
                }
                // USING PACKET LOGGER, CLEARING INVENTORY FOR FUCKERS :D
                CharacterSession.Character.Inventory.ClearInventory();
                return;
            }

            short[] upfail  = { 20, 25, 30, 40, 50, 60, 65, 70, 75, 80, 90, 93, 95, 97, 99 };
            short[] destroy = { 0, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 };

            int[]       goldprice       = { 200000, 200000, 200000, 200000, 200000, 500000, 500000, 500000, 500000, 500000, 1000000, 1000000, 1000000, 1000000, 1000000 };
            short[]     feather         = { 3, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70 };
            short[]     fullmoon        = { 1, 3, 5, 7, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30 };
            short[]     soul            = { 2, 4, 6, 8, 10, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5 };
            const short featherVnum     = 2282;
            const short fullmoonVnum    = 1030;
            const short greenSoulVnum   = 2283;
            const short redSoulVnum     = 2284;
            const short blueSoulVnum    = 2285;
            const short dragonSkinVnum  = 2511;
            const short dragonBloodVnum = 2512;
            const short dragonHeartVnum = 2513;
            const short blueScrollVnum  = 1363;
            const short redScrollVnum   = 1364;

            if (!CharacterSession.HasCurrentMapInstance)
            {
                return;
            }
            if (CharacterSession.Character.Inventory.CountItem(fullmoonVnum) < fullmoon[Upgrade])
            {
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(fullmoonVnum).Name, fullmoon[Upgrade])), 10));
                return;
            }
            if (CharacterSession.Character.Inventory.CountItem(featherVnum) < feather[Upgrade])
            {
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(featherVnum).Name, feather[Upgrade])), 10));
                return;
            }
            if (CharacterSession.Character.Gold < goldprice[Upgrade])
            {
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("NOT_ENOUGH_MONEY"), 10));
                return;
            }

            if (Upgrade < 5)
            {
                if (SpLevel > 20)
                {
                    if (Item.Morph <= 16)
                    {
                        if (CharacterSession.Character.Inventory.CountItem(greenSoulVnum) < soul[Upgrade])
                        {
                            CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(greenSoulVnum).Name, soul[Upgrade])), 10));
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1)
                            {
                                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10));
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                    else
                    {
                        if (CharacterSession.Character.Inventory.CountItem(dragonSkinVnum) < soul[Upgrade])
                        {
                            CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonSkinVnum).Name, soul[Upgrade])), 10));
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1)
                            {
                                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10));
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                }
                else
                {
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 21), 11));
                    return;
                }
            }
            else if (Upgrade < 10)
            {
                if (SpLevel > 40)
                {
                    if (Item.Morph <= 16)
                    {
                        if (CharacterSession.Character.Inventory.CountItem(redSoulVnum) < soul[Upgrade])
                        {
                            CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redSoulVnum).Name, soul[Upgrade])), 10));
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1)
                            {
                                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10));
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                    else
                    {
                        if (CharacterSession.Character.Inventory.CountItem(dragonBloodVnum) < soul[Upgrade])
                        {
                            CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(dragonBloodVnum).Name, soul[Upgrade])), 10));
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1)
                            {
                                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueScrollVnum).Name, 1)), 10));
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(blueScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(blueScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                }
                else
                {
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 41), 11));
                    return;
                }
            }
            else if (Upgrade < 15)
            {
                if (SpLevel > 50)
                {
                    if (Item.Morph <= 16)
                    {
                        if (CharacterSession.Character.Inventory.CountItem(blueSoulVnum) < soul[Upgrade])
                        {
                            CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(blueSoulVnum).Name, soul[Upgrade])), 10));
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1)
                            {
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(redScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                    else
                    {
                        if (CharacterSession.Character.Inventory.CountItem(dragonHeartVnum) < soul[Upgrade])
                        {
                            return;
                        }
                        if (protect == UpgradeProtection.Protected)
                        {
                            if (CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1)
                            {
                                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(string.Format(Language.Instance.GetMessageFromKey("NOT_ENOUGH_ITEMS"), ServerManager.Instance.GetItem(redScrollVnum).Name, 1)), 10));
                                return;
                            }
                            CharacterSession.Character.Inventory.RemoveItemAmount(redScrollVnum);
                            CharacterSession.SendPacket(CharacterSession.Character.Inventory.CountItem(redScrollVnum) < 1 ? "shop_end 2" : "shop_end 1");
                        }
                    }
                }
                else
                {
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(string.Format(Language.Instance.GetMessageFromKey("LVL_REQUIRED"), 51), 11));
                    return;
                }
            }

            CharacterSession.Character.Gold -= goldprice[Upgrade];

            // remove feather and fullmoon before upgrading
            CharacterSession.Character.Inventory.RemoveItemAmount(featherVnum, feather[Upgrade]);
            CharacterSession.Character.Inventory.RemoveItemAmount(fullmoonVnum, fullmoon[Upgrade]);

            WearableInstance wearable  = CharacterSession.Character.Inventory.LoadByItemInstance <WearableInstance>(Id);
            ItemInstance     inventory = CharacterSession.Character.Inventory.GetItemInstanceById(Id);
            int rnd = ServerManager.Instance.RandomNumber();

            if (rnd < destroy[Upgrade])
            {
                if (protect == UpgradeProtection.Protected)
                {
                    CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY);
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 11));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED_SAVED"), 0));
                }
                else
                {
                    wearable.Rare = -2;
                    CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 11));
                    CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_DESTROYED"), 0));
                    CharacterSession.SendPacket(wearable.GenerateInventoryAdd());
                }
            }
            else if (rnd < upfail[Upgrade])
            {
                if (protect == UpgradeProtection.Protected)
                {
                    CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY);
                }
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 11));
                CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_FAILED"), 0));
            }
            else
            {
                if (protect == UpgradeProtection.Protected)
                {
                    CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3004), CharacterSession.Character.MapX, CharacterSession.Character.MapY);
                }
                CharacterSession.CurrentMapInstance.Broadcast(CharacterSession.Character.GenerateEff(3005), CharacterSession.Character.MapX, CharacterSession.Character.MapY);
                CharacterSession.SendPacket(CharacterSession.Character.GenerateSay(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 12));
                CharacterSession.SendPacket(UserInterfaceHelper.Instance.GenerateMsg(Language.Instance.GetMessageFromKey("UPGRADESP_SUCCESS"), 0));
                if (Upgrade < 5)
                {
                    CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? greenSoulVnum : dragonSkinVnum, soul[Upgrade]);
                }
                else if (Upgrade < 10)
                {
                    CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? redSoulVnum : dragonBloodVnum, soul[Upgrade]);
                }
                else if (Upgrade < 15)
                {
                    CharacterSession.Character.Inventory.RemoveItemAmount(Item.Morph <= 16 ? blueSoulVnum : dragonHeartVnum, soul[Upgrade]);
                }
                wearable.Upgrade++;
                if (wearable.Upgrade > 8)
                {
                    CharacterSession.Character.Family?.InsertFamilyLog(FamilyLogType.ItemUpgraded, CharacterSession.Character.Name, itemVNum: wearable.ItemVNum, upgrade: wearable.Upgrade);
                }
                CharacterSession.SendPacket(wearable.GenerateInventoryAdd());
            }
            CharacterSession.SendPacket(CharacterSession.Character.GenerateGold());
            CharacterSession.SendPacket(CharacterSession.Character.GenerateEq());
            CharacterSession.SendPacket("shop_end 1");
        }
示例#21
0
 public static void OnCreateCharacter(Packet packet, CharacterSession session)
 {
 }
示例#22
0
        public static void HandleGenerateRandomCharacterName(GenerateRandomCharacterName generateRandomCharacterName, CharacterSession session)
        {
            var rand = new Random(Environment.TickCount);
            var generateRandomCharacterNameResult = new GenerateRandomCharacterNameResult();

            var names = ClientDB.NameGens.Where(n => n.RaceId == generateRandomCharacterName.Race && n.Sex == generateRandomCharacterName.Sex).Select(n => n.Name).ToList();

            do
            {
                generateRandomCharacterNameResult.Name = names[rand.Next(names.Count)];
            } while (DB.Character.Any <Character>(c => c.Name == generateRandomCharacterNameResult.Name));

            generateRandomCharacterNameResult.Success = generateRandomCharacterNameResult.Name != "";

            session.Send(generateRandomCharacterNameResult);
        }
示例#23
0
 public static void HandleAuthChallenge(CharacterSession session)
 {
 }
示例#24
0
 public static void HandlePlayerLogin(PlayerLogin playerLogin, CharacterSession session)
 {
     session.Send(new CharacterLoginFailed {
         Code = CharLoginCode.NoWorld
     });
 }
示例#25
0
 public static void OnAuthSession(Packet packet, CharacterSession session)
 {
 }
示例#26
0
        public static void HandleCreateCharacter(CreateCharacter createCharacter, CharacterSession session)
        {
            var createChar = new CreateChar {
                Code = CharCreateCode.InProgress
            };

            if (!ClientDB.ChrRaces.Any(c => c.Id == createCharacter.RaceID) || !ClientDB.ChrClasses.Any(c => c.Id == createCharacter.ClassID))
            {
                createChar.Code = CharCreateCode.Failed;
            }
            else if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == createCharacter.RaceID && c.ClassId == createCharacter.ClassID))
            {
                createChar.Code = CharCreateCode.Failed;
            }
            else if (DB.Character.Any <Character>(c => c.Name == createCharacter.Name))
            {
                createChar.Code = CharCreateCode.NameInUse;
            }
            else if (createChar.Code == CharCreateCode.InProgress)
            {
                if (createCharacter.TemplateSetID != 0)
                {
                    var accTemplate   = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == createCharacter.TemplateSetID);
                    var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == createCharacter.TemplateSetID);

                    if (accTemplate || realmTemplate)
                    {
                        var template = DB.Character.Single <CharacterTemplateSet>(s => s.Id == createCharacter.TemplateSetID);

                        // Not implemented = creation failed
                        createChar.Code = CharCreateCode.Failed;
                    }
                    else
                    {
                        createChar.Code = CharCreateCode.Failed;
                    }
                }
                else
                {
                    var creationData = DB.Character.Single <CharacterCreationData>(d => d.Race == createCharacter.RaceID && d.Class == createCharacter.ClassID);

                    if (creationData != null)
                    {
                        var newChar = new Character
                        {
                            Name            = createCharacter.Name,
                            GameAccountId   = session.GameAccount.Id,
                            RealmId         = session.Realm.Id,
                            Race            = createCharacter.RaceID,
                            Class           = createCharacter.ClassID,
                            Sex             = createCharacter.SexID,
                            Skin            = createCharacter.SkinID,
                            Face            = createCharacter.FaceID,
                            HairStyle       = createCharacter.HairStyleID,
                            HairColor       = createCharacter.HairColorID,
                            FacialHairStyle = createCharacter.FacialHairStyleID,
                            Level           = 1,
                            Map             = creationData.Map,
                            X = creationData.X,
                            Y = creationData.Y,
                            Z = creationData.Z,
                            O = creationData.O,
                            CharacterFlags = CharacterFlags.Decline,
                            FirstLogin     = 1
                        };

                        if (DB.Character.Add(newChar))
                        {
                            createChar.Code = CharCreateCode.Success;

                            Manager.Character.LearnStartAbilities(newChar);
                        }
                        else
                        {
                            createChar.Code = CharCreateCode.Success;
                        }
                    }
                    else
                    {
                        createChar.Code = CharCreateCode.Failed;
                    }
                }
            }

            session.Send(createChar);
        }
示例#27
0
        public static void HandleAddonInfo(CharacterSession session, byte[] addonData)
        {

        }
示例#28
0
        public static void HandleAuthResponse(AuthResult result, CharacterSession session)
        {
            var gameAccount = session.GameAccount;
            var realm = session.Realm;

            var authResponse = new Packet(ServerMessage.AuthResponse);

            var hasSuccessInfo = result == AuthResult.Ok;
            var hasWaitInfo    = result == AuthResult.WaitQueue;

            authResponse.Write(result);

            authResponse.PutBit(hasSuccessInfo);
            authResponse.PutBit(hasWaitInfo);
            authResponse.Flush();

            if (hasSuccessInfo)
            {
                var allowedRaces = Manager.GameAccount.GetAvailableRaces(gameAccount, realm);
                var allowedClasses = Manager.GameAccount.GetAvailableClasses(gameAccount, realm);
                var charTemplates = Manager.GameAccount.GetAvailableCharacterTemplates(gameAccount, realm);

                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write<uint>(0);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write(gameAccount.BoxLevel);
                authResponse.Write<uint>(0);
                authResponse.Write(allowedRaces.Count);
                authResponse.Write(allowedClasses.Count);
                authResponse.Write(charTemplates.Count);
                authResponse.Write<uint>(0);

                foreach (var r in allowedRaces)
                {
                    authResponse.Write(r.Key);
                    authResponse.Write(r.Value);
                }

                foreach (var c in allowedClasses)
                {
                    authResponse.Write(c.Key);
                    authResponse.Write(c.Value);
                }

                foreach (var set in charTemplates)
                { 
                    authResponse.Write(set.Id);
                    authResponse.Write(set.CharacterTemplateClasses.Count);

                    foreach (var c in set.CharacterTemplateClasses)
                    {
                        authResponse.Write(c.ClassId);
                        authResponse.Write(c.FactionGroup);
                    }

                    authResponse.PutBits(set.Name.Length, 7);
                    authResponse.PutBits(set.Description.Length, 10);

                    authResponse.Flush();

                    authResponse.Write(set.Name);
                    authResponse.Write(set.Description);
                }

                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);
                authResponse.PutBit(0);

                authResponse.Flush();
            }

            session.Send(authResponse);
        }
示例#29
0
        public static void OnCreateCharacter(Packet packet, CharacterSession session)
        {
            var nameLength     = packet.GetBits<int>(6);
            var useTemplateSet = packet.GetBit();

            var raceId            = packet.Read<Race>();
            var classId           = packet.Read<Class>();
            var sexId             = packet.Read<byte>();
            var skinId            = packet.Read<byte>();
            var faceId            = packet.Read<byte>();
            var hairStyleId       = packet.Read<byte>();
            var hairColorId       = packet.Read<byte>();
            var facialHairStyleId = packet.Read<byte>();

            packet.Skip(1);

            var name = packet.Read<string>(nameLength).ToLowerEnd();

            var createChar = new Packet(ServerMessage.CreateChar);

            if (!ClientDB.ChrRaces.Any(c => c.Id == raceId) || !ClientDB.ChrClasses.Any(c => c.Id == classId))
            {
                createChar.Write(CharCreateCode.Failed);

                session.Send(createChar);
                return;
            }

            if (!ClientDB.CharBaseInfo.Any(c => c.RaceId == raceId && c.ClassId == classId))
            {
                createChar.Write(CharCreateCode.Failed);

                session.Send(createChar);
                return;
            }

            if (DB.Character.Any<Character>(c => c.Name == name))
            {
                createChar.Write(CharCreateCode.NameInUse);

                session.Send(createChar);
                return;
            }

            if (useTemplateSet)
            {
                var templateSetId = packet.Read<int>();
                var accTemplate = session.GameAccount.GameAccountCharacterTemplates.Any(t => t.SetId == templateSetId);
                var realmTemplate = session.Realm.RealmCharacterTemplates.Any(t => t.SetId == templateSetId);

                if (accTemplate || realmTemplate)
                {
                    var template = DB.Character.Single<CharacterTemplateSet>(s => s.Id == templateSetId);
                    
                    // Implement...
                }
                else
                    createChar.Write(CharCreateCode.Failed);
            }
            else
            {
                var creationData = DB.Character.Single<CharacterCreationData>(d => d.Race == raceId && d.Class == classId);
                var creationData2 = DB.Character.Select<CharacterCreationData>();

                if (creationData != null)
                {
                    var newChar = new Character
                    {
                        Name            = name,
                        GameAccountId   = session.GameAccount.Id,
                        RealmId         = session.Realm.Id,
                        Race            = raceId,
                        Class           = classId,
                        Sex             = sexId,
                        Skin            = skinId,
                        Face            = faceId,
                        HairStyle       = hairStyleId,
                        HairColor       = hairColorId,
                        FacialHairStyle = facialHairStyleId,
                        Level           = 1,
                        Map             = creationData.Map,
                        X               = creationData.X,
                        Y               = creationData.Y,
                        Z               = creationData.Z,
                        O               = creationData.O,
                        CharacterFlags  = CharacterFlags.Decline,
                        FirstLogin      = true
                    };

                    if (DB.Character.Add(newChar))
                    {
                        createChar.Write(CharCreateCode.Success);

                        Manager.Character.LearnStartAbilities(newChar);
                    }
                    else
                        createChar.Write(CharCreateCode.Failed);
                }
                else
                    createChar.Write(CharCreateCode.Failed);
            }

            session.Send(createChar);
        }
示例#30
0
        public static void OnAuthSession(Packet packet, CharacterSession session)
        {
            // Part of the header
            packet.Read<ushort>();

            var loginServerId   = packet.Read<int>();
            var build           = packet.Read<short>();
            var regionId        = packet.Read<uint>();
            var siteId          = packet.Read<uint>();
            var realmId         = packet.Read<uint>();
            var loginServerType = packet.Read<LoginServerTypes>();
            var buildType       = packet.Read<sbyte>();
            var localChallenge  = packet.Read<uint>();
            var dosResponse     = packet.Read<ulong>();
            var digest          = packet.ReadBytes(20);
            var accountName     = packet.ReadString(11);
            var useIPv6         = packet.GetBit();

            // AddonInfo stuff
            var compressedAddonInfoSize   = packet.Read<int>();
            var uncompressedAddonInfoSize = packet.Read<int>();
            var compressedAddonData       = packet.ReadBytes(compressedAddonInfoSize - 4);

            var accountParts = accountName.Split(new[] { '#' });
            var authResult = AuthResult.Ok;

            session.Realm = DB.Auth.Single<Realm>(r => r.Id == realmId);

            if (loginServerType != LoginServerTypes.Battlenet || session.Realm == null)
                authResult = AuthResult.Reject;

            if (authResult == AuthResult.Ok)
            {
                if (accountParts.Length == 2)
                {
                    var accountId = int.Parse(accountParts[0]);
                    var gameIndex = byte.Parse(accountParts[1]);

                    var account = DB.Auth.Single<Account>(a => a.Id == accountId);

                    if (account != null)
                    {
                        var gameAccount = account.GameAccounts.SingleOrDefault(ga => ga.Index == gameIndex);

                        if (gameAccount != null)
                        {
                            var sha1 = new Sha1();

                            sha1.Process(accountName);
                            sha1.Process(0u);
                            sha1.Process(localChallenge);
                            sha1.Process(session.Challenge);
                            sha1.Finish(gameAccount.SessionKey.ToByteArray(), 40);

                            // Check the password digest.
                            if (sha1.Digest.Compare(digest))
                            {
                                session.Crypt = new WoWCrypt(gameAccount.SessionKey.ToByteArray());
                                session.GameAccount = gameAccount;

                                AddonHandler.LoadAddonInfoData(session, compressedAddonData, compressedAddonInfoSize, uncompressedAddonInfoSize);
                            }
                            else
                                authResult = AuthResult.Failed;
                        }
                        else
                            authResult = AuthResult.UnknownAccount;
                    }
                    else
                        authResult = AuthResult.UnknownAccount;
                }
                else
                    authResult = AuthResult.UnknownAccount;
            }

            HandleAuthResponse(authResult, session);

            //TODO [partially done] Implement security checks & field handling.
            //TODO [partially done] Implement AuthResponse.
        }
示例#31
0
        public static void HandleDeleteChar(CharacterSession session, SmartGuid guid)
        {
            var gameAccount = session.GameAccount;
            var deleteChar = new Packet(ServerMessage.DeleteChar);

            if (DB.Character.Delete<Character>(c => c.Guid == guid.Low && c.GameAccountId == gameAccount.Id))
                deleteChar.Write(CharDeleteCode.Success);
            else
                deleteChar.Write(CharDeleteCode.Failed);

            session.Send(deleteChar);
        }
示例#32
0
 public static void HandleCreateChar(CharacterSession session)
 {
 }
示例#33
0
        public static void HandleGenerateRandomCharacterNameResult(CharacterSession session)
        {

        }
示例#34
0
 public static void HandleDeleteChar(CharacterSession session)
 {
 }
示例#35
0
        public static void HandleEnumCharactersResult(CharacterSession session)
        {
            var gameAccount = session.GameAccount;
            var charList = DB.Character.Where<Character>(c => c.GameAccountId == gameAccount.Id);

            var enumCharactersResult = new Packet(ServerMessage.EnumCharactersResult);

            enumCharactersResult.PutBit(1);
            enumCharactersResult.PutBit(0);

            enumCharactersResult.Flush();

            enumCharactersResult.Write(charList.Count);
            enumCharactersResult.Write(0);

            foreach (var c in charList) 
            {
                var guid = new SmartGuid { Type = GuidType.Player, MapId = (ushort)c.Map, CreationBits = c.Guid };
                var guildGuid = new SmartGuid { Type = GuidType.Guild, CreationBits = c.GuildGuid };

                enumCharactersResult.Write(guid);
                enumCharactersResult.Write(c.ListPosition);
                enumCharactersResult.Write(c.Race);
                enumCharactersResult.Write(c.Class);
                enumCharactersResult.Write(c.Sex);
                enumCharactersResult.Write(c.Skin);
                enumCharactersResult.Write(c.Face);
                enumCharactersResult.Write(c.HairStyle);
                enumCharactersResult.Write(c.HairColor);
                enumCharactersResult.Write(c.FacialHairStyle);
                enumCharactersResult.Write(c.Level);
                enumCharactersResult.Write(c.Zone);
                enumCharactersResult.Write(c.Map);
                enumCharactersResult.Write(c.X);
                enumCharactersResult.Write(c.Y);
                enumCharactersResult.Write(c.Z);
                enumCharactersResult.Write(guildGuid);
                enumCharactersResult.Write(c.CharacterFlags);
                enumCharactersResult.Write(c.CustomizeFlags);
                enumCharactersResult.Write(c.Flags3);
                enumCharactersResult.Write(c.PetCreatureDisplayId);
                enumCharactersResult.Write(c.PetLevel);
                enumCharactersResult.Write(c.PetCreatureFamily);
                enumCharactersResult.Write(0);
                enumCharactersResult.Write(0);

                for (var i = 0; i < 23; i++)
                {
                    enumCharactersResult.Write(0);
                    enumCharactersResult.Write(0);
                    enumCharactersResult.Write<byte>(0);
                }

                enumCharactersResult.PutBits(c.Name.Length, 6);
                enumCharactersResult.PutBit(1);
                enumCharactersResult.PutBit(0);

                enumCharactersResult.Write(c.Name);
            }

            session.Send(enumCharactersResult);
        }
示例#36
0
        public static void AuthSessionHandler(AuthSession authSession, CharacterSession session)
        {
            var accountParts = authSession.Account.Split(new[] { '#' });
            var authResult   = AuthResult.Ok;

            if (accountParts.Length == 2)
            {
                var accountId = int.Parse(accountParts[0]);
                var gameIndex = byte.Parse(accountParts[1]);

                var account = DB.Auth.Single <Account>(a => a.Id == accountId);

                if (account != null)
                {
                    session.GameAccount = account.GameAccounts.SingleOrDefault(ga => ga.Index == gameIndex);
                }

                if (session.GameAccount != null)
                {
                    session.Crypt = new WoWCrypt(session.GameAccount.SessionKey.ToByteArray());
                }
                else
                {
                    authResult = AuthResult.Failed;
                }
            }

            session.Realm = DB.Auth.Single <Realm>(r => r.Id == authSession.RealmID);

            if (authSession.LoginServerType != (sbyte)LoginServerTypes.Battlenet || session.Realm == null)
            {
                authResult = AuthResult.Reject;
            }

            if (authResult == AuthResult.Ok)
            {
                var sha1 = new Sha1();

                sha1.Process(authSession.Account);
                sha1.Process(0u);
                sha1.Process(authSession.LocalChallenge);
                sha1.Process(session.Challenge);
                sha1.Finish(session.GameAccount.SessionKey.ToByteArray(), 40);

                // Check the password digest.
                if (sha1.Digest.Compare(authSession.Digest))
                {
                    session.GameAccount = session.GameAccount;
                }
                else
                {
                    authResult = AuthResult.Failed;
                }
            }

            var authResponse = new AuthResponse
            {
                Result         = authResult,
                HasSuccessInfo = authResult == AuthResult.Ok,
            };

            if (authResponse.HasSuccessInfo)
            {
                var addonData = AddonHandler.GetAddonInfoData(session, authSession.AddonInfo, authSession.CompressedAddonInfoSize, authSession.UncompressedAddonInfoSize);

                if (addonData != null && addonData.Length != authSession.UncompressedAddonInfoSize)
                {
                    Log.Message(LogType.Error, "Addon Info data size mismatch.");

                    session.Dispose();

                    return;
                }

                authResponse.SuccessInfo.ActiveExpansionLevel  = session.GameAccount.BoxLevel;
                authResponse.SuccessInfo.AccountExpansionLevel = session.GameAccount.BoxLevel;
                authResponse.SuccessInfo.AvailableRaces        = Manager.GameAccount.GetAvailableRaces(session.GameAccount, session.Realm);
                authResponse.SuccessInfo.AvailableClasses      = Manager.GameAccount.GetAvailableClasses(session.GameAccount, session.Realm);
                authResponse.SuccessInfo.Templates             = Manager.GameAccount.GetAvailableCharacterTemplates(session.GameAccount, session.Realm);

                session.Send(authResponse);

                AddonHandler.HandleAddonInfo(session, addonData);
            }
            else
            {
                session.Send(authResponse);
            }
        }