public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var position = packet.Decode <short>();
            var leader   = packet.Decode <bool>();

            if (!user.Character.Inventories[ItemInventoryType.Cash].Items.ContainsKey(position))
            {
                return;
            }

            var item = (ItemSlotPet)user.Character
                       .Inventories[ItemInventoryType.Cash]
                       .Items[position];
            var pet = user.Pets.FirstOrDefault(p => p.Item == item);

            // TODO: Follow the leader checks

            if (pet != null)
            {
                var id = pet.IDx;

                user.Pets.Remove(pet);
                user.Pets
                .Where(p => p.IDx > id)
                .ForEach(p => p.IDx--);
                await user.Field.BroadcastPacket(pet.GetLeaveFieldPacket());
            }
            else
            {
                if (user.Pets.Count >= 3)
                {
                    await user.ModifyStats(exclRequest : true);

                    return;
                }

                var id = leader ? 0 : user.Pets.Count;

                pet = new FieldUserPet(user, item, (byte)id);
                user.Pets
                .Where(p => p.IDx >= id)
                .ForEach(p => p.IDx++);
                user.Pets.Add(pet);
                await user.Field.BroadcastPacket(pet.GetEnterFieldPacket());
            }

            await user.ModifyStats(s =>
            {
                s.Pet1 = user.Pets.FirstOrDefault(p => p.IDx == 0)?.Item.CashItemSN ?? 0;
                s.Pet2 = user.Pets.FirstOrDefault(p => p.IDx == 1)?.Item.CashItemSN ?? 0;
                s.Pet3 = user.Pets.FirstOrDefault(p => p.IDx == 2)?.Item.CashItemSN ?? 0;
            }, true);
        }
示例#2
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUserPet pet)
        {
            using (var p = new Packet(SendPacketOperations.PetMove))
            {
                p.Encode <int>(pet.Owner.ID);
                p.Encode <byte>(pet.IDx);

                pet.Move(packet).Encode(p);

                await pet.Field.BroadcastPacket(pet.Owner, p);
            }
        }
 public abstract Task Handle(RecvPacketOperations operation, IPacket packet, FieldUserPet pet);