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

            using (var p = new Packet(SendPacketOperations.UserSitResult))
            {
                if (id < 0)
                {
                    user.PortableChairID = null;
                    p.Encode <byte>(0);
                }
                else
                {
                    p.Encode <byte>(1);
                    p.Encode <short>(id); // TODO: proper checks for this
                }

                await user.SendPacket(p);
            }

            if (user.PortableChairID != null)
            {
                return;
            }

            using (var p = new Packet(SendPacketOperations.UserSetActivePortableChair))
            {
                p.Encode <int>(user.ID);
                p.Encode <int>(0);
                await user.Field.BroadcastPacket(user, p);
            }
        }
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var stat = (ModifyStatType)packet.Decode <int>();
            var hp   = 0;
            var mp   = 0;

            if (stat.HasFlag(ModifyStatType.HP))
            {
                hp = packet.Decode <short>();
            }

            if (stat.HasFlag(ModifyStatType.MP))
            {
                mp = packet.Decode <short>();
            }

            // TODO: portable chair
            // TODO: rope endurance?
            // TODO: checks

            if (hp > 0 || mp > 0)
            {
                await user.ModifyStats(s =>
                {
                    s.HP += hp;
                    s.MP += mp;
                });
            }
        }
 public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
 {
     for (var i = 0; i < 8; i++)
     {
         user.Character.QuickSlotKeys[i] = packet.Decode <int>();
     }
 }
示例#4
0
 public abstract Task Handle(
     RecvPacketOperations operation,
     IPacket packet,
     FieldUser user,
     T template,
     ItemSlot item
     );
示例#5
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <byte>();

            var name   = packet.Decode <string>();
            var portal = user.Field.Template.Portals.Values
                         .FirstOrDefault(p => p.Name.Equals(name));

            if (portal == null)
            {
                return;
            }
            if (string.IsNullOrEmpty(portal.Script))
            {
                return;
            }

            var context      = new ConversationContext(user.Socket);
            var conversation = await user.Service.ConversationManager.Build(
                portal.Script,
                context,
                new FieldSpeaker(context, user.Field),
                new FieldUserSpeaker(context, user)
                );

            await user.Converse(conversation);
        }
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var type = (ModifyStatType)packet.Decode <int>();

            if (user.Character.AP > 0)
            {
                await user.ModifyStats(s =>
                {
                    switch (type)
                    {
                    case ModifyStatType.STR:
                        s.STR++;
                        break;

                    case ModifyStatType.DEX:
                        s.DEX++;
                        break;

                    case ModifyStatType.INT:
                        s.INT++;
                        break;

                    case ModifyStatType.LUK:
                        s.LUK++;
                        break;
                    }

                    s.AP--;
                }, true);
            }
        }
示例#7
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();

            var message     = packet.Decode <string>();
            var onlyBalloon = packet.Decode <bool>();

            if (message.StartsWith(CommandManager.Prefix))
            {
                try
                {
                    await user.Service.CommandManager.Process(
                        user,
                        message.Substring(1)
                        );
                }
                catch (Exception e)
                {
                    await user.Message("An error has occured while executing that command.");
                }

                return;
            }

            using (var p = new Packet(SendPacketOperations.UserChat))
            {
                p.Encode <int>(user.ID);
                p.Encode <bool>(false);
                p.Encode <string>(message);
                p.Encode <bool>(onlyBalloon);
                await user.Field.BroadcastPacket(p);
            }
        }
示例#8
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var position   = packet.Decode <short>();
            var templateID = packet.Decode <int>();
            var template   = user.Service.TemplateManager.Get <ItemTemplate>(templateID);

            if (template == null)
            {
                return;
            }
            if (!(template is T castTemplate))
            {
                return;
            }

            var inventory = user.Character.Inventories[(ItemInventoryType)(templateID / 1000000)];
            var item      = inventory.Items[position];

            if (item.TemplateID != templateID)
            {
                return;
            }

            await Handle(operation, packet, user, castTemplate, item);
        }
示例#9
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var templateID = packet.Decode <int>();
            var template   = user.Service.TemplateManager.Get <SkillTemplate>(templateID);
            var skillLevel = user.Character.GetSkillLevel(templateID);

            if (template == null)
            {
                return;
            }
            if (skillLevel <= 0)
            {
                return;
            }
            if (!SkillConstants.IsKeydownSkill(templateID))
            {
                return;
            }

            using var p = new Packet(SendPacketOperations.UserSkillPrepare);
            p.Encode <int>(user.ID);
            p.Encode <int>(templateID);
            p.Encode <byte>(packet.Decode <byte>());
            p.Encode <short>(packet.Decode <short>());
            p.Encode <byte>(packet.Decode <byte>());

            await user.Field.BroadcastPacket(user, p);
        }
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            try
            {
                var services = user.Service.Peers
                               .OfType <ShopServiceInfo>()
                               .Where(g => g.Worlds.Contains(user.Service.Info.WorldID))
                               .OrderBy(g => g.ID)
                               .ToList();
                var service = services.First();

                if (services.Count > 1)
                {
                    var id = await user.Prompt <int>(target => target.AskMenu(
                                                         "Which service should I connect to?", services.ToDictionary(
                                                             s => Convert.ToInt32(s.ID),
                                                             s => s.Name
                                                             ))
                                                     );

                    service = services.First(s => s.ID == id);
                }

                await user.Socket.TryMigrateTo(user.Account, user.Character, service);
            }
            catch
            {
                using (var p = new Packet(SendPacketOperations.TransferChannelReqIgnored))
                {
                    p.Encode <byte>(0x2);
                    await user.SendPacket(p);
                }
            }
        }
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var target = user.Field.GetObject <FieldUser>(packet.Decode <int>());

            if (target == null)
            {
                return;
            }

            using var p = new Packet(SendPacketOperations.CharacterInfo);
            var c = target.Character;

            p.Encode <int>(target.ID);
            p.Encode <byte>(c.Level);
            p.Encode <short>(c.Job);
            p.Encode <short>(c.POP); // TODO: use basic stat POP

            p.Encode <byte>(0);

            p.Encode <string>(""); // sCommunity
            p.Encode <string>(""); // sAlliance

            p.Encode <byte>(0);    // Medal?

            var petCount = target.Pets.Count;

            p.Encode <bool>(petCount > 0);
            target.Pets
            .OrderBy(pet => pet.IDx)
            .ForEach(pet =>
            {
                p.Encode <int>(pet.Item.TemplateID);
                p.Encode <string>(pet.Item.PetName);
                p.Encode <byte>(pet.Item.Level);
                p.Encode <short>(pet.Item.Tameness);
                p.Encode <byte>(pet.Item.Repleteness);
                p.Encode <short>(pet.Item.PetSkill);
                p.Encode <int>(0);    // Pet Equip
                p.Encode <bool>(--petCount > 0);
            });

            p.Encode <byte>(0); // TamingMobInfo
            p.Encode <byte>(0); // Wishlist

            p.Encode <int>(0);  // MedalAchievementInfo
            p.Encode <short>(0);

            var chairs = c.Inventories.Values
                         .SelectMany(i => i.Items)
                         .Select(kv => kv.Value)
                         .Select(i => i.TemplateID)
                         .Where(i => i / 10000 == 301)
                         .ToList();

            p.Encode <int>(chairs.Count);
            chairs.ForEach(i => p.Encode <int>(i));
            await user.SendPacket(p);
        }
示例#12
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldDragon dragon)
        {
            using var p = new Packet(SendPacketOperations.DragonMove);
            p.Encode <int>(dragon.Owner.ID);
            dragon.Move(packet).Encode(p);

            await dragon.Field.BroadcastPacket(dragon.Owner, p);
        }
        public override Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var npc = user.Field.GetControlledObject <FieldNPC>(user, packet.Decode <int>());

            return(npc == null
                ? Task.CompletedTask
                : Handle(operation, packet, npc));
        }
示例#14
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var request = (TrunkRequest)packet.Decode <byte>();

            if (!(user.Dialog is TrunkDialog trunk))
            {
                return;
            }
            if (request == TrunkRequest.CloseDialog)
            {
                await trunk.Leave();

                return;
            }

            using (var p = new Packet(SendPacketOperations.TrunkResult))
            {
                switch (request)
                {
                case TrunkRequest.GetItem:
                {
                    var type     = (ItemInventoryType)packet.Decode <byte>();
                    var position = packet.Decode <byte>();
                    p.Encode <byte>((byte)await trunk.Get(type, position));
                    trunk.EncodeItems(p);
                    break;
                }

                case TrunkRequest.PutItem:
                {
                    var position   = packet.Decode <short>();
                    var templateID = packet.Decode <int>();
                    var count      = packet.Decode <short>();
                    p.Encode <byte>((byte)await trunk.Put(position, templateID, count));
                    trunk.EncodeItems(p);
                    break;
                }

                case TrunkRequest.SortItem:
                {
                    p.Encode <byte>((byte)await trunk.Sort());
                    trunk.EncodeItems(p);
                    break;
                }

                case TrunkRequest.Money:
                {
                    var amount = packet.Decode <int>();
                    p.Encode <byte>((byte)await trunk.Transact(amount));
                    trunk.EncodeItems(p, DbChar.Money);
                    break;
                }
                }

                await user.SendPacket(p);
            }
        }
 public override async Task Handle(
     RecvPacketOperations operation,
     IPacket packet,
     FieldUser user,
     AbstractFieldDrop drop
     )
 {
     await drop.PickUp(user);
 }
        public override Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var sn  = packet.Decode <long>();
            var pet = user.Pets.FirstOrDefault(p => p.Item.CashItemSN == sn);

            return(pet == null
                ? Task.CompletedTask
                : Handle(operation, packet, pet));
        }
示例#17
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var action     = (QuestRequest)packet.Decode <byte>();
            var templateID = packet.Decode <short>();
            var template   = user.Service.TemplateManager.Get <QuestTemplate>(templateID);

            if (template == null)
            {
                return;
            }

            var state = user.Character.GetQuestState(templateID);

            if (state == QuestState.Perform &&
                action == QuestRequest.ResignQuest
                )
            {
                await user.ModifyQuests(q => q.Resign(templateID));

                return;
            }

            // TODO: repeatable quests
            if (state != QuestState.Perform &&
                action == QuestRequest.CompleteQuest ||
                state != QuestState.None &&
                action == QuestRequest.AcceptQuest
                )
            {
                return;
            }

            var result = await template.Check(state, user);

            if (result == QuestResult.ActSuccess)
            {
                result = await template.Act(state, user);
            }

            if (result != QuestResult.ActSuccess)
            {
                using (var p = new Packet(SendPacketOperations.UserQuestResult))
                {
                    p.Encode <byte>((byte)result);
                    p.Encode <short>(templateID);
                    await user.SendPacket(p);
                }

                return;
            }

            await(action switch {
                QuestRequest.AcceptQuest => user.ModifyQuests(q => q.Accept(templateID)),
                QuestRequest.CompleteQuest => user.ModifyQuests(q => q.Complete(templateID)),
                _ => Task.CompletedTask
            });
示例#18
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldSummoned summoned)
        {
            using var p = new Packet(SendPacketOperations.SummonedMove);
            p.Encode <int>(summoned.Owner.ID);
            p.Encode <int>(summoned.ID);

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

            await summoned.Field.BroadcastPacket(summoned.Owner, p);
        }
示例#19
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);
        }
示例#20
0
        public override Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var summoned = user.Owned
                           .OfType <FieldDragon>()
                           .FirstOrDefault();

            return(summoned == null
                ? Task.CompletedTask
                : Handle(operation, packet, summoned));
        }
示例#21
0
        public override Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var id       = packet.Decode <int>();
            var summoned = user.Owned
                           .OfType <FieldSummoned>()
                           .FirstOrDefault(s => s.ID == id);

            return(summoned == null
                ? Task.CompletedTask
                : Handle(operation, packet, summoned));
        }
        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 Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <byte>();
            packet.Decode <int>();
            packet.Decode <short>();
            packet.Decode <short>();
            var objectID = packet.Decode <int>();

            packet.Decode <int>();

            return(Handle(operation, packet, user, user.Field.GetObject <AbstractFieldDrop>(objectID)));
        }
示例#24
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldNPC npc)
        {
            using var p = new Packet(SendPacketOperations.NpcMove);
            p.Encode <int>(npc.ID);
            p.Encode <byte>(packet.Decode <byte>()); // TODO: validate acts
            p.Encode <byte>(packet.Decode <byte>());

            if (npc.Template.Move)
            {
                npc.Move(packet).Encode(p);
            }

            await npc.Field.BroadcastPacket(p);
        }
示例#25
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var emotion      = packet.Decode <int>();
            var duration     = packet.Decode <int>();
            var byItemOption = packet.Decode <bool>();

            // TODO: item option checks

            using var p = new Packet(SendPacketOperations.UserEmotion);
            p.Encode <int>(user.ID);
            p.Encode <int>(emotion);
            p.Encode <int>(duration);
            p.Encode <bool>(byItemOption);
            await user.Field.BroadcastPacket(user, p);
        }
示例#26
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <int>();
            var count = packet.Decode <int>();
            var inc   = new Dictionary <int, int>();

            for (var i = 0; i < count; i++)
            {
                inc.Add(packet.Decode <int>(), packet.Decode <int>());
            }

            var total = inc.Values.Sum();

            if (user.Character.AP < total)
            {
                return;
            }

            await user.ModifyStats(s =>
            {
                inc.ForEach(p =>
                {
                    var type  = (ModifyStatType)p.Key;
                    var value = (short)p.Value;

                    switch (type)
                    {
                    case ModifyStatType.STR:
                        s.STR += value;
                        break;

                    case ModifyStatType.DEX:
                        s.DEX += value;
                        break;

                    case ModifyStatType.INT:
                        s.INT += value;
                        break;

                    case ModifyStatType.LUK:
                        s.LUK += value;
                        break;
                    }
                });

                s.AP -= (short)total;
            }, true);
        }
示例#27
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var request = (ShopRequest)packet.Decode <byte>();

            if (!(user.Dialog is ShopDialog shop))
            {
                return;
            }
            if (request == ShopRequest.Close)
            {
                await shop.Leave();

                return;
            }

            using (var p = new Packet(SendPacketOperations.ShopResult))
            {
                switch (request)
                {
                case ShopRequest.Buy:
                {
                    var position   = packet.Decode <short>();
                    var templateID = packet.Decode <int>();
                    var count      = packet.Decode <short>();
                    p.Encode <byte>((byte)await shop.Buy(position, count));
                    break;
                }

                case ShopRequest.Sell:
                {
                    var position   = packet.Decode <short>();
                    var templateID = packet.Decode <int>();
                    var count      = packet.Decode <short>();
                    p.Encode <byte>((byte)await shop.Sell(position, templateID, count));
                    break;
                }

                case ShopRequest.Recharge:
                {
                    var position = packet.Decode <short>();
                    p.Encode <byte>((byte)await shop.Recharge(position));
                    break;
                }
                }

                await user.SendPacket(p);
            }
        }
        public override async Task Handle(
            RecvPacketOperations operation,
            IPacket packet,
            FieldUser user,
            StatChangeItemTemplate template,
            ItemSlot item
            )
        {
            var stats = template.GetTemporaryStats();

            if (stats.Count > 0)
            {
                await user.ModifyTemporaryStats(ts =>
                {
                    if (template.Time > 0)
                    {
                        var expire = DateTime.Now.AddSeconds(template.Time);
                        stats.ForEach(t => ts.Set(t.Key, -template.ID, t.Value, expire));
                    }
                    else
                    {
                        stats.ForEach(t => ts.Set(t.Key, -template.ID, t.Value));
                    }
                });
            }

            if (!stats.ContainsKey(TemporaryStatType.Morph))
            {
                var incHP = 0;
                var incMP = 0;

                incHP += template.HP;
                incMP += template.MP;
                incHP += user.BasicStat.MaxHP * (template.HPr / 100);
                incMP += user.BasicStat.MaxMP * (template.MPr / 100);

                if (incHP > 0 || incMP > 0)
                {
                    await user.ModifyStats(s =>
                    {
                        s.HP += incHP;
                        s.MP += incMP;
                    });
                }
            }

            await user.ModifyInventory(i => i.Remove(item, 1), true);
        }
示例#29
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            packet.Decode <long>();
            packet.Decode <byte>();
            packet.Decode <long>();
            packet.Decode <int>();
            packet.Decode <int>();
            packet.Decode <int>();

            var path = user.Move(packet);

            using var p = new Packet(SendPacketOperations.UserMove);
            p.Encode <int>(user.ID);
            path.Encode(p);
            await user.Field.BroadcastPacket(user, p);
        }
示例#30
0
        public override async Task Handle(RecvPacketOperations operation, IPacket packet, FieldUser user)
        {
            var continent = user.Service.ContinentManager.Continents
                            .FirstOrDefault(c => c.StartShipMoveField == user.Field ||
                                            c.MoveField == user.Field);

            if (continent == null)
            {
                return;
            }

            using var p = new Packet(SendPacketOperations.CONTISTATE);
            p.Encode <byte>((byte)continent.State);
            p.Encode <bool>(continent.EventDoing);
            await user.SendPacket(p);
        }