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); }
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); }
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); }
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 }); }
public void SendGift(ICharacterEntity characterEntity, long receiverId, IItemInstanceDto itemInstance, bool isNosmall) { Post <bool>(GenerateMailRequest(characterEntity, receiverId, itemInstance, null, null, null, null, isNosmall, null, null)); }
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; } }
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; } }
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); }
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))); }