示例#1
0
        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));
        }
示例#2
0
        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);
        }
示例#3
0
        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);
            }
        }
示例#4
0
        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);
        }