389 lines
13 KiB
C#
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;
|
|
}
|
|
}
|