Files
2025-05-01 07:20:41 +09:00

389 lines
13 KiB
C#

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<string, Myhome> m_myhomes = new();
public MyhomeAgentAction(Player owner)
: base(owner)
{ }
public override async Task<Result> 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<Myhome> 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<UserContentsSettingAttribute>();
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<Result> 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<MyhomeAttribute>();
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<MyhomeAction>();
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<MyhomeAttribute>();
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<MyhomeAttribute>();
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<MyhomeAttribute>();
if (myhomeAttribute == null)
continue;
if (myhomeAttribute.SelectedFlag == 1)
{
return true;
}
}
return false;
}
public (Result, ExchagneMyHomeRes, List<ILogInvoker>?) tryExchangeMyHome(string myhomeGuid)
{
var result = new Result();
var err_msg = string.Empty;
var res = new ExchagneMyHomeRes();
var business_logs = new List<ILogInvoker>();
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<MyhomeAction>();
ArgumentNullException.ThrowIfNull(selected_myhome_action, $"selected_myhome_action is null !!! - {player.toBasicString()}");
var selected_myhome_attribute = selectedMyHome.getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(selected_myhome_attribute, $"selected_myhome_attribute is null !!! - {player.toBasicString()}");
var myhome_action = myhome.getEntityAction<MyhomeAction>();
ArgumentNullException.ThrowIfNull(myhome_action, $"myhome_action is null !!! - {player.toBasicString()}");
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
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<string, EntityStateInfo>?, List<ILogInvoker>?)> tryDeleteMyhome(string myhomeGuid)
{
var result = new Result();
var err_msg = string.Empty;
var business_logs = new List<ILogInvoker>();
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<MyhomeAction>();
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<ILogInvoker>?) tryRenameMyhome(string myhomeGuid, string newMyhomeName)
{
var result = new Result();
var err_msg = string.Empty;
var business_logs = new List<ILogInvoker>();
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<MyhomeAttribute>();
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<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!!");
var old_myhome_name = myhome_attribute.MyhomeName;
var myhome_action = myhome.getEntityAction<MyhomeAction>();
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;
}
}