server-master/srcs/_plugins/WingsEmu.Plugins.BasicImplementation/ItemUsage/Etc/UpgradeItemsHandler.cs
2026-02-10 18:21:30 +01:00

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;
}
}
}