using System.Collections.Concurrent; using System.Diagnostics.CodeAnalysis; using Google.Protobuf; using Google.Protobuf.WellKnownTypes; using ServerCore; using ServerBase; using ServerCommon; using ServerCommon.BusinessLogDomain; using MetaAssets; using static ClientToGameRes.Types; namespace GameServer; internal class MyhomeAgentAction : EntityActionBase { ConcurrentDictionary m_myhomes = new(); public MyhomeAgentAction(Player owner) : base(owner) { } public override async Task onInit() { await Task.CompletedTask; var result = new Result(); return result; } public override void onClear() { m_myhomes.Clear(); } public bool tryGetMyHome(string myhomeGuid, [MaybeNullWhen(false)] out Myhome myHome) { return m_myhomes.TryGetValue(myhomeGuid, out myHome); } public List getMyHomes() { return m_myhomes.Values.ToList(); } public void addMyhome(string myhome_guid, Myhome myhome) { m_myhomes.TryAdd(myhome_guid, myhome); } public Result checkMyhomeSlot() { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; ArgumentNullException.ThrowIfNull(player); var user_contents_setting_attribute = player.getEntityAttribute(); ArgumentNullException.ThrowIfNull(user_contents_setting_attribute); var myhome_slot_opem_count = user_contents_setting_attribute.MyhomeSlotOpenCount; var current_myhome_count = m_myhomes.Count; if (current_myhome_count >= myhome_slot_opem_count) { err_msg = $"Myhome Not Enough Slot !!! : CurrentMyhomeCount:{current_myhome_count} >= MyhomeSlotOpenCount:{myhome_slot_opem_count} - {player.toBasicString()}"; result.setFail(ServerErrorCode.MyhomeNotEnoughSlot, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public async Task tryAddMyHomeFromDoc(MyhomeDoc myHomeDoc) { var result = new Result(); var err_msg = string.Empty; var server_logic = GameServerApp.getServerLogic(); var player = getOwner() as Player; ArgumentNullException.ThrowIfNull(player); Myhome myhome = new(player.getUserGuid()); await myhome.onInit(); var myhome_attribute = myhome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(myhome_attribute); if (!myhome_attribute.copyEntityAttributeFromDoc(myHomeDoc)) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!! to:{myhome_attribute.getTypeName()}, from:{myHomeDoc.getTypeName()} : {this.getTypeName()}"; result.setFail(ServerErrorCode.DynamoDbDocCopyToEntityAttributeFailed, err_msg); Log.getLogger().error(result.toBasicString()); return result; } (result, var myhome_ugc_info) = await MyhomeHelper.getMyhomeUgcInfo(myhome_attribute); if (result.isFail()) { err_msg = $"Fail to getMyhomeUgcInfo() !!! : {result.toBasicString()} - {player.toBasicString()}"; Log.getLogger().error(err_msg); return result; } myhome_attribute.UgcInfo = myhome_ugc_info!; if (!m_myhomes.TryAdd(myhome_attribute.MyhomeGuid, myhome)) { err_msg = $"Failed to TryAdd() !!! : {myhome.toBasicString()} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyHomeDocLoadDuplicatedMyHome, err_msg); Log.getLogger().error(result.toBasicString()); return result; } return result; } public async Task<(Result, Myhome?)> tryMakeDefaultMyhome() { var result = new Result(); var err_msg = string.Empty; var player = getOwner() as Player; ArgumentNullException.ThrowIfNull(player); Myhome myhome = new(player.getUserGuid()); await myhome.onInit(); var myhome_action = myhome.getEntityAction(); ArgumentNullException.ThrowIfNull(myhome_action); var default_myhome_ugc_info_file_name = MetaHelper.GameConfigMeta.MyHomeDefaultSaveFileName; if (!MapManager.Instance.getDefaultMyhomeUgcInfo(default_myhome_ugc_info_file_name, out var myhome_ugc_info)) { err_msg = $"Failed to getDefaultMyhomeUgcInfo() !!! : {default_myhome_ugc_info_file_name} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyhomeUgcInfoFileNotFoune, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } result = await myhome_action.tryMakeDefaultMyhome(myhome_ugc_info); if (result.isFail()) { return (result, null); } var myhome_attribute = myhome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(myhome_attribute); if (!m_myhomes.TryAdd(myhome_attribute.MyhomeGuid, myhome)) { err_msg = $"Failed to TryAdd() !!! : {myhome.toBasicString()} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyHomeAlreadyExist, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } return (result, myhome); } public bool tryGetSelectedMyhome([MaybeNullWhen(false)] out Myhome myHome) { myHome = null; foreach (var myhome in m_myhomes.Values) { var myhome_attribute = myhome.getEntityAttribute(); if (myhome_attribute == null) continue; if (myhome_attribute.SelectedFlag == 1) { myHome = myhome; return true; } } return false; } public bool tryGetSelectedMyHomeAttribute([MaybeNullWhen(false)] out MyhomeAttribute myhomeAttribute) { myhomeAttribute = null; foreach (var myhome in m_myhomes.Values) { myhomeAttribute = myhome.getOriginEntityAttribute(); if (myhomeAttribute == null) continue; if (myhomeAttribute.SelectedFlag == 1) { return true; } } return false; } public (Result, ExchagneMyHomeRes, List?) tryExchangeMyHome(string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; var res = new ExchagneMyHomeRes(); var business_logs = new List(); var player = getOwner() as Player; ArgumentNullException.ThrowIfNull(player, $"player is null !!!"); if (!tryGetSelectedMyhome(out var selectedMyHome)) { err_msg = $"Failed to tryGetSelectedMyHome() !!! - {player.toBasicString()}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res, null); } if (!tryGetMyHome(myhomeGuid, out var myhome)) { err_msg = $"Failed to tryGetMyHome() !!! : myhomeGuid:{myhomeGuid} - {player.toBasicString()}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, res, null); } var selected_myhome_action = selectedMyHome.getEntityAction(); ArgumentNullException.ThrowIfNull(selected_myhome_action, $"selected_myhome_action is null !!! - {player.toBasicString()}"); var selected_myhome_attribute = selectedMyHome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(selected_myhome_attribute, $"selected_myhome_attribute is null !!! - {player.toBasicString()}"); var myhome_action = myhome.getEntityAction(); ArgumentNullException.ThrowIfNull(myhome_action, $"myhome_action is null !!! - {player.toBasicString()}"); var myhome_attribute = myhome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!! - {player.toBasicString()}"); var user_guid = player.getUserGuid(); var old_myhome_guid = selected_myhome_attribute.MyhomeGuid; var new_myhome_guid = myhome_attribute.MyhomeGuid; selected_myhome_action.unselectMyHome(); myhome_action.selectMyHome(); var myhome_info = myhome_action.toMyHomeInfo(); res.MyhomeInfo = myhome_info; var myhome_exchange_log_info = MyHomeBusinessLogHelper.toMyhomeExchangeLogInfo(user_guid, old_myhome_guid, new_myhome_guid); var myhome_exchange_business_log = new MyhomeExchangeBusinessLog(myhome_exchange_log_info); business_logs.Add(myhome_exchange_business_log); return (result, res, business_logs); } public async Task<(Result, Dictionary?, List?)> tryDeleteMyhome(string myhomeGuid) { var result = new Result(); var err_msg = string.Empty; var business_logs = new List(); if (!tryGetMyHome(myhomeGuid, out var myhome)) { err_msg = $"Failed to tryGetMyHome() !!! : myhomeGuid:{myhomeGuid}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null, null); } var myhome_action = myhome.getEntityAction(); ArgumentNullException.ThrowIfNull(myhome_action, $"myhome_action is null !!!"); (result, var modifyUgcNpcStateInfos, var delete_myhome_business_log) = await myhome_action.deleteMyhome(); if (result.isFail()) { err_msg = $"Failed to deleteMyhome() !!! : {result.toBasicString()} : {this.getTypeName()}"; Log.getLogger().error(err_msg); return (result, null, null); } NullReferenceCheckHelper.throwIfNull(delete_myhome_business_log, () => $"delete_myhome_business_log is null !!!"); result = await myhome_action.tryDeleteMyhomeUgcInfoFolderFileFromS3(); if (result.isFail()) { err_msg = $"Failed to tryDeleteMyhomeUgcInfoFolderFileFromS3() !!! : {result.toBasicString()} : {this.getTypeName()}"; Log.getLogger().error(err_msg); return (result, null, null); } m_myhomes.Remove(myhomeGuid, out _); business_logs.AddRange(delete_myhome_business_log); return (result, modifyUgcNpcStateInfos, business_logs); } public (Result, List?) tryRenameMyhome(string myhomeGuid, string newMyhomeName) { var result = new Result(); var err_msg = string.Empty; var business_logs = new List(); result = MyhomeHelper.checkMyhomeName(newMyhomeName); if (result.isFail()) { err_msg = $"Failed to checkMyhomeName() !!! : {result.toBasicString()} : {this.getTypeName()}"; Log.getLogger().error(err_msg); return (result, null); } foreach (var checkMyhome in m_myhomes.Values) { var check_myhome_attribute = checkMyhome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(check_myhome_attribute, $"check_myhome_attribute is null !!!"); if (check_myhome_attribute.MyhomeName == newMyhomeName) { err_msg = $"Myhome Name Duplicated !!! : newMyhomeName:{newMyhomeName} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyhomeNameDuplicated, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } } if (!tryGetMyHome(myhomeGuid, out var myhome)) { err_msg = $"Failed to tryGetMyHome() !!! : myhomeGuid:{myhomeGuid} : {this.getTypeName()}"; result.setFail(ServerErrorCode.MyHomeNotFound, err_msg); Log.getLogger().error(result.toBasicString()); return (result, null); } var myhome_attribute = myhome.getEntityAttribute(); ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!!"); var old_myhome_name = myhome_attribute.MyhomeName; var myhome_action = myhome.getEntityAction(); ArgumentNullException.ThrowIfNull(myhome_action, $"myhome_action is null !!!"); myhome_action.renameMyhome(newMyhomeName); var myhome_rename_log_info = MyHomeBusinessLogHelper.toMyhomeRenameLogInfo(myhomeGuid, old_myhome_name, newMyhomeName); var myhome_rename_business_log = new MyhomeRenameBusinessLog(myhome_rename_log_info); business_logs.Add(myhome_rename_business_log); return (result, business_logs); } public string getMyHomeGuidByAnchorGuid(string anchor_guid) { foreach(var myhome in m_myhomes) { if(myhome.Value.isAnchorInMyhome(anchor_guid) == true) { return myhome.Key; } } return string.Empty; } }