server-master/srcs/_plugins/WingsEmu.Plugins.GameEvents/EventHandler/InstantBattle/InstantBattleCompleteEventHandler.cs
2026-02-10 18:21:30 +01:00

106 lines
No EOL
4.8 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.PacketGeneration;
using WingsEmu.Game;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Configurations;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Families.Enum;
using WingsEmu.Game.Families.Event;
using WingsEmu.Game.GameEvent.InstantBattle;
using WingsEmu.Game.Helpers.Damages;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.Portals;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
using WingsEmu.Plugins.GameEvents.Configuration.InstantBattle;
using WingsEmu.Plugins.GameEvents.DataHolder;
using WingsEmu.Plugins.GameEvents.Event.InstantBattle;
namespace WingsEmu.Plugins.GameEvents.EventHandler.InstantBattle
{
public class InstantBattleCompleteEventHandler : IAsyncEventProcessor<InstantBattleCompleteEvent>
{
private readonly IGameLanguageService _gameLanguage;
private readonly GameMinMaxConfiguration _minMaxConfiguration;
private readonly IPortalFactory _portalFactory;
private readonly IRankingManager _rankingManager;
private readonly IReputationConfiguration _reputationConfiguration;
public InstantBattleCompleteEventHandler(IGameLanguageService gameLanguage, GameMinMaxConfiguration minMaxConfiguration, IReputationConfiguration reputationConfiguration,
IPortalFactory portalFactory, IRankingManager rankingManager)
{
_gameLanguage = gameLanguage;
_minMaxConfiguration = minMaxConfiguration;
_reputationConfiguration = reputationConfiguration;
_portalFactory = portalFactory;
_rankingManager = rankingManager;
}
public async Task HandleAsync(InstantBattleCompleteEvent e, CancellationToken cancellation)
{
IMapInstance map = e.Instance.MapInstance;
InstantBattleReward reward = e.Instance.InternalConfiguration.Reward;
InstantBattleInstance instance = e.Instance;
e.Instance.Finished = true;
await map.BroadcastAsync(async x =>
{
string message = _gameLanguage.GetLanguage(GameDialogKey.INSTANT_COMBAT_SHOUTMESSAGE_SUCCEEDED, x.UserLanguage);
return x.GenerateMsgPacket(message, MsgMessageType.Middle);
});
foreach (IClientSession session in map.Sessions)
{
IPlayerEntity character = session.PlayerEntity;
bool isHeroic = 0 < instance.InternalConfiguration.Requirements.HeroicLevel?.Minimum;
long gold = reward.GoldMultiplier * (isHeroic ? character.HeroLevel : character.Level);
long reputation = reward.ReputationMultiplier * (isHeroic ? character.HeroLevel : character.Level);
int specialistPoint = reward.SpPointsMultiplier * (isHeroic ? character.HeroLevel : character.Level);
int familyExperience = reward.FamilyExperience;
int dignity = reward.Dignity;
await session.EmitEventAsync(new InstantBattleWonEvent());
await session.EmitEventAsync(new GenerateGoldEvent(gold));
await session.EmitEventAsync(new GenerateReputationEvent
{
Amount = (int)reputation,
SendMessage = true
});
character.SpPointsBonus += specialistPoint;
if (character.Family != null)
{
await character.Session.EmitEventAsync(new FamilyAddExperienceEvent(familyExperience, FamXpObtainedFromType.InstantCombat));
}
character.AddDignity(dignity, _minMaxConfiguration, _gameLanguage, _reputationConfiguration, _rankingManager.TopReputation);
session.SendChatMessage(session.GetLanguageFormat(GameDialogKey.INFORMATION_CHATMESSAGE_WIN_SP_POINT, specialistPoint), ChatMessageColorType.Green);
character.Hp = session.PlayerEntity.MaxHp;
character.Mp = session.PlayerEntity.MaxMp;
if (character.SpPointsBonus > _minMaxConfiguration.MaxSpAdditionalPoints)
{
character.SpPointsBonus = _minMaxConfiguration.MaxSpAdditionalPoints;
}
session.RefreshSpPoint();
session.RefreshStat();
session.RefreshStatInfo();
}
var pos = new Position(e.Instance.InternalConfiguration.ReturnPortalX, e.Instance.InternalConfiguration.ReturnPortalY);
IPortalEntity portal = _portalFactory.CreatePortal(PortalType.TSNormal, map, pos, map, pos);
map.AddPortalToMap(portal);
}
}
}