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

117 lines
No EOL
3.9 KiB
C#

using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.Events;
using WingsAPI.Game.Extensions.Groups;
using WingsAPI.Packets.Enums;
using WingsEmu.Game._enum;
using WingsEmu.Game._i18n;
using WingsEmu.Game._ItemUsage.Configuration;
using WingsEmu.Game.Algorithm;
using WingsEmu.Game.Battle;
using WingsEmu.Game.Characters;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Extensions.Mates;
using WingsEmu.Game.Helpers;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Mates;
using WingsEmu.Game.Mates.Events;
using WingsEmu.Game.Networking;
using WingsEmu.Packets.Enums;
using WingsEmu.Packets.Enums.Chat;
namespace WingsEmu.Plugins.BasicImplementations.Event.Mates;
public class MateProcessExperienceEventHandler : IAsyncEventProcessor<MateProcessExperienceEvent>
{
private readonly ICharacterAlgorithm _characterAlgorithm;
private readonly IGameLanguageService _gameLanguage;
private readonly IServerManager _serverManager;
private readonly ISpPartnerConfiguration _spPartnerConfiguration;
public MateProcessExperienceEventHandler(IServerManager serverManager, IGameLanguageService gameLanguage, ICharacterAlgorithm characterAlgorithm, ISpPartnerConfiguration spPartnerConfiguration)
{
_serverManager = serverManager;
_gameLanguage = gameLanguage;
_characterAlgorithm = characterAlgorithm;
_spPartnerConfiguration = spPartnerConfiguration;
}
public async Task HandleAsync(MateProcessExperienceEvent e, CancellationToken cancellation)
{
IClientSession session = e.Sender;
IPlayerEntity character = session.PlayerEntity;
if (character.IsOnVehicle)
{
return;
}
IMateEntity mate = e.MateEntity;
if (!mate.IsAlive())
{
return;
}
long mateXp = _characterAlgorithm.GetLevelXp(mate.Level, true, mate.MateType);
long experience = e.Experience;
if (mate.Level >= _serverManager.MaxMateLevel)
{
mate.Level = (byte)_serverManager.MaxMateLevel;
mate.Experience = 0;
return;
}
if (mate.Level > character.Level)
{
return;
}
if (mate.Level == character.Level && mate.Experience >= mateXp)
{
mate.Experience = mateXp;
session.SendPetInfo(mate, _gameLanguage);
return;
}
mate.Experience += experience;
session.SendPetInfo(mate, _gameLanguage);
if (mate.Experience < mateXp)
{
return;
}
if (mate.Level + 1 > character.Level)
{
mate.Experience = mateXp;
session.SendPetInfo(mate, _gameLanguage);
return;
}
int loyalty = mate.Loyalty + 100 > 1000 ? 1000 - mate.Loyalty : 100;
mate.Loyalty += (short)loyalty;
mate.Experience -= mateXp;
mate.Level++;
mate.RefreshStatistics();
session.RefreshParty(_spPartnerConfiguration);
mate.Hp = mate.MaxHp;
mate.Mp = mate.MaxMp;
mate.BroadcastEffectInRange(EffectType.NormalLevelUp);
mate.BroadcastEffectInRange(EffectType.NormalLevelUpSubEffect);
string name = mate.MateName == mate.Name ? _gameLanguage.GetLanguage(GameDataType.NpcMonster, mate.Name, session.UserLanguage) : mate.MateName;
GameDialogKey dialogKey = mate.MateType == MateType.Partner ? GameDialogKey.PARTNER_SHOUTMESSAGE_LEVEL_UP : GameDialogKey.PET_SHOUTMESSAGE_LEVEL_UP;
session.SendMsg(session.GetLanguageFormat(dialogKey, name), MsgMessageType.Middle);
session.SendPetInfo(mate, _gameLanguage);
await session.EmitEventAsync(new LevelUpMateEvent
{
Level = mate.Level,
LevelUpType = MateLevelUpType.Normal,
Location = new Location(mate.MapInstance.MapId, mate.MapX, mate.MapY),
NosMateMonsterVnum = mate.NpcMonsterVNum
});
}
}