/// <summary> /// This packet is used for character items equiped in "P" panel (wear items) /// </summary> /// <param name="player"></param> /// <returns></returns> public static EquipPacket GenerateEquipPacket(this IPlayerEntity player) { List <EquipPacket.EquipSubPacket> tmp = new List <EquipPacket.EquipSubPacket>(); ItemInstanceDto[] subInventory = player.Inventory.Wear; for (int i = 0; i < subInventory.Length; i++) { ItemInstanceDto item = subInventory[i]; if (item == null) { continue; } tmp.Add(new EquipPacket.EquipSubPacket { WearIndex = i, ItemId = item.ItemId, ItemRarity = (byte)item.Rarity, UpgradeOrDesign = item.Item.IsColored ? item.Design : item.Upgrade, Unknown = 0 }); } return(new EquipPacket { EqRare = player.Inventory.GenerateEqRareInfoPacket(), EqList = tmp }); }
public async Task SetupAsync() { await TestHelpers.ResetAsync().ConfigureAwait(false); Broadcaster.Reset(); _session = await TestHelpers.Instance.GenerateSessionAsync().ConfigureAwait(false); _bazaarHttpClient = new Mock <IBazaarHttpClient>(); _itemInstanceDao = new Mock <IDao <IItemInstanceDto?, Guid> >(); _itemProvider = new Mock <IItemProvider>(); _cbuyPacketHandler = new CBuyPacketHandler(_bazaarHttpClient.Object, _itemProvider.Object, Logger, _itemInstanceDao.Object); _bazaarHttpClient.Setup(b => b.GetBazaarLinkAsync(0)).ReturnsAsync( new BazaarLink { SellerName = "test", BazaarItem = new BazaarItemDto { Price = 50, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012, Amount = 1 } }); _bazaarHttpClient.Setup(b => b.GetBazaarLinkAsync(2)).ReturnsAsync( new BazaarLink { SellerName = _session !.Character.Name, BazaarItem = new BazaarItemDto { Price = 60, Amount = 1 }, ItemInstance = new ItemInstanceDto { ItemVNum = 1012 } });
public static void UpgradeNpc(IPlayerEntity player, ItemUpgradeEvent e) { if (e.Item.Upgrade >= Configuration.UpgradeItem.MaximumUpgrade) { return; } if (e.Item.Item.EquipmentSlot != EquipmentType.Armor && e.Item.Item.EquipmentSlot != EquipmentType.MainWeapon && e.Item.Item.EquipmentSlot != EquipmentType.SecondaryWeapon) { return; } var hasAmulet = FixedUpMode.None; ItemInstanceDto amulet = player.Inventory.GetWeared(EquipmentType.Amulet); if (amulet?.Item.Effect == 793) { hasAmulet = FixedUpMode.HasAmulet; } player.EmitEvent(new UpgradeEquipmentEvent { Item = e.Item, Mode = e.Type == UpgradePacketType.UpgradeItemGoldScroll ? UpgradeMode.Reduced : UpgradeMode.Normal, Protection = e.Type == UpgradePacketType.UpgradeItem ? UpgradeProtection.None : UpgradeProtection.Protected, HasAmulet = hasAmulet, IsCommand = false }); }
public void ItemInstanceDtoToItemInstanceEntity() { var itemInstanceDto = new ItemInstanceDto(); var itemInstanceEntity = _adapter.Adapt <ItemInstance>(itemInstanceDto); Assert.IsNotNull(itemInstanceEntity); }
public static short GetFirstFreeSlot(this InventoryComponent inv, IReadOnlyCollection <ItemInstanceDto> subInventory, ItemDto source, short amount) { ItemInstanceDto item = subInventory.FirstOrDefault(x => x != null && x.Amount + amount < GameConf.Inventory.MaxItemPerSlot && x.ItemId == source.Id && x.Item.Type != InventoryType.Equipment); return(item?.Slot ?? GetFirstFreeSlot(inv, subInventory)); }
public static EInfoPacket GenerateEInfoPacket(this ItemInstanceDto itemInstance) { EquipmentType equipmentSlot = itemInstance.Item.EquipmentSlot; switch (itemInstance.Item.ItemType) { case ItemType.Weapon: switch (equipmentSlot) { case EquipmentType.MainWeapon: return(GenerateEInfoPrimaryWeapon(itemInstance)); case EquipmentType.SecondaryWeapon: return(GenerateSecondaryWeapon(itemInstance)); default: return(null); } case ItemType.Armor: return(GenerateEInfoArmor(itemInstance)); case ItemType.Jewelery: return(GenerateEInfoJewelery(itemInstance)); case ItemType.Specialist: return(GenerateEInfoSpecialist(itemInstance)); default: return(null); } }
public static PairyPacket GeneratePairyPacket(this IPlayerEntity player) { ItemInstanceDto fairy = player.Inventory.GetWeared(EquipmentType.Fairy); if (fairy == null) { return(new PairyPacket { VisualType = VisualType.Character, CharacterId = player.Character.Id, FairyMoveType = 0, ElementType = 0, FairyLevel = 0 }); } // todo buffs return(new PairyPacket { VisualType = VisualType.Character, CharacterId = player.Character.Id, ElementType = fairy.ElementType, FairyLevel = fairy.Upgrade, FairyMoveType = 4 // todo enum }); }
public void ItemInstanceDtoToItemInstanceEntity() { var itemInstanceDto = new ItemInstanceDto(); var itemInstanceEntity = _mapper.Map <ItemInstance>(itemInstanceDto); Assert.IsNotNull(itemInstanceEntity); }
public static IvnPacket GenerateIvnPacket(this ItemInstanceDto itemInstance) { switch (itemInstance.Type) { case InventoryType.Specialist: return(new IvnPacket { InventoryType = itemInstance.Type, ItemId = itemInstance.Item.Id, Slot = itemInstance.Slot, Upgrade = itemInstance.Upgrade, Rare = itemInstance.Rarity, SpStoneUpgrade = itemInstance.SpecialistUpgrade }); case InventoryType.Equipment: return(new IvnPacket { InventoryType = itemInstance.Type, ItemId = itemInstance.ItemId, Slot = itemInstance.Slot, Rare = itemInstance.Rarity, Upgrade = itemInstance.Upgrade }); case InventoryType.Main: case InventoryType.Etc: return(itemInstance.GenerateMainIvnPacket()); default: //Log.Info($"{itemInstance.Type} not implemented"); return(null); } }
public ItemInstance Convert(ItemInstanceDto k) { ItemInstance item = k.Adapt <ItemInstance>(); item.Item = _items.Find(s => s.VNum == k.ItemVNum); return(item); }
protected override async Task Handle(InventoryMoveEvent args, CancellationToken cancellation) { if (!(args.Sender is IPlayerEntity player)) { return; } InventoryComponent inv = player.Inventory; ItemInstanceDto source = inv.GetSubInvFromInventoryType(args.InventoryType)[args.SourceSlot]; ItemInstanceDto dest = inv.GetSubInvFromInventoryType(args.InventoryType)[args.DestinationSlot]; if (source == null) { return; } if (dest != null && (args.InventoryType == InventoryType.Main || args.InventoryType == InventoryType.Etc) && dest.ItemId == source.ItemId && dest.Amount + source.Amount > _gameConfiguration.Inventory.MaxItemPerSlot) { // if both source & dest are stackable && slots combined are > max slots // should provide a "fill" possibility return; } if (dest == null) { await inv.MoveItem(source, args); } else { await inv.MoveItems(source, dest); } }
public InventoryComponent(IEntity entity) { Wear = new ItemInstanceDto[WEAR_SIZE]; Equipment = new ItemInstanceDto[EQUIPMENT_SIZE]; Main = new ItemInstanceDto[MAIN_SIZE]; Etc = new ItemInstanceDto[ETC_SIZE]; Entity = entity; }
private static IvnPacket GenerateMainIvnPacket(this ItemInstanceDto itemInstance) => new IvnPacket { InventoryType = itemInstance.Type, Slot = itemInstance.Slot, ItemId = itemInstance.ItemId, Rare = itemInstance.Amount, Upgrade = 0 };
/// <summary> /// Binds builded Equipment Option to the given item /// </summary> /// <param name="itemInstance"></param> public void ForWeapon(ItemInstanceDto itemInstance) { if (itemInstance.Item.EquipmentSlot != EquipmentType.MainWeapon && itemInstance.Item.EquipmentSlot != EquipmentType.SecondaryWeapon) { throw new ArgumentException("Given item should only be a weapon"); } _weaponId = itemInstance.Id; }
public static void UseItem(this InventoryComponent inventory, ItemInstanceDto itemInstance) { switch (itemInstance.Item.Type) { case InventoryType.Wear: inventory.UseWear(itemInstance); break; } }
public static void UseWear(this InventoryComponent inventory, ItemInstanceDto itemInstance) { switch (itemInstance.Item.EquipmentSlot) { case EquipmentType.MainWeapon: break; case EquipmentType.Armor: break; case EquipmentType.Hat: break; case EquipmentType.Gloves: break; case EquipmentType.Boots: break; case EquipmentType.SecondaryWeapon: break; case EquipmentType.Necklace: break; case EquipmentType.Ring: break; case EquipmentType.Bracelet: break; case EquipmentType.Mask: break; case EquipmentType.Fairy: break; case EquipmentType.Amulet: break; case EquipmentType.Sp: break; case EquipmentType.CostumeSuit: break; case EquipmentType.CostumeHat: break; case EquipmentType.WeaponSkin: break; default: throw new ArgumentOutOfRangeException(); } }
private static EInfoPacket GenerateSecondaryWeapon(ItemInstanceDto itemInstance) { byte classe = itemInstance.Item.Class; switch (classe) { case (byte)ItemClassType.Unknown1: case (byte)ItemClassType.Unknown2: return(new EInfoPacket { EInfoType = EInfoPacketType.MainWeaponArcher, ItemVNum = itemInstance.ItemId, Rare = itemInstance.Rarity, Upgrade = itemInstance.Upgrade, Fixed = itemInstance.IsFixed, LevelMinimum = itemInstance.Item.LevelMinimum, CloseDefense = itemInstance.Item.DamageMinimum, RangeDefense = itemInstance.Item.DamageMaximum, MagicDefense = itemInstance.Item.HitRate, DefenseDodge = itemInstance.Item.CriticalLuckRate, CriticalRate = itemInstance.Item.CriticalRate, Ammo = itemInstance.Ammo, MaximumAmmo = itemInstance.Item.MaximumAmmo, Price = itemInstance.Item.Price, Unknown2 = -1, Rare2 = 0, BoundCharacterId = 0, ShellEffectCount = 0, ShellEffect = null }); default: return(new EInfoPacket { EInfoType = EInfoPacketType.WeaponDefault, ItemVNum = itemInstance.ItemId, Rare = itemInstance.Rarity, Upgrade = itemInstance.Upgrade, Fixed = itemInstance.IsFixed, LevelMinimum = itemInstance.Item.LevelMinimum, CloseDefense = itemInstance.Item.DamageMinimum, RangeDefense = itemInstance.Item.DamageMaximum, MagicDefense = itemInstance.Item.HitRate, DefenseDodge = itemInstance.Item.CriticalLuckRate, CriticalRate = itemInstance.Item.CriticalRate, Ammo = itemInstance.Ammo, MaximumAmmo = itemInstance.Item.MaximumAmmo, Price = itemInstance.Item.Price, Unknown2 = -1, Rare2 = 0, BoundCharacterId = 0, ShellEffectCount = 0, ShellEffect = null }); } }
public InventoryComponent(IEntity entity) { Wear = new ItemInstanceDto[WEAR_SIZE]; Equipment = new ItemInstanceDto[EQUIPMENT_SIZE]; Main = new ItemInstanceDto[MAIN_SIZE]; Etc = new ItemInstanceDto[ETC_SIZE]; // temporary Specialists = new ItemInstanceDto[1]; Costumes = new ItemInstanceDto[1]; Entity = entity; }
protected override async Task Handle(UpgradePacket packet, IPlayerEntity player) { ItemInstanceDto item = player.Inventory.GetItemFromSlotAndType(packet.Slot, packet.InventoryType); if (item == null) { return; } if (!packet.InventoryType2.HasValue || !packet.Slot2.HasValue) { await player.EmitEventAsync(new ItemUpgradeEvent { Type = packet.UpgradeType, Item = item }); return; } ItemInstanceDto seconditem = player.Inventory.GetItemFromSlotAndType(packet.Slot2.Value, packet.InventoryType2.Value); if (seconditem == null) { return; } if (!packet.CellonInventoryType.HasValue || !packet.CellonSlot.HasValue) { await player.EmitEventAsync(new ItemUpgradeEvent { Type = packet.UpgradeType, Item = item, SecondItem = seconditem }); return; } ItemInstanceDto cellonitem = player.Inventory.GetItemFromSlotAndType(packet.CellonSlot.Value, packet.CellonInventoryType.Value); if (cellonitem == null) { return; } await player.EmitEventAsync(new ItemUpgradeEvent { Type = packet.UpgradeType, SecondItem = seconditem, CellonItem = cellonitem }); }
public Task <SaltyCommandResult> ItemCreateAsync(ItemDto item, short quantity = 1) { var itemFactory = ChickenContainer.Instance.Resolve <IItemInstanceDtoFactory>(); ItemInstanceDto itemInstance = itemFactory.CreateItem(item, quantity); Context.Player.EmitEvent(new InventoryAddItemEvent { ItemInstance = itemInstance }); return(Task.FromResult(new SaltyCommandResult(true, "Your item(s) have been created."))); }
public ItemInstance Convert(ItemInstanceDto k) { ItemInstance item = k.Adapt <BoxInstance>() ?? k.Adapt <SpecialistInstance>() ?? k.Adapt <WearableInstance>() ?? k.Adapt <UsableInstance>() ?? k.Adapt <ItemInstance>(); item.Item = _items.Find(s => s.VNum == k.ItemVNum); return(item); }
public static short GetFirstFreeSlot(this InventoryComponent inv, IReadOnlyCollection <ItemInstanceDto> subinventory) { for (int i = 0; i < subinventory.Count; i++) { ItemInstanceDto item = subinventory.FirstOrDefault(x => x == null || x.Slot == i); if (item == null) { return((short)i); } } return(-1); }
protected override async Task Handle(InventoryWearEvent e, CancellationToken cancellation) { if (!(e.Sender is IPlayerEntity player)) { return; } var inventory = player.Inventory; ItemInstanceDto item = inventory.GetItemFromSlotAndType(e.InventorySlot, InventoryType.Equipment); if (item == null) { return; } if (e.ItemWearType == ItemWearType.Partner) { // do the work return; } // check shop opened // check exchange await EquipItem(inventory, player, item); await player.SendPacketAsync(player.GenerateEffectPacket(123)); await player.BroadcastAsync(player.GenerateEqPacket()); await player.ActualizeUiWearPanel(); await player.ActualizeUiStatChar(); switch (item.Item.EquipmentSlot) { case EquipmentType.Fairy: await player.BroadcastAsync(player.GeneratePairyPacket()); break; case EquipmentType.Sp: await player.ActualiseUiSpPoints(); break; } }
public static async Task MoveItem(this InventoryComponent inv, ItemInstanceDto source, InventoryMoveEvent args) { ItemInstanceDto[] subInv = inv.GetSubInvFromItemInstance(source); subInv[args.DestinationSlot] = source; subInv[args.SourceSlot] = null; source.Slot = args.DestinationSlot; if (!(inv.Entity is IPlayerEntity player)) { return; } await player.SendPacketAsync(player.GenerateEmptyIvnPacket(args.InventoryType, args.SourceSlot)); await player.SendPacketAsync(source.GenerateIvnPacket()); }
private static EInfoPacket GenerateEInfoJewelery(ItemInstanceDto itemInstance) { EquipmentType equipmentSlot = itemInstance.Item.EquipmentSlot; switch (equipmentSlot) { case EquipmentType.Amulet: return(new EInfoPacket { EInfoType = EInfoPacketType.Jewelery, ItemVNum = itemInstance.ItemId, LevelMinimum = itemInstance.Item.LevelMinimum, DurabilityPoint = 0, // TODO: Change this 0 Unknown = 100, Unknown1 = 0, Price = itemInstance.Item.Price }); case EquipmentType.Fairy: return(new EInfoPacket { EInfoType = EInfoPacketType.Jewelery, ItemVNum = itemInstance.ItemId, Element = itemInstance.Item.Element, ElementRate = itemInstance.ElementRate, Unknown = 0, // idk Unknown1 = 0, // idk Unknown2 = 0, // idk Price = 0, // idk Rare2 = 0 // idk }); default: return(new EInfoPacket { EInfoType = EInfoPacketType.Jewelery, ItemVNum = itemInstance.ItemId, LevelMinimum = itemInstance.Item.LevelMinimum, ElementRate = itemInstance.Item.MaxCellonLvl, // review this Unknown = itemInstance.Item.MaxCellon, // review this Unknown1 = null, // Cellon Options Unknown2 = 0, // idk Price = itemInstance.Item.Price, Rare2 = 0 // Cellon Info }); } }
protected override async Task Handle(UiPacket packet, IPlayerEntity player) { ItemInstanceDto item = player.Inventory.GetItemFromSlotAndType(packet.InventorySlot, packet.InventoryType); if (item == null) { return; } string[] packetsplit = packet.OriginalContent.Split(' ', '^'); await player.EmitEventAsync(new InventoryUseItemEvent { Item = item, Option = packetsplit[1].ElementAt(0) == '#' ? (byte)50 : (byte)0 }); }
public static async Task FailAsync(this RarifyEvent e, IPlayerEntity player) { if (e.Mode != RarifyMode.Drop) { switch (e.Protection) { case RarifyProtection.BlueAmulet: case RarifyProtection.RedAmulet: case RarifyProtection.HeroicAmulet: case RarifyProtection.RandomHeroicAmulet: ItemInstanceDto amulets = player.Inventory.GetItemFromSlotAndType((short)EquipmentType.Amulet, InventoryType.Wear); if (amulets == null) { return; } /* amulet.DurabilityPoint -= 1; * if (amulet.DurabilityPoint <= 0) * { * session.Character.DeleteItemByItemInstanceId(amulet.Id); * await session.SendPacketAsync($"info {Language.Instance.GetMessageFromKey("AMULET_DESTROYED")}"); * await session.SendPacketAsync(session.Character.GenerateEquipment()); * }*/ await player.SendTopscreenMessage("AMULET_FAIL_SAVED", MsgPacketType.Whisper); await player.SendChatMessageAsync("AMULET_FAIL_SAVED", SayColorType.Purple); return; case RarifyProtection.None: /* session.Character.DeleteItemByItemInstanceId(Id);*/ //player.EmitEvent(new InventoryDestroyItemEvent { ItemInstance = e.Item }); await player.SendTopscreenMessage("RARIFY_FAILED", MsgPacketType.Whisper); await player.SendChatMessageAsync("RARIFY_FAILED", SayColorType.Purple); return; } await player.SendTopscreenMessage("RARIFY_FAILED_ITEM_SAVED", MsgPacketType.Whisper); await player.SendChatMessageAsync("RARIFY_FAILED_ITEM_SAVED", SayColorType.Purple); await player.BroadcastAsync(player.GenerateEffectPacket(3004)); } }
public static async Task MoveItems(this InventoryComponent inv, ItemInstanceDto source, ItemInstanceDto dest) { ItemInstanceDto[] subInv = inv.GetSubInvFromItemInstance(source); subInv[dest.Slot] = source; subInv[source.Slot] = dest; short tmp = dest.Slot; dest.Slot = source.Slot; source.Slot = tmp; if (!(inv.Entity is IPlayerEntity player)) { return; } await player.SendPacketAsync(source.GenerateIvnPacket()); await player.SendPacketAsync(dest.GenerateIvnPacket()); }
private static EInfoPacket GenerateEInfoArmor(ItemInstanceDto itemInstance) => new EInfoPacket { EInfoType = EInfoPacketType.Armor, ItemVNum = itemInstance.ItemId, Rare = itemInstance.Rarity, Upgrade = itemInstance.Upgrade, Fixed = itemInstance.IsFixed, LevelMinimum = itemInstance.Item.LevelMinimum, CloseDefense = itemInstance.Item.CloseDefence, RangeDefense = itemInstance.Item.DistanceDefence, MagicDefense = itemInstance.Item.MagicDefence, DefenseDodge = itemInstance.Item.DefenceDodge, Price = itemInstance.Item.Price, Unknown2 = -1, Rare2 = 0, BoundCharacterId = 0, ShellEffectCount = 0, ShellEffect = 0 };
public static void GenerateHeroicShell(this ItemInstanceDto item, RarifyProtection protection) { byte shellType; if (protection != RarifyProtection.RandomHeroicAmulet) { return; } if (!item.Item.IsHeroic || item.Rarity <= 0) { return; } if (item.Rarity < 8) { shellType = (byte)(item.Item.ItemType == ItemType.Armor ? 11 : 10); if (shellType != 11 && shellType != 10) { } } else { List <byte> possibleTypes = new List <byte> { 4, 5, 6, 7 }; int probability = (int)Random.Next(); shellType = (byte)(item.Item.ItemType == ItemType.Armor ? probability > 50 ? 5 : 7 : probability > 50 ? 4 : 6); if (!possibleTypes.Contains(shellType)) { } } // item.EquipmentOptions.Clear(); // int shellLevel = item.Item.LevelMinimum == 25 ? 101 : 106; // item.EquipmentOptions.AddRange(ShellGeneratorHelper.Instance.GenerateShell(shellType, item.Rarity == 8 ? 7 : item.Rarity, shellLevel)); }