초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,705 @@
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using static ClientToGameRes.Types;
namespace GameServer;
internal class MyhomeAction : EntityActionBase
{
public MyhomeAction(Myhome owner)
: base(owner)
{ }
public override async Task<Result> onInit()
{
await Task.CompletedTask;
var result = new Result();
return result;
}
public override void onClear()
{
return;
}
public MyHomeInfo toMyHomeInfo()
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
var myhome_info = myhome_attribute.toMyhomeInfo();
return myhome_info;
}
public MyhomeUgcInfo getMyhomeUgcInfo()
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
return myhome_attribute.UgcInfo;
}
public void selectMyHome()
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
myhome_attribute.SelectedFlag = 1;
myhome_attribute.modifiedEntityAttribute();
}
public void unselectMyHome()
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
myhome_attribute.SelectedFlag = 0;
myhome_attribute.modifiedEntityAttribute();
}
public void renameMyhome(string newMyhomeName)
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
myhome_attribute.MyhomeName = newMyhomeName;
myhome_attribute.modifiedEntityAttribute();
}
public async Task<Result> tryMakeDefaultMyhome(MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(owner);
result = await tryMakeDefaultInteriorItems(myhomeUgcInfo);
if (result.isFail())
{
return result;
}
var myhome_attribute = owner.getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
myhome_attribute.MyhomeMetaId = (uint)myhomeUgcInfo.RoomType;
myhome_attribute.SelectedFlag = 1;
myhome_attribute.MyhomeUgcInfoS3FileName = MyhomeHelper.makeMyhomeUgcInfoS3FileName();
myhome_attribute.UgcInfo = myhomeUgcInfo;
myhome_attribute.newEntityAttribute();
return result;
}
public async Task<(Result, GS2C_ACK_SAVE_MYHOME_UGC, List<ILogInvoker>?)> trySaveMyhomeUgcInfo(string myhomeName, MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var res = new GS2C_ACK_SAVE_MYHOME_UGC();
var business_logs = new List<ILogInvoker>();
var myhome = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(myhome, $"owner is null !!!");
var player = myhome.onGetMasterEntity() as Player;
ArgumentNullException.ThrowIfNull(player, $"player is null !!!");
result = checkBeforeSaveMyhome(myhomeName, myhomeUgcInfo);
if (result.isFail())
{
err_msg = $"Failed to checkBeforeSaveMyhome() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, res, null);
}
(result, var changedUgcItemGuids) = await tryRelocateInteriorItems(myhomeUgcInfo);
if (result.isFail())
{
err_msg = $"Failed to tryRelocateInteriorItems() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, res, null);
}
modifyMyhomeUgcInfo(myhomeUgcInfo, changedUgcItemGuids);
(result, var modify_ugc_npc_state_infos) = await tryRelocateUgcNpcs(myhomeUgcInfo);
if (result.isFail())
{
err_msg = $"Failed to tryRelocateUgcNpcs() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, res, null);
}
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute);
myhome_attribute.MyhomeName = myhomeName;
myhome_attribute.MyhomeUgcInfoS3FileName = MyhomeHelper.makeMyhomeUgcInfoS3FileName();
myhome_attribute.UgcInfo = myhomeUgcInfo;
myhome_attribute.modifiedEntityAttribute();
res.MyhomeGuid = myhome_attribute.MyhomeGuid;
res.MyhomeName = myhome_attribute.MyhomeName;
res.MyhomeUgcInfo = myhome_attribute.UgcInfo;
NullReferenceCheckHelper.throwIfNull(modify_ugc_npc_state_infos, () => $"modify_ugc_npc_state_infos is null !!!");
foreach (var (key, value) in modify_ugc_npc_state_infos)
{
res.ModigyUgcNpcStateInfos.Add(key, value);
}
var myhome_log_info = MyHomeBusinessLogHelper.toMyHomeLogInfo(myhome_attribute);
var myhome_business_log = new MyHomeBusinessLog(myhome_log_info);
business_logs.Add(myhome_business_log);
return (result, res, business_logs);
}
Result checkBeforeSaveMyhome(string myhomeName, MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var myhome = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(myhome, $"owner is null !!!");
var player = myhome.onGetMasterEntity() as Player;
ArgumentNullException.ThrowIfNull(player, $"player is null !!!");
result = MyhomeHelper.checkMyhomeName(myhomeName);
if (result.isFail())
{
err_msg = $"Failed to checkMyhomeName() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
result = MyhomeHelper.checkMyhomeUgcInfo(myhomeUgcInfo);
if (result.isFail())
{
err_msg = $"Failed to checkMyhomeInteriorPoint() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
var current_myhome_ugc_info = getMyhomeUgcInfo();
(_, var remove_crafter_anchor_guids) = MyhomeHelper.getModifyCrafterAnchorGuids(current_myhome_ugc_info, myhomeUgcInfo);
result = CraftHelper.checkAnchorCrafting(player, remove_crafter_anchor_guids);
if (result.isFail())
{
err_msg = $"Failed to checkCraftingProcess() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
result.setFail(ServerErrorCode.DoNotRemoveProcessCraftingAnchor, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
async Task<Result> tryMakeDefaultInteriorItems(MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(owner, $"owner is null !!!");
var myhome_inventory_action = owner.getEntityAction<MyhomeInventoryAction>();
ArgumentNullException.ThrowIfNull(myhome_inventory_action, $"myhome_inventory_action is null !!! - {owner.toBasicString()}");
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
{
if (!anchorInfo.isProp())
continue;
var item_meta_id = anchorInfo.TableId;
(result, var changed_items) = await myhome_inventory_action.tryTakalbleToBag((UInt32)item_meta_id, 1);
if (result.isFail())
{
return result;
}
foreach (var changed_item in changed_items)
{
var changed_item_attribute = changed_item.getEntityAttribute<ItemAttributeBase>();
ArgumentNullException.ThrowIfNull(changed_item_attribute, $"item_attribute is null !!!");
anchorInfo.EntityGuid = changed_item_attribute.ItemGuid;
}
}
return result;
}
async Task<(Result, Dictionary<string, Dictionary<string, int>>)> tryRelocateInteriorItems(MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var changed_ugc_item_guids = new Dictionary<string, Dictionary<string, int>>();
var myhome = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(myhome, $"owner is null !!!");
var player = myhome.onGetMasterEntity() as Player;
ArgumentNullException.ThrowIfNull(player, $"player is null !!!");
var myhome_inventory_action = myhome.getEntityAction<MyhomeInventoryAction>();
ArgumentNullException.ThrowIfNull(myhome_inventory_action, $"myhome_inventory_action is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var user_inventory_action = player.getEntityAction<UserInventoryAction>();
ArgumentNullException.ThrowIfNull(user_inventory_action, $"user_inventory_action is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var current_myhome_ugc_info = getMyhomeUgcInfo();
(var user_to_myhome_items, var myhome_to_user_items) = MyhomeHelper.getModifyInteriorItems(current_myhome_ugc_info, myhomeUgcInfo);
ArgumentNullException.ThrowIfNull(user_to_myhome_items, $"user_to_myhome_items is null !!!");
ArgumentNullException.ThrowIfNull(myhome_to_user_items, $"myhome_to_user_items is null !!!");
// User Inventory 에서 제거
var move_to_myhome_items = new Dictionary<string, (int, int)>();
foreach (var (move_item_guid, move_count) in user_to_myhome_items)
{
(result, var changed_item) = await user_inventory_action.tryDeleteItemByGuid(move_item_guid, (UInt16)move_count);
NullReferenceCheckHelper.throwIfNull(changed_item, () => $"changed_item is null !!!");
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByGuid() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, changed_ugc_item_guids);
}
var item_meta = changed_item.getItemMeta();
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!!");
var item_meta_id = item_meta.ItemId;
move_to_myhome_items[move_item_guid] = (item_meta_id, move_count);
}
// Myhome Inventory 에서 제거
var move_to_user_items = new Dictionary<int, int>();
foreach (var (move_item_guid, move_count) in myhome_to_user_items)
{
(result, var changed_item) = await myhome_inventory_action.tryDeleteItemByGuid(move_item_guid, (UInt16)move_count);
NullReferenceCheckHelper.throwIfNull(changed_item, () => $"changed_item is null !!!");
if (result.isFail())
{
err_msg = $"Failed to tryDeleteItemByGuid() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, changed_ugc_item_guids);
}
var item_meta = changed_item.getItemMeta();
NullReferenceCheckHelper.throwIfNull(item_meta, () => $"item_meta is null !!!");
var item_meta_id = item_meta.ItemId;
move_to_user_items.TryGetValue(item_meta_id, out var count);
move_to_user_items[item_meta_id] = count + move_count;
}
// User Inventory 에 추가
foreach (var (item_meta_id, item_count) in move_to_user_items)
{
(result, var changed_items) = await user_inventory_action.tryTakalbleToBag((UInt32)item_meta_id, (UInt16)item_count);
if (result.isFail())
{
err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, changed_ugc_item_guids);
}
}
// Myhome Inventory 에 추가
foreach (var (item_guid, (item_meta_id, item_count)) in move_to_myhome_items)
{
(result, var changed_items) = await myhome_inventory_action.tryTakalbleToBag((UInt32)item_meta_id, (UInt16)item_count);
if (result.isFail())
{
err_msg = $"Failed to tryTakalbleToBag() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, changed_ugc_item_guids);
}
var new_items = new Dictionary<string, int>();
foreach (var changed_item in changed_items)
{
var changed_item_attribute = changed_item.getEntityAttribute<ItemAttributeBase>();
ArgumentNullException.ThrowIfNull(changed_item_attribute, $"item_attribute is null !!!");
var new_item_guid = changed_item_attribute.ItemGuid;
var new_item_count = changed_item_attribute.ItemStackCount;
new_items.TryGetValue(new_item_guid, out var count);
new_items[new_item_guid] = count + new_item_count;
}
changed_ugc_item_guids[item_guid] = new_items;
}
return (result, changed_ugc_item_guids);
}
void modifyMyhomeUgcInfo(MyhomeUgcInfo myhomeUgcInfo, Dictionary<string, Dictionary<string, int>> changedUgcItemGuids)
{
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
{
if (!anchorInfo.isProp())
continue;
if (!changedUgcItemGuids.TryGetValue(anchorInfo.EntityGuid, out var changed_item_guids))
continue;
foreach (var (changed_item_guid, changed_item_count) in changed_item_guids)
{
if (changed_item_count <= 0)
continue;
anchorInfo.EntityGuid = changed_item_guid;
changed_item_guids[changed_item_guid] = changed_item_count - 1;
}
}
}
async Task<(Result, Dictionary<string, EntityStateInfo>?)> tryRelocateUgcNpcs(MyhomeUgcInfo myhomeUgcInfo)
{
var result = new Result();
var err_msg = string.Empty;
var modify_ugc_npc_state_infos = new Dictionary<string, EntityStateInfo>();
var myhome = getOwner() as Myhome;
ArgumentNullException.ThrowIfNull(myhome, $"owner is null !!!");
var player = myhome.onGetMasterEntity() as Player;
ArgumentNullException.ThrowIfNull(player, $"player is null !!!");
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var player_action = player.getEntityAction<PlayerAction>();
ArgumentNullException.ThrowIfNull(player_action, $"player_action is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var myhome_guid = myhome_attribute.MyhomeGuid;
var current_myhome_ugc_info = getMyhomeUgcInfo();
(var add_ugc_npc_anchor_infos, var remove_upc_npc_anchor_infos, var modify_ugc_npc_anchor_infos) = MyhomeHelper.getModifyUgcNpcAnchorInfos(current_myhome_ugc_info, myhomeUgcInfo);
result = MyhomeHelper.getMyhomeInstanceId(myhomeUgcInfo.RoomType, out var instance_meta_id);
if (result.isFail())
{
err_msg = $"Fail to getMyhomeInstanceId() !!! : {result.toBasicString()} - {player.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
foreach (var ugc_anchor_info in remove_upc_npc_anchor_infos)
{
(result, var ugc_npc, var npc_location_in_target_doc) = await player_action.tryReleaseUgcNpcFromMyhome(myhome_guid, ugc_anchor_info.AnchorGuid, ugc_anchor_info.EntityGuid);
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
if (result.isFail())
{
err_msg = $"Failed to tryReleaseUgcNpcFromMyhome() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
ArgumentNullException.ThrowIfNull(ugc_npc_attribute, $"ugc_npc_attribute is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (int)ugc_npc_attribute.MetaIdOfEntityStateType;
modify_ugc_npc_state_infos[ugc_npc_attribute.UgcNpcMetaGuid] = entity_state_info;
}
var myhome_warp_pos = MapHelper.getWarpPos(ContentsType.MyHome);
foreach (var ugc_anchor_info in add_ugc_npc_anchor_infos)
{
var beacon_pos = MapHelper.getWorldPosFromMyhomeRelativePos(ugc_anchor_info.Coordinate);
var npc_location = new NpcLocation();
npc_location.AnchorMetaGuid = ugc_anchor_info.AnchorGuid;
npc_location.CurrentPos.X = beacon_pos.X;
npc_location.CurrentPos.Y = beacon_pos.Y;
npc_location.CurrentPos.Z = beacon_pos.Z;
npc_location.CurrentPos.FacingAngle = ugc_anchor_info.Rotation.Yaw;
(result, var ugc_npc, var npc_location_in_target_doc) = await player_action.tryLocateUgcNpcToMyhome(myhome_guid, instance_meta_id, npc_location, ugc_anchor_info.EntityGuid);
if (result.isFail())
{
err_msg = $"Failed to tryLocateUgcNpcToMyhome() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
ArgumentNullException.ThrowIfNull(ugc_npc_attribute, $"ugc_npc_attribute is null !!!");
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (int)ugc_npc_attribute.MetaIdOfEntityStateType;
modify_ugc_npc_state_infos[ugc_npc_attribute.UgcNpcMetaGuid] = entity_state_info;
}
foreach (var ugc_anchor_info in modify_ugc_npc_anchor_infos)
{
var beacon_pos = MapHelper.getWorldPosFromMyhomeRelativePos(ugc_anchor_info.Coordinate);
var npc_location = new NpcLocation();
npc_location.AnchorMetaGuid = ugc_anchor_info.AnchorGuid;
npc_location.CurrentPos.X = beacon_pos.X;
npc_location.CurrentPos.Y = beacon_pos.Y;
npc_location.CurrentPos.Z = beacon_pos.Z;
npc_location.CurrentPos.FacingAngle = ugc_anchor_info.Rotation.Yaw;
(result, var ugc_npc, var npc_location_in_target_doc) = await player_action.tryModifyUgcNpcToMyhome(myhome_guid, npc_location, ugc_anchor_info.EntityGuid, EntityStateType.UsingByMyHome);
if (result.isFail())
{
err_msg = $"Failed to tryModifyUgcNpcToMyhome() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
}
var crafter_anchor_infos = myhomeUgcInfo.getCrafterAnchorInfos();
var craft_action = player.getEntityAction<CraftAction>();
foreach (var crafter_beacon_pos in myhomeUgcInfo.CrafterBeaconPos)
{
if (!crafter_anchor_infos.TryGetValue(crafter_beacon_pos.AnchorGuid, out var anchor_Info))
continue;
if (!craft_action.getCraftInfo(crafter_beacon_pos.AnchorGuid, out var craft_info))
continue;
if (craft_info.BeaconGuid.isNullOrWhiteSpace())
continue;
var beacon_guid = craft_info.BeaconGuid;
var beacon_pos = MapHelper.getWorldPosFromMyhomeRelativePos(crafter_beacon_pos.CrafterBeaconPos_);
var npc_location = new NpcLocation();
npc_location.AnchorMetaGuid = crafter_beacon_pos.AnchorGuid;
npc_location.CurrentPos.X = beacon_pos.X;
npc_location.CurrentPos.Y = beacon_pos.Y;
npc_location.CurrentPos.Z = beacon_pos.Z;
npc_location.CurrentPos.FacingAngle = crafter_beacon_pos.CrafterBeaconPos_.Angle;
(result, var ugc_npc, var npc_location_in_target_doc) = await player_action.tryModifyUgcNpcToMyhome(myhome_guid, npc_location, beacon_guid, EntityStateType.UsingByCrafting, (uint)anchor_Info.TableId);
if (result.isFail())
{
err_msg = $"Failed to tryModifyUgcNpcToMyhome() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null);
}
}
return (result, modify_ugc_npc_state_infos);
}
public async Task<(Result, Dictionary<string, EntityStateInfo>?, List<ILogInvoker>?)> deleteMyhome()
{
var result = new Result();
var err_msg = string.Empty;
var modifyUgcNpcStateInfos = new Dictionary<string, EntityStateInfo>();
var business_logs = new List<ILogInvoker>();
var myhome = getOwner() as Myhome;
NullReferenceCheckHelper.throwIfNull(myhome, () => $"myhome is null !!!");
var player = myhome.onGetMasterEntity() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!! - {myhome.toBasicString()}, {player.toBasicString()}");
var myhome_guid = myhome_attribute.MyhomeGuid;
if (myhome_attribute.SelectedFlag == 1)
{
err_msg = $"Myhome is Selected !!! - {myhome.toBasicString()}, {player.toBasicString()}";
result.setFail(ServerErrorCode.MyhomeIsSelected, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null, null);
}
result = checkBeforeDeleteMyhome();
if (result.isFail())
{
err_msg = $"Failed to checkBeforeDeleteMyhome() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null, null);
}
(result, _) = await tryRelocateInteriorItems(new MyhomeUgcInfo());
if (result.isFail())
{
err_msg = $"Failed to tryRelocateInteriorItems() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null, null);
}
var player_action = player.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!!");
foreach (var anchorInfo in myhome_attribute.UgcInfo.AnchorInfos)
{
if (!anchorInfo.isNpcProp())
continue;
(result, var ugc_npc, _) = await player_action.tryReleaseUgcNpcFromMyhome(myhome_guid, anchorInfo.AnchorGuid, anchorInfo.EntityGuid);
if (result.isFail())
{
err_msg = $"Failed to tryReleaseUgcNpcFromMyhome() !!! : {result.toBasicString()} - {myhome.toBasicString()}";
Log.getLogger().error(err_msg);
return (result, null, null);
}
NullReferenceCheckHelper.throwIfNull(ugc_npc, () => $"ugc_npc is null !!!");
var ugc_npc_attribute = ugc_npc.getEntityAttribute<UgcNpcAttribute>();
NullReferenceCheckHelper.throwIfNull(ugc_npc_attribute, () => $"ugc_npc_attribute is null !!!");
var entity_state_info = new EntityStateInfo();
entity_state_info.StateType = ugc_npc_attribute.State;
entity_state_info.AnchorMetaGuid = ugc_npc_attribute.AnchorMetaGuid;
entity_state_info.MetaIdOfStateType = (int)ugc_npc_attribute.MetaIdOfEntityStateType;
modifyUgcNpcStateInfos[ugc_npc_attribute.UgcNpcMetaGuid] = entity_state_info;
}
myhome_attribute.deleteEntityAttribute();
var myhome_log_info = MyHomeBusinessLogHelper.toMyHomeLogInfo(myhome_attribute);
var myhome_business_log = new MyHomeBusinessLog(myhome_log_info);
business_logs.Add(myhome_business_log);
return (result, modifyUgcNpcStateInfos, business_logs);
}
Result checkBeforeDeleteMyhome()
{
var result = new Result();
var err_msg = string.Empty;
var myhome = getOwner() as Myhome;
NullReferenceCheckHelper.throwIfNull(myhome, () => $"owner is null !!!");
var player = myhome.onGetMasterEntity() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var current_myhome_ugc_info = getMyhomeUgcInfo();
var crafter_anchor_infos = current_myhome_ugc_info.getCrafterAnchorInfos();
var crafting_anchor_guids = new List<string>();
foreach (var anchor_guid in crafter_anchor_infos.Keys)
{
crafting_anchor_guids.Add(anchor_guid);
}
result = CraftHelper.checkAnchorCrafting(player, crafting_anchor_guids);
if (result.isFail())
{
err_msg = $"Failed to checkCraftingProcess() !!! : {result.toBasicString()} - {myhome.toBasicString()}, {player.toBasicString()}";
result.setFail(ServerErrorCode.DoNotRemoveProcessCraftingAnchor, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
return result;
}
public async Task<Result> tryUploadMyhomeUgcInfoToS3()
{
var result = new Result();
var err_msg = string.Empty;
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!!");
result = await MyhomeHelper.uploadMyhomeUgcInfo(myhome_attribute);
if (result.isFail())
{
err_msg = $"Failed to uploadMyhomeUgcInfo() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<Result> tryDeleteMyhomeUgcInfoFolderFileFromS3()
{
var result = new Result();
var err_msg = string.Empty;
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!!");
result = await MyhomeHelper.deleteMyhomeUgcInfoFolderFile(myhome_attribute);
if (result.isFail())
{
err_msg = $"Failed to deleteMyhomeUgcInfoFolderFile() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public bool isSelectedMyhome()
{
var myhome_attribute = getOwner().getEntityAttribute<MyhomeAttribute>();
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!!");
if (myhome_attribute.SelectedFlag == 1)
return true;
return false;
}
}

View File

@@ -0,0 +1,388 @@
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;
}
}