137 lines
No EOL
4.5 KiB
C#
137 lines
No EOL
4.5 KiB
C#
// WingsEmu
|
|
//
|
|
// Developed by NosWings Team
|
|
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
using PhoenixLib.Logging;
|
|
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
|
|
using WingsEmu.DTOs.Items;
|
|
using WingsEmu.Game._i18n;
|
|
using WingsEmu.Game._ItemUsage;
|
|
using WingsEmu.Game._ItemUsage.Event;
|
|
using WingsEmu.Game.Characters.Events;
|
|
using WingsEmu.Game.Extensions;
|
|
using WingsEmu.Game.Inventory;
|
|
using WingsEmu.Game.Managers;
|
|
using WingsEmu.Game.Networking;
|
|
using WingsEmu.Packets.Enums;
|
|
using WingsEmu.Packets.Enums.Chat;
|
|
|
|
namespace WingsEmu.Plugins.BasicImplementations.ItemUsage.Etc;
|
|
|
|
public class UpgradeItemsHandler : IItemHandler
|
|
{
|
|
private readonly IGameLanguageService _gameLanguage;
|
|
private readonly IServerManager _serverManager;
|
|
|
|
public UpgradeItemsHandler(IGameLanguageService gameLanguage, IServerManager serverManager)
|
|
{
|
|
_gameLanguage = gameLanguage;
|
|
_serverManager = serverManager;
|
|
}
|
|
|
|
private int[] _scrolls => new[] { 26, 27, 28, 61 };
|
|
|
|
public ItemType ItemType => ItemType.Upgrade;
|
|
public long[] Effects => new long[] { 0 };
|
|
|
|
public async Task HandleAsync(IClientSession session, InventoryUseItemEvent e)
|
|
{
|
|
string[] packetsplit = e.Packet;
|
|
InventoryItem inv = e.Item;
|
|
int effectValue = e.Item.ItemInstance.GameItem.EffectValue;
|
|
|
|
// If it's a scroll
|
|
if (_scrolls.Contains(effectValue))
|
|
{
|
|
session.SendGuriPacket(12, value: effectValue);
|
|
return;
|
|
}
|
|
|
|
if (packetsplit == null || packetsplit.Length <= 9)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!byte.TryParse(packetsplit[8], out byte typeEquip) ||
|
|
!short.TryParse(packetsplit[9], out short slotEquip))
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsSitting)
|
|
{
|
|
await session.EmitEventAsync(new PlayerRestEvent
|
|
{
|
|
RestTeamMemberMates = false
|
|
});
|
|
}
|
|
|
|
|
|
switch (inv.ItemInstance.ItemVNum)
|
|
{
|
|
case 1219:
|
|
InventoryItem equip = session.PlayerEntity.GetItemBySlotAndType(slotEquip, (InventoryType)typeEquip);
|
|
|
|
if (equip == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (equip.ItemInstance.Type != ItemInstanceType.WearableInstance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!equip.ItemInstance.IsFixed)
|
|
{
|
|
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.GAMBLING_CHATMESSAGE_ITEM_IS_FIXED, session.UserLanguage), ChatMessageColorType.Red);
|
|
return;
|
|
}
|
|
|
|
await session.RemoveItemFromInventory(inv.ItemInstance.ItemVNum);
|
|
equip.ItemInstance.IsFixed = false;
|
|
session.SendPacket(session.PlayerEntity.GenerateEffectPacket(3003));
|
|
session.SendGuriPacket(17, 1, slotEquip);
|
|
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.ITEM_CHATMESSAGE_UNFIXED, session.UserLanguage), ChatMessageColorType.Green);
|
|
|
|
break;
|
|
|
|
case 1365:
|
|
case 9039:
|
|
InventoryItem specialist = session.PlayerEntity.GetItemBySlotAndType(slotEquip, (InventoryType)typeEquip);
|
|
if (specialist == null)
|
|
{
|
|
Log.Debug("Not a SP selected.");
|
|
return;
|
|
}
|
|
|
|
if (specialist.ItemInstance.Type != ItemInstanceType.SpecialistInstance)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (specialist.ItemInstance.Rarity != -2)
|
|
{
|
|
Log.Debug("SP is not destroyed.");
|
|
return;
|
|
}
|
|
|
|
specialist.ItemInstance.Rarity = 0;
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.SPECIALIST_SHOUTMESSAGE_RESURRECTED, session.UserLanguage), MsgMessageType.Middle);
|
|
session.SendGuriPacket(13, 1, 1);
|
|
|
|
session.PlayerEntity.SpPointsBasic = _serverManager.MaxBasicSpPoints;
|
|
if (session.PlayerEntity.SpPointsBasic > _serverManager.MaxBasicSpPoints)
|
|
{
|
|
session.PlayerEntity.SpPointsBasic = _serverManager.MaxBasicSpPoints;
|
|
}
|
|
|
|
await session.RemoveItemFromInventory(inv.ItemInstance.ItemVNum);
|
|
session.RefreshSpPoint();
|
|
session.SendInventoryAddPacket(specialist);
|
|
break;
|
|
}
|
|
}
|
|
} |