예제 #1
0
        public async Task ModifyInventory(Action <ModifyInventoryContext> action = null, bool exclRequest = false)
        {
            var context  = new ModifyInventoryContext(Character);
            var equipped = Character.GetInventory(ItemInventoryType.Equip).Items
                           .Where(i => i.Position < 0)
                           .Select(i => i.TemplateID)
                           .ToList();

            action?.Invoke(context);
            using (var p = new Packet(SendPacketOperations.InventoryOperation))
            {
                p.Encode <bool>(exclRequest);
                context.Encode(p);
                p.Encode <bool>(false);
                await SendPacket(p);
            }

            var newEquippedItems = Character.GetInventory(ItemInventoryType.Equip).Items
                                   .Where(i => i.Position < 0)
                                   .ToList();
            var newEquipped = newEquippedItems
                              .Select(i => i.TemplateID)
                              .ToList();

            if (equipped.Except(newEquipped).Any() ||
                newEquipped.Except(equipped).Any())
            {
                ValidateStat();
                AvatarModified();
            }
        }
예제 #2
0
        private async Task OnMoveStoL(IPacket packet)
        {
            var id          = packet.Decode <long>();
            var inventories = Character.Inventories;

            var item = inventories
                       .SelectMany(i => i.Items)
                       .FirstOrDefault(i => i.CashItemSN == id);

            if (item?.CashItemSN == null)
            {
                return;
            }
            var context = new ModifyInventoryContext(Character);

            var locker = Character.Data.Locker;

            if (locker.Items.Count >= locker.SlotMax)
            {
                return;
            }
            context.Remove(item);
            locker.Items.Add(item);
            using (var p = new Packet(SendPacketOperations.CashShopCashItemResult))
            {
                p.Encode <byte>((byte)CashItemResult.MoveStoL_Done);
                item.EncodeLocker(p);
                await SendPacket(p);
            }
        }
예제 #3
0
        private async Task OnMoveLtoS(IPacket packet)
        {
            var sn     = packet.Decode <long>();
            var locker = Character.Data.Locker;

            var item = locker.Items.FirstOrDefault(i => i.CashItemSN == sn);

            if (item == null)
            {
                return;
            }

            var context = new ModifyInventoryContext(Character);

            if (!Character.HasSlotFor(item))
            {
                return;
            }
            item.ID         = 0;
            item.ItemLocker = null;
            locker.Items.Remove(item);
            context.Add(item);
            using (var p = new Packet(SendPacketOperations.CashShopCashItemResult))
            {
                p.Encode <byte>((byte)CashItemResult.MoveLtoS_Done);
                p.Encode <short>(item.Position);
                item.Encode(p);
                await SendPacket(p);
            }
        }
예제 #4
0
        public Task ModifyInventory(Action <ModifyInventoryContext> action = null, bool exclRequest = false)
        {
            var context  = new ModifyInventoryContext(Character);
            var equipped = Character.GetInventory(ItemInventoryType.Equip).Items
                           .Where(i => i.Position < 0)
                           .Select(i => i.TemplateID)
                           .ToList();

            action?.Invoke(context);
            using (var p = new OutPacket(GameSendOperations.InventoryOperation))
            {
                p.Encode <bool>(exclRequest);
                context.Encode(p);
                p.Encode <bool>(false);
                SendPacket(p);
            }

            var newEquipped = Character.GetInventory(ItemInventoryType.Equip).Items
                              .Where(i => i.Position < 0)
                              .Select(i => i.TemplateID)
                              .ToList();

            if (equipped.Except(newEquipped).Any() ||
                newEquipped.Except(equipped).Any())
            {
                ValidateStat();
                using (var p = new OutPacket(GameSendOperations.UserAvatarModified))
                {
                    p.Encode <int>(ID);
                    p.Encode <byte>(0x1);   // Flag
                    Character.EncodeLook(p);
                    p.Encode <bool>(false); // bCouple
                    p.Encode <bool>(false); // bFriendship
                    p.Encode <bool>(false); // Marriage
                    p.Encode <int>(CompletedSetItemID ?? 0);

                    Field.BroadcastPacket(this, p);
                }
            }

            return(Task.CompletedTask);
        }
예제 #5
0
        private async Task OnCreateNewCharacter(IPacket packet)
        {
            var name   = packet.Decode <string>();
            var race   = packet.Decode <int>();
            var subJob = packet.Decode <short>();
            var face   = packet.Decode <int>();
            var hair   = packet.Decode <int>() + packet.Decode <int>();
            var skin   = packet.Decode <int>();
            var top    = packet.Decode <int>();
            var bottom = packet.Decode <int>();
            var shoes  = packet.Decode <int>();
            var weapon = packet.Decode <int>();
            var gender = packet.Decode <byte>();

            await WvsLogin.LockProvider.AcquireAsync("characterCreationLock");

            using (var p = new Packet(SendPacketOperations.CreateNewCharacterResult))
                using (var db = WvsLogin.DataContextFactory.Create())
                {
                    var result    = LoginResult.Success;
                    var character = new Character
                    {
                        Name        = name,
                        Job         = 0,
                        Face        = face,
                        Hair        = hair,
                        Skin        = (byte)skin,
                        Gender      = gender,
                        FieldID     = 310000000,
                        FieldPortal = 0,
                        Level       = 1,
                        HP          = 50,
                        MaxHP       = 50,
                        MP          = 50,
                        MaxMP       = 50,
                        Inventories = new List <ItemInventory>()
                    };


                    var inventories = character.Inventories;

                    inventories.Add(new ItemInventory(ItemInventoryType.Equip, 24));
                    inventories.Add(new ItemInventory(ItemInventoryType.Use, 24));
                    inventories.Add(new ItemInventory(ItemInventoryType.Setup, 24));
                    inventories.Add(new ItemInventory(ItemInventoryType.Etc, 24));
                    inventories.Add(new ItemInventory(ItemInventoryType.Cash, 24));

                    var context   = new ModifyInventoryContext(character);
                    var templates = WvsLogin.TemplateManager;

                    context.Set(templates.Get <ItemTemplate>(top), -5);
                    if (bottom > 0)
                    {
                        context.Set(templates.Get <ItemTemplate>(bottom), -6);
                    }
                    context.Set(templates.Get <ItemTemplate>(shoes), -7);
                    context.Set(templates.Get <ItemTemplate>(weapon), -11);

                    var data = Account.Data.FirstOrDefault(a => a.WorldID == SelectedService.WorldID);
                    if (data == null)
                    {
                        result = LoginResult.DBFail;
                    }

                    p.Encode <byte>((byte)result);

                    if (result == LoginResult.Success)
                    {
                        data.Characters.Add(character);
                        db.Update(Account);
                        db.SaveChanges();

                        character.EncodeStats(p);
                        character.EncodeLook(p);
                        p.Encode <bool>(false);
                        p.Encode <bool>(false);
                    }

                    await SendPacket(p);
                }

            await WvsLogin.LockProvider.ReleaseAsync("characterCreationLock");
        }
        private void OnCreateNewCharacter(InPacket packet)
        {
            var name   = packet.Decode <string>();
            var job    = packet.Decode <int>();
            var subJob = packet.Decode <short>();
            var face   = packet.Decode <int>();
            var hair   = packet.Decode <int>() + packet.Decode <int>();
            var skin   = packet.Decode <int>();
            var top    = packet.Decode <int>();
            var bottom = packet.Decode <int>();
            var shoes  = packet.Decode <int>();
            var weapon = packet.Decode <int>();
            var gender = packet.Decode <byte>();

            using (var db = _container.GetInstance <DataContext>())
            {
                var character = new Character
                {
                    Name        = name,
                    Job         = 0,
                    Face        = face,
                    Hair        = hair,
                    Skin        = (byte)skin,
                    Gender      = gender,
                    FieldID     = 310000000,
                    FieldPortal = 0,
                    Level       = 1,
                    HP          = 50,
                    MaxHP       = 50,
                    MP          = 50,
                    MaxMP       = 50
                };

                character.Inventories = new List <ItemInventory>();

                var inventories = character.Inventories;

                inventories.Add(new ItemInventory(ItemInventoryType.Equip, 24));
                inventories.Add(new ItemInventory(ItemInventoryType.Use, 24));
                inventories.Add(new ItemInventory(ItemInventoryType.Setup, 24));
                inventories.Add(new ItemInventory(ItemInventoryType.Etc, 24));
                inventories.Add(new ItemInventory(ItemInventoryType.Cash, 24));

                var context   = new ModifyInventoryContext(character);
                var templates = _wvsLogin.ItemTemplates;

                context.Set(templates.Get(top), -5);
                if (bottom > 0)
                {
                    context.Set(templates.Get(bottom), -6);
                }
                context.Set(templates.Get(shoes), -7);
                context.Set(templates.Get(weapon), -11);

                var data = Account.Data.FirstOrDefault(a => a.WorldID == _selectedWorld.ID);

                if (data == null)
                {
                    return;               // TODO error
                }
                data.Characters.Add(character);
                db.Update(Account);
                db.SaveChanges();

                using (var p = new OutPacket(LoginSendOperations.CreateNewCharacterResult))
                {
                    p.Encode <bool>(false);
                    character.EncodeStats(p);
                    character.EncodeLook(p);
                    p.Encode <bool>(false);
                    p.Encode <bool>(false);
                    SendPacket(p);
                }
            }
        }