161 lines
No EOL
6.1 KiB
C#
161 lines
No EOL
6.1 KiB
C#
// WingsEmu
|
|
//
|
|
// Developed by NosWings Team
|
|
|
|
using System;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using PhoenixLib.Events;
|
|
using Plugin.Raids.Extension;
|
|
using Plugin.Raids.Scripting;
|
|
using WingsAPI.Game.Extensions.ItemExtension.Inventory;
|
|
using WingsAPI.Game.Extensions.ItemExtension.Item;
|
|
using WingsAPI.Packets.Enums;
|
|
using WingsAPI.Scripting.Object.Raid;
|
|
using WingsEmu.DTOs.Maps;
|
|
using WingsEmu.Game._enum;
|
|
using WingsEmu.Game._i18n;
|
|
using WingsEmu.Game.Extensions;
|
|
using WingsEmu.Game.Inventory;
|
|
using WingsEmu.Game.Managers.StaticData;
|
|
using WingsEmu.Game.Networking;
|
|
using WingsEmu.Game.Raids;
|
|
using WingsEmu.Game.Raids.Events;
|
|
using WingsEmu.Packets.Enums.Chat;
|
|
|
|
namespace Plugin.Raids;
|
|
|
|
public class RaidPartyCreateEventHandler : IAsyncEventProcessor<RaidPartyCreateEvent>
|
|
{
|
|
private readonly IGameLanguageService _gameLanguage;
|
|
private readonly IItemsManager _itemsManager;
|
|
private readonly IRaidManager _raidManager;
|
|
private readonly RaidScriptManager _raidScriptManager;
|
|
|
|
public RaidPartyCreateEventHandler(RaidScriptManager raidScriptManager, IGameLanguageService gameLanguage, IRaidManager raidManager, IItemsManager itemsManager)
|
|
{
|
|
_raidScriptManager = raidScriptManager;
|
|
_gameLanguage = gameLanguage;
|
|
_raidManager = raidManager;
|
|
_itemsManager = itemsManager;
|
|
}
|
|
|
|
public async Task HandleAsync(RaidPartyCreateEvent e, CancellationToken cancellation)
|
|
{
|
|
IClientSession session = e.Sender;
|
|
if (session.PlayerEntity.IsInRaidParty)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.HasRaidStarted)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsInGroup())
|
|
{
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.RAID_SHOUTMESSAGE_CANT_CREATE_RAID_GROUP, session.UserLanguage), MsgMessageType.Middle);
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.HasShopOpened)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.IsOnVehicle)
|
|
{
|
|
session.SendChatMessage(_gameLanguage.GetLanguage(GameDialogKey.ITEM_MESSAGE_CANT_USE, session.UserLanguage), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
if (!session.PlayerEntity.MapInstance.HasMapFlag(MapFlags.IS_BASE_MAP))
|
|
{
|
|
session.SendMsg(_gameLanguage.GetLanguage(GameDialogKey.INFORMATION_SHOUTMESSAGE_MUST_BE_IN_CLASSIC_MAP, session.UserLanguage), MsgMessageType.Middle);
|
|
return;
|
|
}
|
|
|
|
if (session.CantPerformActionOnAct4())
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (!Enum.TryParse(e.RaidType.ToString(), out RaidType raidType))
|
|
{
|
|
return;
|
|
}
|
|
|
|
SRaidRequirement requirement = _raidScriptManager.GetScriptedRaid(raidType.ToSRaidType())?.Requirement;
|
|
if (requirement == null)
|
|
{
|
|
session.SendInfo(_gameLanguage.GetLanguage(GameDialogKey.RAID_INFO_NO_EXIST, session.UserLanguage));
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.Level < requirement.MinimumLevel)
|
|
{
|
|
session.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_LOW_LEVEL, session.UserLanguage, requirement.MinimumLevel.ToString()), ChatMessageColorType.Red);
|
|
return;
|
|
}
|
|
|
|
if (session.PlayerEntity.HeroLevel < requirement.MinimumHeroLevel)
|
|
{
|
|
session.SendChatMessage(_gameLanguage.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_LOW_LEVEL, session.UserLanguage, requirement.MinimumHeroLevel.ToString()), ChatMessageColorType.Red);
|
|
return;
|
|
}
|
|
|
|
if (session.IsRaidTypeRestricted(raidType))
|
|
{
|
|
if (!session.IsPlayerWearingRaidAmulet(raidType))
|
|
{
|
|
string amuletName = raidType == RaidType.LordDraco
|
|
? _itemsManager.GetItem((short)ItemVnums.DRACO_AMULET)?.GetItemName(_gameLanguage, session.UserLanguage)
|
|
: _itemsManager.GetItem((short)ItemVnums.GLACERUS_AMULET)?.GetItemName(_gameLanguage, session.UserLanguage);
|
|
|
|
session.SendChatMessage(session.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_AMULET_NEEDED, amuletName), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
string getRaidName = session.GenerateRaidName(_gameLanguage, raidType);
|
|
if (!session.CanPlayerJoinToRestrictedRaid(raidType))
|
|
{
|
|
session.SendChatMessage(session.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_LIMIT_REACHED, getRaidName), ChatMessageColorType.Yellow);
|
|
return;
|
|
}
|
|
|
|
switch (raidType)
|
|
{
|
|
case RaidType.LordDraco:
|
|
session.SendChatMessage(session.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_LIMIT_LEFT,
|
|
getRaidName, session.PlayerEntity.RaidRestrictionDto.LordDraco), ChatMessageColorType.Yellow);
|
|
break;
|
|
case RaidType.Glacerus:
|
|
session.SendChatMessage(session.GetLanguageFormat(GameDialogKey.RAID_CHATMESSAGE_LIMIT_LEFT,
|
|
getRaidName, session.PlayerEntity.RaidRestrictionDto.Glacerus), ChatMessageColorType.Yellow);
|
|
break;
|
|
}
|
|
}
|
|
|
|
InventoryItem itemToRemove = e.ItemToRemove;
|
|
if (itemToRemove != null)
|
|
{
|
|
await session.RemoveItemFromInventory(item: itemToRemove);
|
|
}
|
|
|
|
var raidInstance = new RaidParty(Guid.NewGuid(), raidType, requirement.MinimumLevel, requirement.MaximumLevel, requirement.MinimumHeroLevel, requirement.MaximumHeroLevel,
|
|
requirement.MinimumParticipant,
|
|
requirement.MaximumParticipant);
|
|
|
|
raidInstance.AddMember(session);
|
|
_raidManager.AddRaid(raidInstance);
|
|
|
|
session.PlayerEntity.SetRaidParty(raidInstance);
|
|
session.SendRaidPacket(RaidPacketType.LEADER_RELATED);
|
|
session.SendRaidPacket(RaidPacketType.LIST_MEMBERS);
|
|
session.SendRaidPacket(RaidPacketType.LEAVE);
|
|
session.RefreshRaidMemberList();
|
|
|
|
await session.EmitEventAsync(new RaidCreatedEvent());
|
|
}
|
|
} |