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); }
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);