public void Test_Process_Exchange() { IInventoryService inventory1 = new InventoryService(new List <ItemDto> { new Item { VNum = 1012, Type = NoscorePocketType.Main } }, _worldConfiguration, _logger); IInventoryService inventory2 = new InventoryService(new List <ItemDto> { new Item { VNum = 1013, Type = NoscorePocketType.Main } }, _worldConfiguration, _logger); var item1 = inventory1.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1012, 1), 0)) .First(); var item2 = inventory2.AddItemToPocket(InventoryItemInstance.Create(_itemProvider.Create(1013, 1), 0)) .First(); _exchangeProvider.OpenExchange(1, 2); _exchangeProvider.AddItems(1, item1, 1); _exchangeProvider.AddItems(2, item2, 1); var itemList = _exchangeProvider.ProcessExchange(1, 2, inventory1, inventory2); Assert.IsTrue((itemList.Count(s => s.Key == 1) == 2) && (itemList.Count(s => s.Key == 2) == 2)); }
public void Test_Process_Exchange() { IInventoryService inventory1 = new InventoryService(new List <Item> { new Item { VNum = 1012, Type = PocketType.Main } }, _worldConfiguration); IInventoryService inventory2 = new InventoryService(new List <Item> { new Item { VNum = 1013, Type = PocketType.Main } }, _worldConfiguration); var item1 = inventory1.AddItemToPocket(_itemBuilderService.Create(1012, 1)).First(); var item2 = inventory2.AddItemToPocket(_itemBuilderService.Create(1013, 1)).First(); _exchangeService.OpenExchange(1, 2); _exchangeService.AddItems(1, item1, 1); _exchangeService.AddItems(2, item2, 1); var itemList = _exchangeService.ProcessExchange(1, 2, inventory1, inventory2); Assert.IsTrue(itemList.Count(s => s.Key == 1) == 2 && itemList.Count(s => s.Key == 2) == 2); }
public async Task BuyAsync(Shop shop, short slot, short amount) { var item = shop.ShopItems.Values.FirstOrDefault(it => it.Slot == slot); if (item == null) { return; } var price = item.Price ?? item.ItemInstance !.Item !.Price * amount; var reputprice = item.Price == null ? item.ItemInstance !.Item !.ReputPrice * amount : 0; var percent = DignityIcon switch { DignityType.Dreadful => 1.1, DignityType.Unqualified => 1.2, DignityType.Failed => 1.5, DignityType.Useless => 1.5, _ => 1.0, }; if (amount > item.Amount) { //todo LOG return; } if ((reputprice == 0) && (price * percent > Gold)) { await SendPacketAsync(new SMemoPacket { Type = SMemoType.FatalError, Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.NOT_ENOUGH_MONEY, Session.Account.Language) }).ConfigureAwait(false); return; } if (reputprice > Reput) { await SendPacketAsync(new SMemoPacket { Type = SMemoType.FatalError, Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.NOT_ENOUGH_REPUT, Session.Account.Language) }).ConfigureAwait(false); return; } short slotChar = item.Slot; List <InventoryItemInstance>?inv; if (shop.Session == null) { inv = InventoryService.AddItemToPocket(InventoryItemInstance.Create( ItemProvider.Create(item.ItemInstance !.ItemVNum, amount), CharacterId)); } else { if (price + shop.Session.Character.Gold > _worldConfiguration.Value.MaxGoldAmount) { await SendPacketAsync(new SMemoPacket { Type = SMemoType.FatalError, Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.TOO_RICH_SELLER, Session.Account.Language) }).ConfigureAwait(false); return; } if (amount == item.ItemInstance?.Amount) { inv = InventoryService.AddItemToPocket(InventoryItemInstance.Create(item.ItemInstance, CharacterId)); } else { inv = InventoryService.AddItemToPocket(InventoryItemInstance.Create( ItemProvider.Create(item.ItemInstance?.ItemVNum ?? 0, amount), CharacterId)); } } if (inv?.Count > 0) { inv.ForEach(it => it.CharacterId = CharacterId); var packet = await(shop.Session == null ? Task.FromResult((NInvPacket?)null) : shop.Session.Character.BuyFromAsync(item, amount, slotChar)).ConfigureAwait(false); if (packet != null) { await SendPacketAsync(packet).ConfigureAwait(false); } await SendPacketsAsync( inv.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))).ConfigureAwait(false); await SendPacketAsync(new SMemoPacket { Type = SMemoType.Success, Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.BUY_ITEM_VALID, Session.Account.Language) }).ConfigureAwait(false); if (reputprice == 0) { Gold -= (long)(price * percent); await SendPacketAsync(this.GenerateGold()).ConfigureAwait(false); } else { Reput -= reputprice; await SendPacketAsync(this.GenerateFd()).ConfigureAwait(false); await SendPacketAsync(this.GenerateSay( GameLanguage.Instance.GetMessageFromKey(LanguageKey.REPUT_DECREASED, Session.Account.Language), SayColorType.Purple)).ConfigureAwait(false); } } else { await SendPacketAsync(new MsgiPacket { Message = Game18NConstString.NotEnoughSpace, Type = 0 }).ConfigureAwait(false); } }
public async Task ChangeClassAsync(CharacterClassType classType) { if (Class == classType) { _logger.Error( GameLanguage.Instance.GetMessageFromKey(LanguageKey.CANT_CHANGE_SAME_CLASS, Session.Account.Language)); return; } if (InventoryService.Any(s => s.Value.Type == NoscorePocketType.Wear)) { await SendPacketAsync(new MsgPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.EQ_NOT_EMPTY, AccountLanguage), Type = MessageType.White }).ConfigureAwait(false); return; } JobLevel = 1; JobLevelXp = 0; await SendPacketAsync(new NpInfoPacket()).ConfigureAwait(false); await SendPacketAsync(new PclearPacket()).ConfigureAwait(false); if (classType == CharacterClassType.Adventurer) { HairStyle = HairStyle > HairStyleType.HairStyleB ? 0 : HairStyle; } LoadSpeed(); Class = classType; Hp = MaxHp; Mp = MaxMp; var itemsToAdd = new List <BasicEquipment>(); foreach (var(key, _) in _worldConfiguration.Value.BasicEquipments) { switch (key) { case nameof(CharacterClassType.Adventurer) when Class == CharacterClassType.Adventurer: case nameof(CharacterClassType.Archer) when Class == CharacterClassType.Archer: case nameof(CharacterClassType.Mage) when Class == CharacterClassType.Mage: case nameof(CharacterClassType.MartialArtist) when Class == CharacterClassType.MartialArtist: case nameof(CharacterClassType.Swordsman) when Class == CharacterClassType.Swordsman: itemsToAdd.AddRange(_worldConfiguration.Value.BasicEquipments[key]); break; default: break; } } foreach (var inv in itemsToAdd .Select(itemToAdd => InventoryService.AddItemToPocket(InventoryItemInstance.Create(ItemProvider.Create(itemToAdd.VNum, itemToAdd.Amount), CharacterId), itemToAdd.NoscorePocketType)) .Where(inv => inv != null)) { await SendPacketsAsync( inv !.Select(invItem => invItem.GeneratePocketChange((PocketType)invItem.Type, invItem.Slot))).ConfigureAwait(false); } await SendPacketAsync(this.GenerateTit()).ConfigureAwait(false); await SendPacketAsync(GenerateStat()).ConfigureAwait(false); await MapInstance.SendPacketAsync(this.GenerateEq()).ConfigureAwait(false); await MapInstance.SendPacketAsync(this.GenerateEff(8)).ConfigureAwait(false); //TODO: Faction await SendPacketAsync(this.GenerateCond()).ConfigureAwait(false); await SendPacketAsync(GenerateLev()).ConfigureAwait(false); await SendPacketAsync(this.GenerateCMode()).ConfigureAwait(false); await SendPacketAsync(new MsgPacket { Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.CLASS_CHANGED, Session.Account.Language), Type = MessageType.White }).ConfigureAwait(false); QuicklistEntries = new List <QuicklistEntryDto> { new QuicklistEntryDto { Id = Guid.NewGuid(), CharacterId = CharacterId, QuickListIndex = 0, Slot = 9, Type = 1, IconType = 3, IconVNum = 1 } }; await MapInstance.SendPacketAsync(this.GenerateIn(Prefix ?? ""), new EveryoneBut(Session !.Channel !.Id)).ConfigureAwait(false); await MapInstance.SendPacketAsync(Group !.GeneratePidx(this)).ConfigureAwait(false); await MapInstance.SendPacketAsync(this.GenerateEff(6)).ConfigureAwait(false); await MapInstance.SendPacketAsync(this.GenerateEff(198)).ConfigureAwait(false); }