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

120 lines
No EOL
4.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
using WingsEmu.DTOs.Items;
using WingsEmu.Game;
using WingsEmu.Game._enum;
using WingsEmu.Game._Guri;
using WingsEmu.Game._Guri.Event;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Inventory;
using WingsEmu.Game.Items;
using WingsEmu.Game.Managers.StaticData;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Guri;
public class RelictExaminationEventHandler : IGuriHandler
{
private readonly IDropRarityConfigurationProvider _dropRarityConfigurationProvider;
private readonly IGameItemInstanceFactory _gameItemInstanceFactory;
private readonly IItemsManager _itemsManager;
private readonly IRandomGenerator _randomGenerator;
private readonly RelictConfiguration _relictConfiguration;
public RelictExaminationEventHandler(RelictConfiguration relictConfiguration, IRandomGenerator randomGenerator, IItemsManager itemsManager, IGameItemInstanceFactory gameItemInstanceFactory,
IDropRarityConfigurationProvider dropRarityConfigurationProvider)
{
_relictConfiguration = relictConfiguration;
_randomGenerator = randomGenerator;
_itemsManager = itemsManager;
_gameItemInstanceFactory = gameItemInstanceFactory;
_dropRarityConfigurationProvider = dropRarityConfigurationProvider;
}
public long GuriEffectId => 1502;
public async Task ExecuteAsync(IClientSession session, GuriEvent e)
{
// 10000 => UNKNOWN RELICT
// 30000 => MYSTERIOUS RELICT
if (e.Packet.Length != 4)
{
return;
}
if (session.PlayerEntity.Level < 60)
{
session.SendMsg(session.GetLanguage(GameDialogKey.ITEM_SHOUTMESSAGE_RELICT_LOW_LEVEL), MsgMessageType.Middle);
return;
}
if (!int.TryParse(e.Packet[3], out int effect))
{
return;
}
int relictVnum = effect == 30000 ? (int)ItemVnums.MYSTERIOUS_RELICT : (int)ItemVnums.UNKNOWN_RELICT;
InventoryItem relictItem = session.PlayerEntity.GetFirstItemByVnum(relictVnum);
if (relictItem == null)
{
await e.Sender.NotifyStrangeBehavior(StrangeBehaviorSeverity.ABUSING, "Tried to examinate a relict without having one.");
return;
}
RelictConfigurationInfo relictInfo = _relictConfiguration.FirstOrDefault(s => s.RelictVnum == relictVnum);
if (relictInfo == null)
{
return;
}
if (session.PlayerEntity.Gold < relictInfo.ExaminationCost)
{
return;
}
session.PlayerEntity.RemoveGold(relictInfo.ExaminationCost);
await session.RemoveItemFromInventory(item: relictItem, amount: 1);
var randomBag = new RandomBag<RelictRollCategory>(_randomGenerator);
foreach (RelictRollCategory relictRollCategory in relictInfo.Rolls)
{
randomBag.AddEntry(relictRollCategory, relictRollCategory.Chance);
}
RelictRollCategory rndCategory = randomBag.GetRandom();
RelictRollItem rndItem = rndCategory.Items.ElementAt(_randomGenerator.RandomNumber(rndCategory.Items.Count));
IGameItem item = _itemsManager.GetItem(rndItem.ItemVnum);
sbyte rarity = _dropRarityConfigurationProvider.GetRandomRarity(item.ItemType);
GameItemInstance itemToAdd = _gameItemInstanceFactory.CreateItem(rndItem.ItemVnum, rndItem.Amount, 0, rarity);
InventoryItem inventoryItem = await session.AddNewItemToInventory(itemToAdd, true, sendGiftIsFull: true);
session.SendPdtiPacket(PdtiType.ItemIdentificationSuccessful, rndItem.ItemVnum, (short)rndItem.Amount, inventoryItem.Slot, itemToAdd.Upgrade, rarity);
session.SendSound(SoundType.CRAFTING_SUCCESS);
session.RefreshGold();
session.SendShopEndPacket(ShopEndType.Npc);
ItemInstanceDTO reward = _gameItemInstanceFactory.CreateDto(itemToAdd);
await session.EmitEventAsync(new BoxOpenedEvent
{
Box = relictItem.ItemInstance,
Rewards = new List<ItemInstanceDTO>
{
reward
}
});
}
}