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>(); } }
public abstract Task Handle( RecvPacketOperations operation, IPacket packet, FieldUser user, T template, ItemSlot item );
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); } }
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); } }
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); }
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); }
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)); }
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)); }
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 });
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); }
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 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)); }
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))); }
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); }
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); }
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); }
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); }
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); }
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); }