243 lines
No EOL
11 KiB
C#
243 lines
No EOL
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
|
|
using WingsAPI.Game.Extensions.MinilandExtensions;
|
|
using WingsEmu.DTOs.Bonus;
|
|
using WingsEmu.DTOs.Items;
|
|
using WingsEmu.DTOs.Maps;
|
|
using WingsEmu.Game;
|
|
using WingsEmu.Game._enum;
|
|
using WingsEmu.Game._i18n;
|
|
using WingsEmu.Game._ItemUsage;
|
|
using WingsEmu.Game._ItemUsage.Event;
|
|
using WingsEmu.Game.Act4.Event;
|
|
using WingsEmu.Game.Battle;
|
|
using WingsEmu.Game.Buffs;
|
|
using WingsEmu.Game.Characters.Events;
|
|
using WingsEmu.Game.Configurations;
|
|
using WingsEmu.Game.Configurations.Miniland;
|
|
using WingsEmu.Game.Extensions;
|
|
using WingsEmu.Game.Inventory;
|
|
using WingsEmu.Game.Items;
|
|
using WingsEmu.Game.Managers;
|
|
using WingsEmu.Game.Networking;
|
|
using WingsEmu.Packets.Enums;
|
|
using WingsEmu.Packets.Enums.Chat;
|
|
|
|
namespace WingsEmu.Plugins.BasicImplementations.ItemUsage.Main.Special;
|
|
|
|
public class GeneralItemsHandler : IItemHandler
|
|
{
|
|
private readonly IBankReputationConfiguration _bankReputationConfiguration;
|
|
private readonly IBuffFactory _buffFactory;
|
|
private readonly IGameItemInstanceFactory _gameItemInstanceFactory;
|
|
private readonly IGameLanguageService _gameLanguage;
|
|
private readonly MinigameConfiguration _minigameConfiguration;
|
|
private readonly IRandomGenerator _randomGenerator;
|
|
private readonly IRankingManager _rankingManager;
|
|
private readonly IReputationConfiguration _reputationConfiguration;
|
|
private readonly ISessionManager _sessionManager;
|
|
|
|
private readonly HashSet<ItemVnums> _tarots = new()
|
|
{
|
|
ItemVnums.SEALED_TAROT_FOOL,
|
|
ItemVnums.SEALED_TAROT_MAGICIAN,
|
|
ItemVnums.SEALED_TAROT_LOVERS,
|
|
ItemVnums.SEALED_TAROT_HERMIT,
|
|
ItemVnums.SEALED_TAROT_DEATH,
|
|
ItemVnums.SEALED_TAROT_DEVIL,
|
|
ItemVnums.SEALED_TAROT_TOWER,
|
|
ItemVnums.SEALED_TAROT_STAR,
|
|
ItemVnums.SEALED_TAROT_MOON,
|
|
ItemVnums.SEALED_TAROT_SUN
|
|
};
|
|
|
|
public GeneralItemsHandler(IGameLanguageService gameLanguage, IBuffFactory buffFactory, IRandomGenerator randomGenerator,
|
|
ISessionManager sessionManager, MinigameConfiguration minigameConfiguration, IGameItemInstanceFactory gameItemInstanceFactory, IReputationConfiguration reputationConfiguration,
|
|
IBankReputationConfiguration bankReputationConfiguration, IRankingManager rankingManager)
|
|
{
|
|
_gameLanguage = gameLanguage;
|
|
_buffFactory = buffFactory;
|
|
_randomGenerator = randomGenerator;
|
|
_sessionManager = sessionManager;
|
|
_minigameConfiguration = minigameConfiguration;
|
|
_gameItemInstanceFactory = gameItemInstanceFactory;
|
|
_reputationConfiguration = reputationConfiguration;
|
|
_bankReputationConfiguration = bankReputationConfiguration;
|
|
_rankingManager = rankingManager;
|
|
}
|
|
|
|
public ItemType ItemType => ItemType.Special;
|
|
public long[] Effects => new long[] { 0 };
|
|
|
|
public async Task HandleAsync(IClientSession session, InventoryUseItemEvent e)
|
|
{
|
|
switch ((ItemVnums)e.Item.ItemInstance.ItemVNum)
|
|
{
|
|
case ItemVnums.SOULSTONE_BLESSING:
|
|
case ItemVnums.SOULSTONE_BLESSING_LIMITED:
|
|
Buff itemBuff = session.PlayerEntity.BuffComponent.GetBuff((short)BuffVnums.SOULSTONE_BLESSING);
|
|
if (itemBuff != null)
|
|
{
|
|
string buffName = _gameLanguage.GetLanguage(GameDataType.Card, itemBuff.Name, session.UserLanguage);
|
|
session.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.ITEM_CHATMESSAGE_CANT_USE_TWICE, session.UserLanguage, buffName), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.UseSp)
|
|
{
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_NO_SPECIALIST_CARD, session.UserLanguage), MsgMessageType.Middle);
|
|
return;
|
|
}
|
|
|
|
await session.PlayerEntity.AddBuffAsync(_buffFactory.CreateOneHourBuff(session.PlayerEntity, (short)BuffVnums.SOULSTONE_BLESSING, BuffFlag.BIG_AND_KEEP_ON_LOGOUT));
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
break;
|
|
case ItemVnums.PRODUCTION_COUPON:
|
|
if (session.PlayerEntity.MinilandPoint >= _minigameConfiguration.Configuration.MaxmimumMinigamePoints)
|
|
{
|
|
session.SendInfo(_gameLanguage.GetLanguage(GameDialogKey.MINIGAME_INFO_POINTS_FULL, session.UserLanguage));
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.HasItem(_minigameConfiguration.Configuration.ProductionCouponVnum))
|
|
{
|
|
return;
|
|
}
|
|
|
|
await session.RemoveItemFromInventory(_minigameConfiguration.Configuration.ProductionCouponVnum);
|
|
session.AddMinigamePoints(_minigameConfiguration.Configuration.ProductionCouponPointsAmount, _minigameConfiguration);
|
|
break;
|
|
case ItemVnums.SCROLL_CHICKEN:
|
|
session.SendWopenPacket(WindowType.CHICKEN_FREE_SCROLL);
|
|
break;
|
|
case ItemVnums.SCROLL_PYJAMA:
|
|
session.SendWopenPacket(WindowType.PAJAMA_FREE_SCROLL);
|
|
break;
|
|
case ItemVnums.SCROLL_PIRATE:
|
|
session.SendWopenPacket(WindowType.PIRATE_FREE_SCROLL);
|
|
break;
|
|
case ItemVnums.FAIRY_EXPERIENCE_POTION:
|
|
case ItemVnums.FAIRY_EXPERIENCE_POTION_LIMITED:
|
|
Buff buff = session.PlayerEntity.BuffComponent.GetBuff((short)BuffVnums.FAIRYXP_POTION);
|
|
if (buff != null)
|
|
{
|
|
string buffName = _gameLanguage.GetLanguage(GameDataType.Card, buff.Name, session.UserLanguage);
|
|
session.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.ITEM_CHATMESSAGE_CANT_USE_TWICE, session.UserLanguage, buffName), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
session.PlayerEntity.AddBuffAsync(_buffFactory.CreateOneHourBuff(session.PlayerEntity, (short)BuffVnums.FAIRYXP_POTION, BuffFlag.BIG_AND_KEEP_ON_LOGOUT))
|
|
.ConfigureAwait(false).GetAwaiter().GetResult();
|
|
break;
|
|
case ItemVnums.PERFUME:
|
|
session.SendGuriPacket(18, 1);
|
|
break;
|
|
case ItemVnums.RAINBOW_PEARL:
|
|
session.SendGuriPacket(18);
|
|
break;
|
|
case ItemVnums.MAGIC_ERASER:
|
|
if (e.Packet == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (e.Packet.Length < 9)
|
|
{
|
|
// MODIFIED PACKET
|
|
return;
|
|
}
|
|
|
|
if (!short.TryParse(e.Packet[9], out short eqSlot) ||
|
|
!Enum.TryParse(e.Packet[8], out InventoryType eqType))
|
|
{
|
|
return;
|
|
}
|
|
|
|
InventoryItem eq = session.PlayerEntity.GetItemBySlotAndType(eqSlot, eqType);
|
|
if (eq == null)
|
|
{
|
|
// PACKET MODIFIED
|
|
return;
|
|
}
|
|
|
|
if (eq.ItemInstance.Type != ItemInstanceType.WearableInstance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
GameItemInstance eqItem = eq.ItemInstance;
|
|
|
|
if (eqItem.GameItem.ItemType != ItemType.Armor && eqItem.GameItem.ItemType != ItemType.Weapon)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (eqItem.EquipmentOptions == null || !eqItem.EquipmentOptions.Any())
|
|
{
|
|
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.ITEM_MESSAGE_ERASER_NO_SHELL, session.UserLanguage), ChatMessageColorType.Red);
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.ITEM_MESSAGE_ERASER_NO_SHELL, session.UserLanguage), MsgMessageType.Middle);
|
|
return;
|
|
}
|
|
|
|
eqItem.EquipmentOptions.Clear();
|
|
eqItem.ShellRarity = null;
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.SHELLS_SHOUTMESSAGE_ERASED, session.UserLanguage), MsgMessageType.Middle);
|
|
session.SendGuriPacket(17, 1);
|
|
break;
|
|
case ItemVnums.TAROT_CARD_GAME:
|
|
var tarots = _tarots.ToList();
|
|
for (int i = 0; i < 5; i++)
|
|
{
|
|
int rndIndex = _randomGenerator.RandomNumber(tarots.Count);
|
|
int newItemVnum = (int)tarots[rndIndex];
|
|
|
|
GameItemInstance newItem = _gameItemInstanceFactory.CreateItem(newItemVnum);
|
|
await session.AddNewItemToInventory(newItem, sendGiftIsFull: true);
|
|
tarots.RemoveAt(rndIndex);
|
|
}
|
|
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
break;
|
|
case ItemVnums.CUARRY_BANK_SAVINGS_BOOK:
|
|
session.SendGbPacket(BankType.BankMoney, _reputationConfiguration, _bankReputationConfiguration, _rankingManager.TopReputation);
|
|
session.SendSMemo(SmemoType.BankInfo, _gameLanguage.GetLanguageFormat(GameDialogKey.BANK_MESSAGE_BALANCE, session.UserLanguage, session.Account.BankMoney));
|
|
break;
|
|
case ItemVnums.ANGEL_BASE_FLAG:
|
|
case ItemVnums.DEMON_BASE_FLAG:
|
|
if (!session.CurrentMapInstance.HasMapFlag(MapFlags.ACT_4))
|
|
{
|
|
return;
|
|
}
|
|
|
|
await session.EmitEventAsync(new Act4PutFlagEvent
|
|
{
|
|
InventoryItem = e.Item
|
|
});
|
|
break;
|
|
case ItemVnums.CUARRY_BANK_VIP_10:
|
|
case ItemVnums.CUARRY_BANK_VIP_30:
|
|
if (session.PlayerEntity.HaveStaticBonus(StaticBonusType.CuarryBankMedal))
|
|
{
|
|
return;
|
|
}
|
|
|
|
DateTime dateEnd = DateTime.UtcNow.AddDays(e.Item.ItemInstance.GameItem.Id == (short)ItemVnums.CUARRY_BANK_VIP_10 ? 10 : 30);
|
|
await session.EmitEventAsync(new AddStaticBonusEvent(new CharacterStaticBonusDto
|
|
{
|
|
DateEnd = dateEnd,
|
|
ItemVnum = e.Item.ItemInstance.GameItem.Id,
|
|
StaticBonusType = StaticBonusType.CuarryBankMedal
|
|
}));
|
|
|
|
await session.RemoveItemFromInventory(item: e.Item);
|
|
string name = _gameLanguage.GetLanguage(GameDataType.Item, e.Item.ItemInstance.GameItem.Name, session.UserLanguage);
|
|
session.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.ITEM_CHATMESSAGE_EFFECT_ACTIVATED, session.UserLanguage, name), ChatMessageColorType.Green);
|
|
break;
|
|
}
|
|
}
|
|
} |