server-master/srcs/_plugins/Plugin.FamilyImpl/Consumers/FamilyChangeFactionMessageConsumer.cs
2026-02-10 18:21:30 +01:00

93 lines
No EOL
3.4 KiB
C#

using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.ServiceBus;
using Plugin.FamilyImpl.Messages;
using WingsAPI.Communication.ServerApi.Protocol;
using WingsAPI.Game.Extensions.Families;
using WingsEmu.Game.Characters.Events;
using WingsEmu.Game.Extensions;
using WingsEmu.Game.Families;
using WingsEmu.Game.Families.Configuration;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Maps;
using WingsEmu.Game.Networking;
using WingsEmu.Game.TimeSpaces.Events;
using WingsEmu.Packets.Enums;
namespace Plugin.FamilyImpl.Consumers
{
public class FamilyChangeFactionMessageConsumer : IMessageConsumer<FamilyChangeFactionMessage>
{
private readonly FamilyConfiguration _familyConfiguration;
private readonly IFamilyManager _familyManager;
private readonly SerializableGameServer _serializableGameServer;
private readonly ISessionManager _sessionManager;
public FamilyChangeFactionMessageConsumer(IFamilyManager familyManager, ISessionManager sessionManager, FamilyConfiguration familyConfiguration, SerializableGameServer serializableGameServer)
{
_familyManager = familyManager;
_sessionManager = sessionManager;
_familyConfiguration = familyConfiguration;
_serializableGameServer = serializableGameServer;
}
public async Task HandleAsync(FamilyChangeFactionMessage notification, CancellationToken token)
{
long familyId = notification.FamilyId;
FactionType factionType = notification.NewFaction;
Family family = _familyManager.GetFamilyByFamilyId(familyId);
if (family == null)
{
return;
}
family.Faction = (byte)notification.NewFaction;
foreach (FamilyMembership member in family.Members.ToList())
{
IClientSession memberSession = _sessionManager.GetSessionByCharacterId(member.CharacterId);
if (memberSession == null)
{
continue;
}
if (memberSession.PlayerEntity.Faction == factionType)
{
continue;
}
await memberSession.EmitEventAsync(new ChangeFactionEvent
{
NewFaction = factionType
});
if (memberSession.CurrentMapInstance == null)
{
continue;
}
if (_serializableGameServer.ChannelType == GameChannelType.ACT_4)
{
if (memberSession.PlayerEntity.TimeSpaceComponent.IsInTimeSpaceParty)
{
await memberSession.EmitEventAsync(new TimeSpaceLeavePartyEvent());
}
await memberSession.EmitEventAsync(new PlayerReturnFromAct4Event());
continue;
}
if (memberSession.CurrentMapInstance.MapInstanceType == MapInstanceType.NormalInstance)
{
memberSession.ChangeToLastBaseMap();
continue;
}
await memberSession.EmitEventAsync(new PlayerReturnFromAct4Event());
}
FamilyPacketExtensions.SendFamilyInfoToMembers(family, _sessionManager, _familyConfiguration);
}
}
}