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

183 lines
No EOL
7.3 KiB
C#

using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using PhoenixLib.ServiceBus;
using Plugin.FamilyImpl.Messages;
using WingsAPI.Data.Families;
using WingsAPI.Game.Extensions.Families;
using WingsEmu.Game._i18n;
using WingsEmu.Game.Families;
using WingsEmu.Game.Families.Configuration;
using WingsEmu.Game.Managers;
using WingsEmu.Game.Managers.StaticData;
namespace Plugin.FamilyImpl.Consumers
{
public class FamilyUpdateMessageConsumer : IMessageConsumer<FamilyUpdateMessage>
{
private readonly FamilyConfiguration _familyConfiguration;
private readonly IFamilyManager _familyManager;
private readonly IItemsManager _itemsManager;
private readonly IGameLanguageService _languageService;
private readonly IMessagePublisher<FamilyShoutMessage> _messagePublisher;
private readonly ISessionManager _sessionManager;
public FamilyUpdateMessageConsumer(IFamilyManager familyManager, ISessionManager sessionManager, IGameLanguageService languageService, FamilyConfiguration familyConfiguration,
IMessagePublisher<FamilyShoutMessage> messagePublisher, IItemsManager itemsManager)
{
_familyManager = familyManager;
_sessionManager = sessionManager;
_languageService = languageService;
_familyConfiguration = familyConfiguration;
_messagePublisher = messagePublisher;
_itemsManager = itemsManager;
}
public async Task HandleAsync(FamilyUpdateMessage e, CancellationToken cancellation)
{
foreach (FamilyDTO familyDto in e.Families)
{
Family family = _familyManager.GetFamilyByFamilyIdCache(familyDto.Id);
if (family == null)
{
continue;
}
switch (e.ChangedInfoFamilyUpdate)
{
case ChangedInfoFamilyUpdate.Experience:
HandleFamilyExperience(family, familyDto);
break;
case ChangedInfoFamilyUpdate.Notice:
HandleFamilyNotice(family, familyDto);
break;
case ChangedInfoFamilyUpdate.HeadSex:
await HandleHeadSex(family, familyDto);
break;
case ChangedInfoFamilyUpdate.Settings:
HandleSettings(family, familyDto);
break;
case ChangedInfoFamilyUpdate.Upgrades:
HandleFamilyUpgradeUpdate(family, familyDto);
break;
case ChangedInfoFamilyUpdate.AchievementsAndMissions:
HandleFamilyAchievementsUpdate(family, familyDto);
break;
}
}
}
private void HandleSettings(Family family, FamilyDTO familyDto)
{
family.AssistantWarehouseAuthorityType = familyDto.AssistantWarehouseAuthorityType;
family.AssistantCanInvite = familyDto.AssistantCanInvite;
family.AssistantCanGetHistory = familyDto.AssistantCanGetHistory;
family.AssistantCanNotice = familyDto.AssistantCanNotice;
family.AssistantCanShout = familyDto.AssistantCanShout;
family.MemberWarehouseAuthorityType = familyDto.MemberWarehouseAuthorityType;
family.MemberCanGetHistory = familyDto.MemberCanGetHistory;
FamilyPacketExtensions.SendFamilyInfoToMembers(family, _sessionManager, _familyConfiguration);
}
private async Task HandleHeadSex(Family family, FamilyDTO familyDto)
{
family.HeadGender = familyDto.HeadGender;
FamilyPacketExtensions.SendFamilyInfoToMembers(family, _sessionManager, _familyConfiguration);
await _messagePublisher.PublishAsync(new FamilyShoutMessage
{
FamilyId = family.Id,
GameDialogKey = GameDialogKey.FAMILY_SHOUTMESSAGE_HEAD_CHANGE_SEX
});
}
private void HandleFamilyNotice(Family family, FamilyDTO familyDto)
{
family.Message = familyDto.Message;
FamilyPacketExtensions.SendFamilyNoticeMessage(family, _sessionManager, _familyConfiguration);
}
private void HandleFamilyExperience(Family family, FamilyDTO familyDto)
{
family.Experience = familyDto.Experience;
if (family.Level == familyDto.Level)
{
FamilyPacketExtensions.SendFamilyInfoToMembers(family, _sessionManager, _familyConfiguration);
return;
}
/*_familyManager.SendLogToFamilyServer(new FamilyLogDto
{
Actor = familyDto.Level.ToString(),
FamilyId = familyDto.Id,
FamilyLogType = FamilyLogType.FamilyLevelUp,
Timestamp = DateTime.UtcNow
});*/
family.Level = familyDto.Level;
FamilyPacketExtensions.SendFamilyLevelUpMessageToMembers(family, _sessionManager, _languageService, _familyConfiguration);
}
private void HandleFamilyUpgradeUpdate(Family family, FamilyDTO familyDto)
{
familyDto.Upgrades ??= new FamilyUpgradeDto();
familyDto.Upgrades.UpgradesBought ??= new HashSet<int>();
familyDto.Upgrades.UpgradeValues ??= new Dictionary<FamilyUpgradeType, short>();
foreach (int upgradeId in familyDto.Upgrades.UpgradesBought)
{
if (family.Upgrades.ContainsKey(upgradeId))
{
continue;
}
family.Upgrades.Add(upgradeId, new FamilyUpgrade
{
Id = upgradeId,
State = FamilyUpgradeState.PASSIVE
});
}
foreach ((FamilyUpgradeType upgradeType, short value) in familyDto.Upgrades.UpgradeValues)
{
family.UpgradeValues[upgradeType] = value;
}
family.SendFmpPacket(_sessionManager, _itemsManager);
}
private void HandleFamilyAchievementsUpdate(Family family, FamilyDTO familyDto)
{
if (familyDto.Achievements?.Achievements != null)
{
family.Achievements.Clear();
foreach ((int achievementId, FamilyAchievementCompletionDto achievement) in familyDto.Achievements.Achievements)
{
family.Achievements[achievementId] = achievement;
}
}
if (familyDto.Achievements?.Progress != null)
{
family.AchievementProgress.Clear();
foreach ((int achievementId, FamilyAchievementProgressDto achievement) in familyDto.Achievements.Progress)
{
family.AchievementProgress[achievementId] = achievement;
}
}
if (familyDto.Missions?.Missions != null)
{
family.Mission.Clear();
foreach ((int achievementId, FamilyMissionDto achievement) in familyDto.Missions.Missions)
{
family.Mission[achievementId] = achievement;
}
}
family.SendFmiPacket(_sessionManager);
}
}
}