Example #1
0
        public IItemInstance Convert(IItemInstanceDto k)
        {
            IItemInstance item;

            if (k is BoxInstanceDto)
            {
                item = k.Adapt <BoxInstance>();
            }
            else if (k is SpecialistInstanceDto)
            {
                item = k.Adapt <SpecialistInstance>();
            }
            else if (k is WearableInstanceDto)
            {
                item = k.Adapt <WearableInstance>();
            }
            else if (k is UsableInstanceDto)
            {
                item = k.Adapt <UsableInstance>();
            }
            else
            {
                item = k.Adapt <ItemInstance>();
            }

            item.Item = _items.Find(s => s.VNum == k.ItemVNum)?.Adapt <Item.Item>();
            LoadHandlers(item);
            return(item);
        }
Example #2
0
        public IItemInstance Convert(IItemInstanceDto k)
        {
            IItemInstance item =
                k.Adapt <BoxInstance>() ??
                k.Adapt <SpecialistInstance>() ??
                k.Adapt <WearableInstance>() ??
                k.Adapt <UsableInstance>() ??
                (IItemInstance)k.Adapt <ItemInstance>();

            item.Item = _items.Find(s => s.VNum == k.ItemVNum);
            return(item);
        }
Example #3
0
        private MailData GenerateMailData(MailDto mailref, short itemType, IItemInstanceDto itemInstance,
                                          string receiverName)
        {
            var count = _parcelHolder[mailref.ReceiverId][mailref.IsSenderCopy].Select(s => s.Key).DefaultIfEmpty(-1)
                        .Max();
            var sender = mailref.SenderId != null
                ? _characterDto.FirstOrDefault(s => s.CharacterId == mailref.SenderId).Name : "NOSMALL";

            return(new MailData
            {
                ReceiverName = receiverName,
                MailId = (short)++count,
                MailDto = mailref,
                ItemInstance = itemInstance.Adapt <ItemInstanceDto>(),
                ItemType = itemType,
                SenderName = sender
            });
        }
        public IItemInstance Convert(IItemInstanceDto k)
        {
            IItemInstance item = k switch
            {
                BoxInstanceDto _ => k.Adapt <BoxInstance>(),
                SpecialistInstanceDto _ => k.Adapt <SpecialistInstance>(),
                WearableInstanceDto _ => k.Adapt <WearableInstance>(),
                UsableInstanceDto _ => k.Adapt <UsableInstance>(),
                _ => k.Adapt <ItemInstance>()
            };

            item.Item = _items.Find(s => s.VNum == k.ItemVNum)?.Adapt <Item.Item>();
            if (item.Item != null)
            {
                _runner?.LoadHandlers(item.Item);
            }

            return(item);
        }
Example #5
0
        private MailRequest GenerateMailRequest(ICharacterEntity characterEntity, long receiverId,
                                                [CanBeNull] IItemInstanceDto itemInstance,
                                                short?vnum, short?amount, sbyte?rare,
                                                byte?upgrade, bool isNosmall, string title, string text)
        {
            var mail = new MailDto
            {
                IsOpened             = false,
                Date                 = SystemTime.Now(),
                ReceiverId           = receiverId,
                IsSenderCopy         = false,
                ItemInstanceId       = itemInstance?.Id,
                Title                = isNosmall ? "NOSMALL" : title ?? characterEntity.Name,
                Message              = text,
                SenderId             = isNosmall ? (long?)null : characterEntity.VisualId,
                SenderCharacterClass = isNosmall ? (CharacterClassType?)null : characterEntity.Class,
                SenderGender         = isNosmall ? (GenderType?)null : characterEntity.Gender,
                SenderHairColor      = isNosmall ? (HairColorType?)null : characterEntity.HairColor,
                SenderHairStyle      = isNosmall ? (HairStyleType?)null : characterEntity.HairStyle,
                Hat             = isNosmall ? null : characterEntity.Equipment.Hat,
                Armor           = isNosmall ? null : characterEntity.Equipment.Armor,
                MainWeapon      = isNosmall ? null : characterEntity.Equipment.MainWeapon,
                SecondaryWeapon = isNosmall ? null : characterEntity.Equipment.SecondaryWeapon,
                Mask            = isNosmall ? null : characterEntity.Equipment.Mask,
                Fairy           = isNosmall ? null : characterEntity.Equipment.Fairy,
                CostumeSuit     = isNosmall ? null : characterEntity.Equipment.CostumeSuit,
                CostumeHat      = isNosmall ? null : characterEntity.Equipment.CostumeHat,
                WeaponSkin      = isNosmall ? null : characterEntity.Equipment.WeaponSkin,
                WingSkin        = isNosmall ? null : characterEntity.Equipment.WingSkin,
                SenderMorphId   = isNosmall ? (short?)null : characterEntity.Morph == 0 ? (short)-1
                    : (short)(characterEntity.Morph > short.MaxValue ? 0 : characterEntity.Morph)
            };

            return(new MailRequest {
                Mail = mail, VNum = vnum, Amount = amount, Rare = rare, Upgrade = upgrade
            });
        }
Example #6
0
 public void SendGift(ICharacterEntity characterEntity, long receiverId, IItemInstanceDto itemInstance,
                      bool isNosmall)
 {
     Post <bool>(GenerateMailRequest(characterEntity, receiverId, itemInstance, null, null, null, null, isNosmall,
                                     null, null));
 }
Example #7
0
        public override async Task ExecuteAsync(CRegPacket cRegPacket, ClientSession clientSession)
        {
            var medal = clientSession.Character.StaticBonusList.FirstOrDefault(s =>
                                                                               (s.StaticBonusType == StaticBonusType.BazaarMedalGold) ||
                                                                               (s.StaticBonusType == StaticBonusType.BazaarMedalSilver));

            var price  = cRegPacket.Price * cRegPacket.Amount;
            var taxmax = price > 100000 ? price / 200 : 500;
            var taxmin = price >= 4000 ? 60 + (price - 4000) / 2000 * 30 > 10000 ? 10000
                : 60 + (price - 4000) / 2000 * 30 : 50;
            var tax     = medal == null ? taxmax : taxmin;
            var maxGold = _configuration.MaxGoldAmount;

            if (clientSession.Character.Gold < tax)
            {
                await clientSession.SendPacketAsync(new MsgiPacket
                {
                    Message = Game18NConstString.NotEnoughGold
                }).ConfigureAwait(false);

                return;
            }

            var it = clientSession.Character.InventoryService !.LoadBySlotAndType(cRegPacket.Slot,
                                                                                  cRegPacket.Inventory == 4 ? 0 : (NoscorePocketType)cRegPacket.Inventory);

            if ((it?.ItemInstance == null) || !it.ItemInstance.Item !.IsSoldable || (it.ItemInstance.BoundCharacterId != null) ||
                (cRegPacket.Amount > it.ItemInstance.Amount))
            {
                return;
            }

            if (price > (medal == null ? 100000000 : maxGold))
            {
                await clientSession.SendPacketAsync(new MsgPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.PRICE_EXCEEDED,
                                                                      clientSession.Account.Language)
                }).ConfigureAwait(false);

                return;
            }

            if ((medal == null) && (cRegPacket.Durability > 1))
            {
                return;
            }

            short duration;

            switch (cRegPacket.Durability)
            {
            case 1:
                duration = 24;
                break;

            case 2:
                duration = 168;
                break;

            case 3:
                duration = 360;
                break;

            case 4:
                duration = 720;
                break;

            default:
                return;
            }

            var bazar = clientSession.Character.InventoryService.LoadBySlotAndType(cRegPacket.Slot,
                                                                                   cRegPacket.Inventory == 4 ? NoscorePocketType.Equipment : (NoscorePocketType)cRegPacket.Inventory);

            if (bazar?.ItemInstance == null)
            {
                return;
            }
            IItemInstanceDto bazaaritem = bazar.ItemInstance;

            bazaaritem = (await _itemInstanceDao.TryInsertOrUpdateAsync(bazaaritem).ConfigureAwait(false)) !;

            var result = await _bazaarHttpClient.AddBazaarAsync(new BazaarRequest
            {
                ItemInstanceId = bazaaritem.Id,
                CharacterId    = clientSession.Character.CharacterId,
                CharacterName  = clientSession.Character.Name,
                HasMedal       = medal != null,
                Price          = cRegPacket.Price,
                IsPackage      = cRegPacket.IsPackage,
                Duration       = duration,
                Amount         = cRegPacket.Amount
            }).ConfigureAwait(false);

            switch (result)
            {
            case LanguageKey.LIMIT_EXCEEDED:
                await clientSession.SendPacketAsync(new MsgPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.LIMIT_EXCEEDED,
                                                                      clientSession.Account.Language)
                }).ConfigureAwait(false);

                break;

            case LanguageKey.OBJECT_IN_BAZAAR:
                if (bazar.ItemInstance.Amount == cRegPacket.Amount)
                {
                    await _inventoryItemInstanceDao.TryDeleteAsync(bazar.Id).ConfigureAwait(false);

                    clientSession.Character.InventoryService.DeleteById(bazar.ItemInstanceId);
                }
                else
                {
                    clientSession.Character.InventoryService.RemoveItemAmountFromInventory(cRegPacket.Amount,
                                                                                           bazar.ItemInstanceId);
                }

                await clientSession.SendPacketAsync(((InventoryItemInstance?)null).GeneratePocketChange(
                                                        cRegPacket.Inventory == 4 ? PocketType.Equipment : (PocketType)cRegPacket.Inventory,
                                                        cRegPacket.Slot)).ConfigureAwait(false);

                clientSession.Character.Gold -= tax;
                await clientSession.SendPacketAsync(clientSession.Character.GenerateGold()).ConfigureAwait(false);

                await clientSession.SendPacketAsync(clientSession.Character.GenerateSay(GameLanguage.Instance.GetMessageFromKey(
                                                                                            LanguageKey.OBJECT_IN_BAZAAR,
                                                                                            clientSession.Account.Language), SayColorType.Yellow)).ConfigureAwait(false);

                await clientSession.SendPacketAsync(new MsgPacket
                {
                    Message = GameLanguage.Instance.GetMessageFromKey(LanguageKey.OBJECT_IN_BAZAAR,
                                                                      clientSession.Account.Language)
                }).ConfigureAwait(false);

                await clientSession.SendPacketAsync(new RCRegPacket { Type = VisualType.Player }).ConfigureAwait(false);

                break;
            }
        }
Example #8
0
        public override void Execute(CRegPacket cRegPacket, ClientSession clientSession)
        {
            if (clientSession.Character.InExchangeOrTrade)
            {
                return;
            }

            var medal = clientSession.Character.StaticBonusList.FirstOrDefault(s =>
                                                                               (s.StaticBonusType == StaticBonusType.BazaarMedalGold) ||
                                                                               (s.StaticBonusType == StaticBonusType.BazaarMedalSilver));

            var price  = cRegPacket.Price * cRegPacket.Amount;
            var taxmax = price > 100000 ? price / 200 : 500;
            var taxmin = price >= 4000 ? 60 + (price - 4000) / 2000 * 30 > 10000 ? 10000
                : 60 + (price - 4000) / 2000 * 30 : 50;
            var tax     = medal == null ? taxmax : taxmin;
            var maxGold = _configuration.MaxGoldAmount;

            if (clientSession.Character.Gold < tax)
            {
                clientSession.SendPacket(new MsgPacket
                {
                    Message = Language.Instance.GetMessageFromKey(LanguageKey.NOT_ENOUGH_MONEY,
                                                                  clientSession.Account.Language)
                });
                return;
            }

            if ((cRegPacket.Amount <= 0) || clientSession.Character.InExchangeOrShop)
            {
                return;
            }

            var it = clientSession.Character.InventoryService.LoadBySlotAndType(cRegPacket.Slot,
                                                                                cRegPacket.Inventory == 4 ? 0 : (NoscorePocketType)cRegPacket.Inventory);

            if ((it == null) || !it.ItemInstance.Item.IsSoldable || (it.ItemInstance.BoundCharacterId != null) ||
                (cRegPacket.Amount > it.ItemInstance.Amount))
            {
                return;
            }

            if (price > (medal == null ? 100000000 : maxGold))
            {
                clientSession.SendPacket(new MsgPacket
                {
                    Message = Language.Instance.GetMessageFromKey(LanguageKey.PRICE_EXCEEDED,
                                                                  clientSession.Account.Language)
                });
                return;
            }

            if ((medal == null) && (cRegPacket.Durability > 1))
            {
                return;
            }

            short duration;

            switch (cRegPacket.Durability)
            {
            case 1:
                duration = 24;
                break;

            case 2:
                duration = 168;
                break;

            case 3:
                duration = 360;
                break;

            case 4:
                duration = 720;
                break;

            default:
                return;
            }

            var bazar = clientSession.Character.InventoryService.LoadBySlotAndType(cRegPacket.Slot,
                                                                                   cRegPacket.Inventory == 4 ? NoscorePocketType.Equipment : (NoscorePocketType)cRegPacket.Inventory);
            IItemInstanceDto bazaaritem = bazar.ItemInstance;

            _itemInstanceDao.InsertOrUpdate(ref bazaaritem);

            var result = _bazaarHttpClient.AddBazaar(new BazaarRequest
            {
                ItemInstanceId = bazar.ItemInstance.Id,
                CharacterId    = clientSession.Character.CharacterId,
                CharacterName  = clientSession.Character.Name,
                HasMedal       = medal != null,
                Price          = cRegPacket.Price,
                IsPackage      = cRegPacket.IsPackage != 0,
                Duration       = duration,
                Amount         = cRegPacket.Amount
            });

            switch (result)
            {
            case LanguageKey.LIMIT_EXCEEDED:
                clientSession.SendPacket(new MsgPacket
                {
                    Message = Language.Instance.GetMessageFromKey(LanguageKey.LIMIT_EXCEEDED,
                                                                  clientSession.Account.Language)
                });
                break;

            case LanguageKey.OBJECT_IN_BAZAAR:
                if (bazar.ItemInstance.Amount == cRegPacket.Amount)
                {
                    _inventoryItemInstanceDao.Delete(bazar.Id);
                    clientSession.Character.InventoryService.DeleteById(bazar.ItemInstanceId);
                }
                else
                {
                    clientSession.Character.InventoryService.RemoveItemAmountFromInventory(cRegPacket.Amount,
                                                                                           bazar.ItemInstanceId);
                }

                clientSession.SendPacket(((InventoryItemInstance)null).GeneratePocketChange(
                                             cRegPacket.Inventory == 4 ? PocketType.Equipment : (PocketType)cRegPacket.Inventory,
                                             cRegPacket.Slot));
                clientSession.Character.Gold -= tax;
                clientSession.SendPacket(clientSession.Character.GenerateGold());

                clientSession.SendPacket(clientSession.Character.GenerateSay(Language.Instance.GetMessageFromKey(
                                                                                 LanguageKey.OBJECT_IN_BAZAAR,
                                                                                 clientSession.Account.Language), SayColorType.Yellow));
                clientSession.SendPacket(new MsgPacket
                {
                    Message = Language.Instance.GetMessageFromKey(LanguageKey.OBJECT_IN_BAZAAR,
                                                                  clientSession.Account.Language)
                });

                clientSession.SendPacket(new RCRegPacket {
                    Type = VisualType.Player
                });
                break;
            }
        }
Example #9
0
        public bool SendMail([FromBody] MailRequest mail)
        {
            var mailref   = mail.Mail;
            var receivdto = _characterDto.FirstOrDefault(s => s.CharacterId == mailref.ReceiverId);

            if (receivdto == null)
            {
                return(false);
            }

            var receiverName = receivdto.Name;
            var it           = _items.Find(item => item.VNum == mail.VNum);
            IItemInstanceDto itemInstance = null;

            if ((mail.Mail.ItemInstanceId == null) && (mail.VNum != null))
            {
                if (it == null)
                {
                    return(false);
                }

                if ((it.ItemType != ItemType.Weapon) && (it.ItemType != ItemType.Armor) &&
                    (it.ItemType != ItemType.Specialist))
                {
                    mail.Upgrade = 0;
                }
                else if ((it.ItemType != ItemType.Weapon) && (it.ItemType != ItemType.Armor))
                {
                    mail.Rare = 0;
                }

                if ((mail.Rare > 8) || (mail.Rare < -2))
                {
                    mail.Rare = 0;
                }

                if ((mail.Upgrade > 10) && (it.ItemType != ItemType.Specialist))
                {
                    mail.Upgrade = 0;
                }
                else if ((it.ItemType == ItemType.Specialist) && (mail.Upgrade > 15))
                {
                    mail.Upgrade = 0;
                }

                if (mail.Amount == 0)
                {
                    mail.Amount = 1;
                }

                mail.Amount = (it.Type == NoscorePocketType.Etc) || (it.Type == NoscorePocketType.Main) ? mail.Amount
                    : 1;
                itemInstance = _itemProvider.Create((short)mail.VNum, (short)mail.Amount, (sbyte)mail.Rare,
                                                    (byte)mail.Upgrade);
                if (itemInstance == null)
                {
                    return(false);
                }

                _itemInstanceDao.InsertOrUpdate(ref itemInstance);
                mailref.ItemInstanceId = itemInstance.Id;
            }

            var receiver = _connectedAccountHttpClient.GetCharacter(mailref.ReceiverId, null);
            var sender   = _connectedAccountHttpClient.GetCharacter(mailref.SenderId, null);

            _mailDao.InsertOrUpdate(ref mailref);
            var mailData = GenerateMailData(mailref, (short?)it?.ItemType ?? -1, itemInstance, receiverName);

            _parcelHolder[mailref.ReceiverId][mailData.MailDto.IsSenderCopy].TryAdd(mailData.MailId, mailData);
            Notify(0, receiver, mailData);

            if (mailref.SenderId != null)
            {
                mailref.IsSenderCopy = true;
                mailref.MailId       = 0;
                itemInstance.Id      = new Guid();
                _itemInstanceDao.InsertOrUpdate(ref itemInstance);
                mailref.ItemInstanceId = itemInstance.Id;
                _mailDao.InsertOrUpdate(ref mailref);
                var mailDataCopy = GenerateMailData(mailref, (short?)it?.ItemType ?? -1, itemInstance, receiverName);
                _parcelHolder[mailref.ReceiverId][mailDataCopy.MailDto.IsSenderCopy]
                .TryAdd(mailDataCopy.MailId, mailDataCopy);
                Notify(0, receiver, mailDataCopy);
            }

            return(true);
        }
Example #10
0
 public Task SendGiftAsync(ICharacterEntity characterEntity, long receiverId, IItemInstanceDto itemInstance,
                           bool isNosmall)
 {
     return(PostAsync <bool>(GenerateMailRequest(characterEntity, receiverId, itemInstance, null, null, null, null, isNosmall,
                                                 null, null)));
 }