초기커밋
This commit is contained in:
705
GameServer/Contents/MyHome/Action/MyhomeAction.cs
Normal file
705
GameServer/Contents/MyHome/Action/MyhomeAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
388
GameServer/Contents/MyHome/Action/MyhomeAgentAction.cs
Normal file
388
GameServer/Contents/MyHome/Action/MyhomeAgentAction.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,358 @@
|
||||
using Amazon.S3.Model;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
internal class DBQMyhomeInitializeForTestUser : QueryExecutorBase
|
||||
{
|
||||
private string m_combination_key_for_pk = string.Empty;
|
||||
private string m_pk = string.Empty;
|
||||
|
||||
MyhomeUgcInfo m_myhome_ugc_info;
|
||||
|
||||
public DBQMyhomeInitializeForTestUser(string testUserGuid, MyhomeUgcInfo myhomeUgcInfo)
|
||||
: base(typeof(DBQMyhomeInitializeForTestUser).Name)
|
||||
{
|
||||
m_combination_key_for_pk = testUserGuid;
|
||||
m_myhome_ugc_info = myhomeUgcInfo;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onPrepareQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var doc = new MyhomeDoc();
|
||||
doc.setCombinationKeyForPK(m_combination_key_for_pk);
|
||||
|
||||
var error_code = doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
m_pk = doc.getPK();
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// onPrepareQuery()를 성공할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
|
||||
var query_runner = query_batch.getQueryRunner();
|
||||
NullReferenceCheckHelper.throwIfNull(query_runner, () => $"query_runner is null !!!");
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
|
||||
var table = db_connector.getTableByDoc<MyhomeDoc>();
|
||||
var query_config = db_connector.makeQueryConfigForReadByPKOnly(m_pk);
|
||||
|
||||
(result, var read_documents) = await table.simpleQueryWithQueryOperationConfig(query_config, query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
foreach (var read_document in read_documents)
|
||||
{
|
||||
var myhome_doc = new MyhomeDoc();
|
||||
result = await myhome_doc.onCopyFromDocument(read_document);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var myhome_attrib = myhome_doc.getAttrib<MyHomeAttrib>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_attrib, () => $"myhome_attrib is null !!!");
|
||||
|
||||
// 마이홈 아이템 제거
|
||||
result = await tryDeleteItemDocFromMyhome(myhome_attrib.MyhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// 마이홈에 배치된 Npc 배치 초기화
|
||||
result = await tryDeleteNpcLocationInTargetDocFromMyhome(myhome_attrib.MyhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
// MyhomeUgcInfo S3 에서 제거
|
||||
result = await MyhomeHelper.deleteMyhomeUgcInfoFolderFile(myhome_attrib.MyhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to deleteMyhomeUgcInfoFolderFile() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// MyhomeDoc Delete
|
||||
var to_delete_doc = read_document.createDocumentQueryContext(table.TableName, QueryType.Delete);
|
||||
result = await query_runner.tryRegisterQueryContext(to_delete_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
// 마이홈 생성
|
||||
result = await createMyhomeFromMyhomeUgcInfo(owner, m_myhome_ugc_info);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to createMyhomeFromMyhomeUgcInfo() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseCommit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseRollback(Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
async Task<Result> tryDeleteItemDocFromMyhome(string myhomeGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
|
||||
var query_runner = query_batch.getQueryRunner();
|
||||
NullReferenceCheckHelper.throwIfNull(query_runner, () => $"query_runner is null !!!");
|
||||
|
||||
var doc = new ItemDoc();
|
||||
doc.setCombinationKeyForPK(myhomeGuid);
|
||||
|
||||
var error_code = doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
|
||||
var table = db_connector.getTableByDoc<ItemDoc>();
|
||||
var query_config = db_connector.makeQueryConfigForReadByPKOnly(doc.getPK());
|
||||
|
||||
(result, var read_documents) = await table.simpleQueryWithQueryOperationConfig(query_config, query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
foreach(var read_document in read_documents)
|
||||
{
|
||||
// ItemDoc Delete
|
||||
var to_delete_doc = read_document.createDocumentQueryContext(table.TableName, QueryType.Delete);
|
||||
result = await query_runner.tryRegisterQueryContext(to_delete_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
async Task<Result> tryDeleteNpcLocationInTargetDocFromMyhome(string myhomeGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!!");
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
|
||||
var query_runner = query_batch.getQueryRunner();
|
||||
NullReferenceCheckHelper.throwIfNull(query_runner, () => $"query_runner is null !!!");
|
||||
|
||||
var location_unique_id = server_logic.getMap().makeLOCATION_UNIQUE_IDByMetaIdWithLocationTargetType(LocationTargetType.Instance, myhomeGuid);
|
||||
|
||||
var doc = new NpcLocationInTargetDoc();
|
||||
doc.setCombinationKeyForPK(location_unique_id);
|
||||
|
||||
var error_code = doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
var table = db_connector.getTableByDoc<NpcLocationInTargetDoc>();
|
||||
var query_config = db_connector.makeQueryConfigForReadByPKOnly(doc.getPK());
|
||||
|
||||
(result, var read_documents) = await table.simpleQueryWithQueryOperationConfig(query_config, query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
foreach (var read_document in read_documents)
|
||||
{
|
||||
// NpcLocationInTargetDoc Delete
|
||||
var to_delete_doc = read_document.createDocumentQueryContext(table.TableName, QueryType.Delete);
|
||||
result = await query_runner.tryRegisterQueryContext(to_delete_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
async Task<Result> createMyhomeFromMyhomeUgcInfo(Player player, MyhomeUgcInfo myhome_ugc_info)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
var dynamo_db_connector = query_batch.getDynamoDbConnector();
|
||||
|
||||
var query_runner = query_batch.getQueryRunner();
|
||||
NullReferenceCheckHelper.throwIfNull(query_runner, () => $"query_runner is null !!!");
|
||||
|
||||
var user_guid = player.getUserGuid();
|
||||
|
||||
var myhome = new Myhome(user_guid);
|
||||
await myhome.onInit();
|
||||
|
||||
var myhome_action = myhome.getEntityAction<MyhomeAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!!");
|
||||
|
||||
await myhome_action.tryMakeDefaultMyhome(myhome_ugc_info);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!!");
|
||||
|
||||
(result, var myhome_doc) = await myhome_attribute.toDocBase();
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {myhome.toBasicString()}");
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_doc, () => $"item_docs is null !!!");
|
||||
|
||||
(result, var myhome_document) = await myhome_doc.onCopyToDocument();
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var to_insert_doc = myhome_document.createDocumentQueryContext(dynamo_db_connector.getTableFullName(myhome_doc.TableName), QueryType.Insert);
|
||||
result = await query_runner.tryRegisterQueryContext(to_insert_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var myhome_inventory_action = myhome.getEntityAction<MyhomeInventoryAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_inventory_action, () => $"myhome_inventory_action is null !!!");
|
||||
|
||||
var my_home_bag_inven = myhome_inventory_action.getBagInven();
|
||||
var my_home_has_items = my_home_bag_inven.getHasItemBases();
|
||||
|
||||
foreach (var item in my_home_has_items)
|
||||
{
|
||||
var new_item = item;
|
||||
|
||||
var item_attribute = new_item.getEntityAttribute<ItemAttributeBase>();
|
||||
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!!");
|
||||
|
||||
(result, var item_doc) = await item_attribute.toDocBase();
|
||||
if (result.isFail())
|
||||
{
|
||||
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {new_item.toBasicString()}");
|
||||
continue;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(item_doc, () => $"item_docs is null !!!");
|
||||
|
||||
(result, var document) = await item_doc.onCopyToDocument();
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
to_insert_doc = document.createDocumentQueryContext(dynamo_db_connector.getTableFullName(item_doc.TableName), QueryType.Insert);
|
||||
result = await query_runner.tryRegisterQueryContext(to_insert_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
result = await myhome_action.tryUploadMyhomeUgcInfoToS3();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryUploadMyhomeUgcInfoToS3() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
115
GameServer/Contents/MyHome/DBquery/DBQMyhomeReadAll.cs
Normal file
115
GameServer/Contents/MyHome/DBquery/DBQMyhomeReadAll.cs
Normal file
@@ -0,0 +1,115 @@
|
||||
using Amazon.DynamoDBv2.DocumentModel;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
internal class DBQMyhomeReadAll : QueryExecutorBase
|
||||
{
|
||||
private string m_combination_key_for_pk = string.Empty;
|
||||
|
||||
private string m_pk = string.Empty;
|
||||
|
||||
private readonly List<MyhomeDoc> m_to_read_myhome_docs = new();
|
||||
|
||||
public DBQMyhomeReadAll(string combinationKeyForPK)
|
||||
: base(typeof(DBQMyhomeReadAll).Name)
|
||||
{
|
||||
m_combination_key_for_pk = combinationKeyForPK;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리 직전에 준비해야 할 로직들을 작성한다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onPrepareQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var doc = new MyhomeDoc();
|
||||
doc.setCombinationKeyForPK(m_combination_key_for_pk);
|
||||
|
||||
var error_code = doc.onApplyPKSK();
|
||||
if (error_code.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onApplyPKSK() !!! : {error_code.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
|
||||
result.setFail(error_code, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
m_pk = doc.getPK();
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// onPrepareQuery()를 성공할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task<Result> onQuery()
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var owner = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
|
||||
|
||||
var query_batch = getQueryBatch();
|
||||
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!!");
|
||||
|
||||
var db_connector = query_batch.getDynamoDbConnector();
|
||||
var query_config = db_connector.makeQueryConfigForReadByPKOnly(m_pk);
|
||||
|
||||
(result, var read_docs) = await db_connector.simpleQueryDocTypesWithQueryOperationConfig<MyhomeDoc>(query_config, eventTid: query_batch.getTransId());
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var myhome_agent_action = owner.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!!");
|
||||
|
||||
foreach (var read_doc in read_docs)
|
||||
{
|
||||
result = await myhome_agent_action.tryAddMyHomeFromDoc(read_doc);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
m_to_read_myhome_docs.Add(read_doc);
|
||||
}
|
||||
|
||||
return await Task.FromResult(result);
|
||||
}
|
||||
|
||||
public List<MyhomeDoc> getToReadMyHomeDocs() => m_to_read_myhome_docs;
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 성공하고, doFnCommit()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseCommit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
|
||||
//=====================================================================================
|
||||
// DB 쿼리를 실패하고, doFnRollback()가 QueryResultType.NotCalledQueryFunc를 반환할 경우 호출된다.
|
||||
//=====================================================================================
|
||||
public override async Task onQueryResponseRollback(Result errorResult)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
57
GameServer/Contents/MyHome/Helper/MyHomeBusinessLogHelper.cs
Normal file
57
GameServer/Contents/MyHome/Helper/MyHomeBusinessLogHelper.cs
Normal file
@@ -0,0 +1,57 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using Amazon.DynamoDBv2.DocumentModel;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public static class MyHomeBusinessLogHelper
|
||||
{
|
||||
public static MyHomeLogInfo toMyHomeLogInfo(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
var myhome_log_info = new MyHomeLogInfo();
|
||||
myhome_log_info.setMyHomeInfo(myhomeAttribute);
|
||||
return myhome_log_info;
|
||||
}
|
||||
|
||||
public static void setMyHomeInfo(this MyHomeLogInfo logData, MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
logData.MyhomeGuid = myhomeAttribute.MyhomeGuid;
|
||||
logData.MyhomeMetaId = (int)myhomeAttribute.MyhomeMetaId;
|
||||
logData.MyhomeName = myhomeAttribute.MyhomeName;
|
||||
}
|
||||
|
||||
public static MyhomeRenameLogInfo toMyhomeRenameLogInfo(string myhomeGuid, string oldMyhomeName, string newMyhomeName)
|
||||
{
|
||||
var myhome_rename_log_info = new MyhomeRenameLogInfo();
|
||||
myhome_rename_log_info.setMyhomeRenameInfo(myhomeGuid, oldMyhomeName, newMyhomeName);
|
||||
return myhome_rename_log_info;
|
||||
}
|
||||
|
||||
public static void setMyhomeRenameInfo(this MyhomeRenameLogInfo logData, string myhomeGuid, string oldMyhomeName, string newMyhomeName)
|
||||
{
|
||||
logData.MyhomeGuid = myhomeGuid;
|
||||
logData.OldMyhomeName = oldMyhomeName;
|
||||
logData.NewMyhomeName = newMyhomeName;
|
||||
}
|
||||
|
||||
public static MyhomeExchangeLogInfo toMyhomeExchangeLogInfo(string userGuid, string oldMyhomeGuid, string newMyhomeGuid)
|
||||
{
|
||||
var myhome_exchange_log_info = new MyhomeExchangeLogInfo();
|
||||
myhome_exchange_log_info.setMyhomeExchangeInfo(userGuid, oldMyhomeGuid, newMyhomeGuid);
|
||||
return myhome_exchange_log_info;
|
||||
}
|
||||
|
||||
public static void setMyhomeExchangeInfo(this MyhomeExchangeLogInfo logData, string userGuid, string oldMyhomeGuid, string newMyhomeGuid)
|
||||
{
|
||||
logData.UserGuid = userGuid;
|
||||
logData.OldMyhomeGuid = oldMyhomeGuid;
|
||||
logData.NewMyhomeGuid = newMyhomeGuid;
|
||||
}
|
||||
}
|
||||
}
|
||||
868
GameServer/Contents/MyHome/Helper/MyhomeHelper.cs
Normal file
868
GameServer/Contents/MyHome/Helper/MyhomeHelper.cs
Normal file
@@ -0,0 +1,868 @@
|
||||
using Amazon.DynamoDBv2.DocumentModel;
|
||||
using Newtonsoft.Json;
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
internal static class MyhomeHelper
|
||||
{
|
||||
public static Result getMyhomeOwnerUserGuidAndMyhomeGuidFromRoomId(string roomId, out string myhomeOwnerUserGuid, out string myhomeGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
myhomeOwnerUserGuid = string.Empty;
|
||||
myhomeGuid = string.Empty;
|
||||
|
||||
var roomIdElement = roomId.Split(":");
|
||||
if (roomIdElement.Length != ServerCommon.Constant.MYHOME_INSTANCE_ROOM_ID_ELEMENT_COUNT)
|
||||
{
|
||||
err_msg = $"MyHome RoomId Element Count Wrong !!! : instanceRoomId:{roomId}";
|
||||
result.setFail(ServerErrorCode.RoomIsNotMyHome, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
if (roomIdElement[0] != ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID)
|
||||
{
|
||||
err_msg = $"MyHome RoomId Prefix Is Not {ServerCommon.Constant.PREFIX_MYHOME_INSTANCE_ROOM_ID} !!! : instanceRoomId:{roomId}";
|
||||
result.setFail(ServerErrorCode.RoomIsNotMyHome, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
myhomeOwnerUserGuid = roomIdElement[1];
|
||||
myhomeGuid = roomIdElement[2];
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<(Result, MyHomeAttrib?)> getEnterMyhomeAttribFromDynamoDb(string userGuid, string enterMyhomeGuid = "")
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var db_client = server_logic.getDynamoDbClient();
|
||||
|
||||
var myhome_doc = new MyhomeDoc();
|
||||
myhome_doc.setCombinationKeyForPK(userGuid);
|
||||
myhome_doc.onApplyPKSK();
|
||||
|
||||
QueryOperationConfig query_config = db_client.makeQueryConfigForReadByPKOnly(myhome_doc.getPK());
|
||||
(result, var read_docs) = await db_client.simpleQueryDocTypesWithQueryOperationConfig<MyhomeDoc>(query_config);
|
||||
|
||||
MyHomeAttrib? myhome_attrib = default;
|
||||
|
||||
foreach (var doc in read_docs)
|
||||
{
|
||||
myhome_attrib = doc.getAttrib<MyHomeAttrib>();
|
||||
if (myhome_attrib == null)
|
||||
continue;
|
||||
|
||||
if (enterMyhomeGuid == "" && myhome_attrib.SelectedFlag == 1)
|
||||
return (result, myhome_attrib);
|
||||
|
||||
if (enterMyhomeGuid == myhome_attrib.MyhomeGuid)
|
||||
return (result, myhome_attrib);
|
||||
}
|
||||
|
||||
err_msg = $"Myhome Not Found !!! : userGuid:{userGuid}, myhomeGuid:{enterMyhomeGuid}";
|
||||
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return (result, myhome_attrib);
|
||||
}
|
||||
|
||||
public static Result checkMyhomeName(string myhomeName)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var myhome_name_min_length = MetaHelper.GameConfigMeta.MyhomenameMinLength;
|
||||
var myhome_name_max_length = MetaHelper.GameConfigMeta.MyhomenameMaxLength;
|
||||
|
||||
if (myhomeName.Length < myhome_name_min_length)
|
||||
{
|
||||
err_msg = $"Myhome Name Length Long !!! : myhomeName:{myhomeName}";
|
||||
result.setFail(ServerErrorCode.MyhomeNameLengthShort, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
if (myhomeName.Length > myhome_name_max_length)
|
||||
{
|
||||
err_msg = $"Myhome Name Length Long !!! : myhomeName:{myhomeName}";
|
||||
result.setFail(ServerErrorCode.MyhomeNameLengthLong, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkMyhomeUgcInfo(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
result = checkDuplicateAnchorGuid(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkDuplicateAnchorGuid() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = checkMyhomeInteriorPoint(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkMyhomeInteriorPoint() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = checkMyhomeInterphone(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkMyhomeInterphone() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = checkMyhomeStartPoint(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkMyhomeStartPoint() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = checkCrafterCount(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkCrafterCount() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
result = checkMyhomeUgcNpc(myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkMyhomeUgcNpc() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkDuplicateAnchorGuid(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var anchor_guids = new HashSet<String>();
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
var anchor_guid = anchorInfo.AnchorGuid;
|
||||
|
||||
if (!anchor_guids.Add(anchor_guid))
|
||||
{
|
||||
err_msg = $"AnchorGuid Duplicate In Myhome Ugc !!! : anchorGuid:{anchor_guid}";
|
||||
result.setFail(ServerErrorCode.AnchorGuidDuplicate, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkMyhomeInteriorPoint(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(myhomeUgcInfo.RoomType, out var editableRoomMetaData))
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : editableRoomMetaId:{myhomeUgcInfo.RoomType}";
|
||||
result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var total_interior_point = 0;
|
||||
|
||||
foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos)
|
||||
{
|
||||
if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData))
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}";
|
||||
result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
total_interior_point += editableFrameworkMetaData.InteriorPoint;
|
||||
}
|
||||
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isProp())
|
||||
continue;
|
||||
|
||||
if (!MetaData.Instance._InteriorMetaTable.TryGetValue(anchorInfo.TableId, out var interiorMetaData))
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : interiorMetaId:{anchorInfo.TableId}";
|
||||
result.setFail(ServerErrorCode.InteriorMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
total_interior_point += interiorMetaData.InteriorPoint;
|
||||
}
|
||||
|
||||
if (total_interior_point > editableRoomMetaData.LimitInteriorPoint)
|
||||
{
|
||||
err_msg = $"Myhome Ugc Total InteriorPoint:{total_interior_point} > LimitInteriorPoint:{editableRoomMetaData.LimitInteriorPoint}";
|
||||
result.setFail(ServerErrorCode.InteriorPointExceed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkMyhomeInterphone(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var myhome_interphone_framework_meta_id = MetaHelper.GameConfigMeta.MyhomeInterphone;
|
||||
var is_exist_interphone = false;
|
||||
|
||||
foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos)
|
||||
{
|
||||
if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData))
|
||||
{
|
||||
err_msg = $"Failed to TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}";
|
||||
result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
if (editableFrameworkMetaData.id == myhome_interphone_framework_meta_id)
|
||||
{
|
||||
if (is_exist_interphone)
|
||||
{
|
||||
err_msg = $"Myhome Interphone Exceed !!!";
|
||||
result.setFail(ServerErrorCode.MyhomeInterphoneExceed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
is_exist_interphone = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_exist_interphone)
|
||||
{
|
||||
err_msg = $"Myhome Interphone Not Exist !!!";
|
||||
result.setFail(ServerErrorCode.MyhomeInterphoneNotExist, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkMyhomeStartPoint(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var myhome_start_point_framework_meta_id = MetaHelper.GameConfigMeta.MyhomeStartPoint;
|
||||
var is_exist_start_pos = false;
|
||||
|
||||
foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos)
|
||||
{
|
||||
if (!MetaData.Instance._EditableFrameworkMetaTable.TryGetValue(frameworkInfo.InteriorItemId, out var editableFrameworkMetaData))
|
||||
{
|
||||
err_msg = $"Failed to TryGetValue() !!! : editableFrameworkMetaId:{frameworkInfo.InteriorItemId}";
|
||||
result.setFail(ServerErrorCode.EditableFrameworkMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
if (editableFrameworkMetaData.id == myhome_start_point_framework_meta_id)
|
||||
{
|
||||
if (is_exist_start_pos)
|
||||
{
|
||||
err_msg = $"Myhome StartPos Exceed !!!";
|
||||
result.setFail(ServerErrorCode.MyhomeStartPointExceed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
is_exist_start_pos = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!is_exist_start_pos)
|
||||
{
|
||||
err_msg = $"Myhome StartPos Not Exist !!!";
|
||||
result.setFail(ServerErrorCode.MyhomeStartPointNotExist, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkCrafterCount(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(myhomeUgcInfo.RoomType, out var editable_room_meta_data))
|
||||
{
|
||||
err_msg = $"Failed to TryGetValue() !!! : editableRoomMetaId:{myhomeUgcInfo.RoomType}";
|
||||
result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
var crafter_count = 0;
|
||||
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isCrafterProp())
|
||||
continue;
|
||||
|
||||
++crafter_count;
|
||||
}
|
||||
|
||||
if (crafter_count > editable_room_meta_data.MaxCrafterCount)
|
||||
{
|
||||
err_msg = $"Myhome Crafter Count Exceed !!! Count:{crafter_count} > Allow:{editable_room_meta_data.MaxCrafterCount}";
|
||||
result.setFail(ServerErrorCode.CrafterCountExceed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result checkMyhomeUgcNpc(MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var ugc_npc_guids = new HashSet<String>();
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isNpcProp())
|
||||
continue;
|
||||
|
||||
var ugc_npc_guid = anchorInfo.EntityGuid;
|
||||
|
||||
if (!ugc_npc_guids.Add(ugc_npc_guid))
|
||||
{
|
||||
err_msg = $"Ugc Npc Duplicate In Myhome Ugc !!! : ugcNpcGuid:{ugc_npc_guid}";
|
||||
result.setFail(ServerErrorCode.UgcNpcDuplicateInMyhomeUgc, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static (Dictionary<string, int>? userToMyhome, Dictionary<string, int>? myhomeToUser) getModifyInteriorItems(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo)
|
||||
{
|
||||
var old_interior_items = oldMyhomeUgcInfo.getMyhomeInteriorItems();
|
||||
var new_interior_items = newMyhomeUgcInfo.getMyhomeInteriorItems();
|
||||
|
||||
var user_to_myhome_items = new Dictionary<string, int>();
|
||||
foreach (var (item_guid, new_count) in new_interior_items)
|
||||
{
|
||||
old_interior_items.TryGetValue(item_guid, out var old_count);
|
||||
|
||||
var diff_count = new_count - old_count;
|
||||
if (diff_count > 0)
|
||||
{
|
||||
user_to_myhome_items[item_guid] = diff_count;
|
||||
}
|
||||
}
|
||||
|
||||
var myhome_to_user_items = new Dictionary<string, int>();
|
||||
foreach (var (item_guid, old_count) in old_interior_items)
|
||||
{
|
||||
new_interior_items.TryGetValue(item_guid, out var new_count);
|
||||
|
||||
var diff_count = old_count - new_count;
|
||||
if (diff_count > 0)
|
||||
{
|
||||
myhome_to_user_items[item_guid] = diff_count;
|
||||
}
|
||||
}
|
||||
|
||||
return (user_to_myhome_items, myhome_to_user_items);
|
||||
}
|
||||
|
||||
public static Dictionary<string, int> getMyhomeInteriorItems(this MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var items = new Dictionary<string, int>();
|
||||
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isProp())
|
||||
continue;
|
||||
|
||||
items.TryGetValue(anchorInfo.EntityGuid, out var count);
|
||||
items[anchorInfo.EntityGuid] = count + 1;
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public static (List<UgcAnchorInfo> addInfos, List<UgcAnchorInfo> removeInfos, List<UgcAnchorInfo> modifyInfos) getModifyUgcNpcAnchorInfos(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo)
|
||||
{
|
||||
var old_ugc_npc_anchor_infos = oldMyhomeUgcInfo.getUgcNpcAnchorInfos();
|
||||
var new_ugc_npc_anchor_infos = newMyhomeUgcInfo.getUgcNpcAnchorInfos();
|
||||
|
||||
var modify_ugc_npc_anchor_infos = new List<UgcAnchorInfo>();
|
||||
var add_ugc_npc_anchor_infos = new List<UgcAnchorInfo>();
|
||||
foreach (var (new_anchor_guid, new_ugc_npc_anchor_info) in new_ugc_npc_anchor_infos)
|
||||
{
|
||||
// 엥커 비교 (존재 하지 않으면 추가됨)
|
||||
if (old_ugc_npc_anchor_infos.TryGetValue(new_anchor_guid, out var old_ugc_npc_anchor_info))
|
||||
{
|
||||
// 엥커 존재
|
||||
// NpcGuid 비교 (같지 않으면 추가됨)
|
||||
if (new_ugc_npc_anchor_info.EntityGuid == old_ugc_npc_anchor_info.EntityGuid)
|
||||
{
|
||||
// NpcGuid 동일
|
||||
// 정보 비교 (같지 않으면 변경됨)
|
||||
if (!new_ugc_npc_anchor_info.Equals(old_ugc_npc_anchor_info))
|
||||
{
|
||||
modify_ugc_npc_anchor_infos.Add(new_ugc_npc_anchor_info);
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
add_ugc_npc_anchor_infos.Add(new_ugc_npc_anchor_info);
|
||||
}
|
||||
|
||||
var remove_ugc_npc_anchor_infos = new List<UgcAnchorInfo>();
|
||||
foreach (var (old_anchor_guid, old_ugc_npc_anchor_info) in old_ugc_npc_anchor_infos)
|
||||
{
|
||||
// 엥커 비교 (존재 하지 않으면 제거됨)
|
||||
if (new_ugc_npc_anchor_infos.TryGetValue(old_anchor_guid, out var new_ugc_npc_anchor_info))
|
||||
{
|
||||
// 엥커 존재
|
||||
// NpcGuid 비교 (같지 않으면 제거됨)
|
||||
if (old_ugc_npc_anchor_info.EntityGuid == new_ugc_npc_anchor_info.EntityGuid)
|
||||
continue;
|
||||
}
|
||||
|
||||
remove_ugc_npc_anchor_infos.Add(old_ugc_npc_anchor_info);
|
||||
}
|
||||
|
||||
return (add_ugc_npc_anchor_infos, remove_ugc_npc_anchor_infos, modify_ugc_npc_anchor_infos);
|
||||
}
|
||||
|
||||
public static Dictionary<string, UgcAnchorInfo> getUgcNpcAnchorInfos(this MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var ugc_npc_anchor_infos = new Dictionary<string, UgcAnchorInfo>();
|
||||
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isNpcProp())
|
||||
continue;
|
||||
|
||||
ugc_npc_anchor_infos.TryAdd(anchorInfo.AnchorGuid, anchorInfo);
|
||||
}
|
||||
|
||||
return ugc_npc_anchor_infos;
|
||||
}
|
||||
|
||||
public static (List<string> addGuids, List<string> removeGuids) getModifyCrafterAnchorGuids(MyhomeUgcInfo oldMyhomeUgcInfo, MyhomeUgcInfo newMyhomeUgcInfo)
|
||||
{
|
||||
var old_crafter_anchor_infos = oldMyhomeUgcInfo.getCrafterAnchorInfos();
|
||||
var new_crafting_anchor_infos = newMyhomeUgcInfo.getCrafterAnchorInfos();
|
||||
|
||||
var add_crafter_anchor_guids = new List<string>();
|
||||
foreach (var (anchor_guid, anchor_info) in new_crafting_anchor_infos)
|
||||
{
|
||||
if (old_crafter_anchor_infos.TryGetValue(anchor_guid, out _))
|
||||
continue;
|
||||
|
||||
add_crafter_anchor_guids.Add(anchor_guid);
|
||||
}
|
||||
|
||||
var remove_crafting_anchor_guids = new List<string>();
|
||||
foreach (var (anchor_guid, anchor_info) in old_crafter_anchor_infos)
|
||||
{
|
||||
if (new_crafting_anchor_infos.TryGetValue(anchor_guid, out _))
|
||||
continue;
|
||||
|
||||
remove_crafting_anchor_guids.Add(anchor_guid);
|
||||
}
|
||||
|
||||
return (add_crafter_anchor_guids, remove_crafting_anchor_guids);
|
||||
}
|
||||
|
||||
public static Dictionary<string, UgcAnchorInfo> getCrafterAnchorInfos(this MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var crafter_anchor_infos = new Dictionary<string, UgcAnchorInfo>();
|
||||
|
||||
foreach (var anchorInfo in myhomeUgcInfo.AnchorInfos)
|
||||
{
|
||||
if (!anchorInfo.isCrafterProp())
|
||||
continue;
|
||||
|
||||
crafter_anchor_infos.TryAdd(anchorInfo.AnchorGuid, anchorInfo);
|
||||
}
|
||||
|
||||
return crafter_anchor_infos;
|
||||
}
|
||||
|
||||
public static Position getMyhomeStartPosAnchorPosition(this MyhomeUgcInfo myhomeUgcInfo)
|
||||
{
|
||||
var startPos = new Position();
|
||||
|
||||
foreach (var frameworkInfo in myhomeUgcInfo.FrameworkInfos)
|
||||
{
|
||||
if (frameworkInfo.InteriorItemId != MetaHelper.GameConfigMeta.MyhomeStartPoint)
|
||||
continue;
|
||||
|
||||
startPos.X = frameworkInfo.Coordinate.X;
|
||||
startPos.Y = frameworkInfo.Coordinate.Y;
|
||||
startPos.Z = frameworkInfo.Coordinate.Z;
|
||||
}
|
||||
|
||||
return startPos;
|
||||
}
|
||||
|
||||
public static MyHomeInfo toMyhomeInfo(this MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
var myhome_info = new MyHomeInfo();
|
||||
|
||||
myhome_info.MyhomeGuid = myhomeAttribute.MyhomeGuid;
|
||||
myhome_info.MyhomeName = myhomeAttribute.MyhomeName;
|
||||
myhome_info.MyhomeUgcInfo = myhomeAttribute.UgcInfo;
|
||||
|
||||
return myhome_info;
|
||||
}
|
||||
|
||||
public static string makeMyhomeUgcInfoS3FileName()
|
||||
{
|
||||
return $"{Guid.NewGuid().ToString("N")}.ugcinfo";
|
||||
}
|
||||
|
||||
public static string makeMyhomeUgcInfoS3Key(MyHomeAttrib myhomeAttrib)
|
||||
{
|
||||
return makeMyhomeUgcInfoS3Key(myhomeAttrib.MyhomeGuid, myhomeAttrib.MyhomeUgcInfoS3FileName);
|
||||
}
|
||||
|
||||
public static string makeMyhomeUgcInfoS3Key(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
return makeMyhomeUgcInfoS3Key(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName);
|
||||
}
|
||||
|
||||
public static string makeMyhomeUgcInfoS3Key(string myhomeGuid, string myhomeUgcInfoS3FileName)
|
||||
{
|
||||
return $"{myhomeGuid}/{myhomeUgcInfoS3FileName}";
|
||||
}
|
||||
|
||||
public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(MyHomeAttrib myhomeAttrib)
|
||||
{
|
||||
return await getMyhomeUgcInfo(myhomeAttrib.MyhomeGuid, myhomeAttrib.MyhomeUgcInfoS3FileName);
|
||||
}
|
||||
|
||||
public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
return await getMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName);
|
||||
}
|
||||
|
||||
public static async Task<(Result, MyhomeUgcInfo?)> getMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var myhome_ugc_info_json = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName;
|
||||
|
||||
if (server_logic.getServerConfig().OfflineMode)
|
||||
{
|
||||
var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}";
|
||||
|
||||
myhome_ugc_info_json = File.ReadAllText(file_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName);
|
||||
|
||||
var s3_client = server_logic.getS3Connector();
|
||||
(result, myhome_ugc_info_json) = await s3_client.getMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to getMyhomeUgcInfo() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return (result, null);
|
||||
}
|
||||
}
|
||||
|
||||
var myhome_ugc_info = JsonConvert.DeserializeObject<MyhomeUgcInfo>(myhome_ugc_info_json);
|
||||
if (myhome_ugc_info == null)
|
||||
{
|
||||
err_msg = $"Failed to JsonConvert.DeserializeObject<MyhomeUgcInfo>() !!!";
|
||||
result.setFail(ServerErrorCode.JsonConvertDeserializeFailed, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return (result, null);
|
||||
}
|
||||
|
||||
return (result, myhome_ugc_info);
|
||||
}
|
||||
|
||||
public static async Task<Result> uploadMyhomeUgcInfo(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
return await uploadMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName, myhomeAttribute.UgcInfo.toJson());
|
||||
}
|
||||
|
||||
public static async Task<Result> uploadMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName, string myhomeUgcInfo)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName;
|
||||
|
||||
if (server_logic.getServerConfig().OfflineMode)
|
||||
{
|
||||
var folder_path = $"./S3/{bucket_name}/{myhomeGuid}";
|
||||
var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}";
|
||||
|
||||
if (!Directory.Exists(folder_path))
|
||||
{
|
||||
Directory.CreateDirectory(folder_path);
|
||||
}
|
||||
|
||||
File.WriteAllText(file_path, myhomeUgcInfo);
|
||||
}
|
||||
else
|
||||
{
|
||||
var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName);
|
||||
ArgumentNullException.ThrowIfNull(myhome_ugc_info_s3_key, $"myhome_ugc_info_s3_key is null !!!");
|
||||
|
||||
var s3_client = server_logic.getS3Connector();
|
||||
result = await s3_client.uploadMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key, myhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Fail to uploadMyhomeUgcInfo() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<Result> deleteMyhomeUgcInfo(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
return await deleteMyhomeUgcInfo(myhomeAttribute.MyhomeGuid, myhomeAttribute.MyhomeUgcInfoS3FileName);
|
||||
}
|
||||
|
||||
public static async Task<Result> deleteMyhomeUgcInfo(string myhomeGuid, string myhomeUgcInfoS3FileName)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName;
|
||||
|
||||
if (server_logic.getServerConfig().OfflineMode)
|
||||
{
|
||||
var file_path = $"./S3/{bucket_name}/{myhomeGuid}/{myhomeUgcInfoS3FileName}";
|
||||
|
||||
File.Delete(file_path);
|
||||
}
|
||||
else
|
||||
{
|
||||
var myhome_ugc_info_s3_key = makeMyhomeUgcInfoS3Key(myhomeGuid, myhomeUgcInfoS3FileName);
|
||||
ArgumentNullException.ThrowIfNull(myhome_ugc_info_s3_key, $"myhome_ugc_info_s3_key is null !!!");
|
||||
|
||||
var s3_client = server_logic.getS3Connector();
|
||||
result = await s3_client.deleteMyhomeUgcInfo(bucket_name, myhome_ugc_info_s3_key);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Fail to deleteMyhomeUgcInfo() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<Result> deleteMyhomeUgcInfoFolderFile(MyhomeAttribute myhomeAttribute)
|
||||
{
|
||||
return await deleteMyhomeUgcInfoFolderFile(myhomeAttribute.MyhomeGuid);
|
||||
}
|
||||
|
||||
public static async Task<Result> deleteMyhomeUgcInfoFolderFile(string myhomeGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var bucket_name = server_logic.getServerConfig().AWS.S3.MyhomeUgcInfoBucketName;
|
||||
|
||||
if (server_logic.getServerConfig().OfflineMode)
|
||||
{
|
||||
var folder_path = $"./S3/{bucket_name}/{myhomeGuid}";
|
||||
|
||||
Directory.Delete(folder_path, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
var s3_client = server_logic.getS3Connector();
|
||||
result = await s3_client.deleteMyhomeUgcInfoFolderFile(bucket_name, myhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Fail to deleteMyhomeUgcInfoFolderFile() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static async Task<Result> checkMyhomeIsEditting(string myhomeGuid, string myhomeOwnerGuid)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
ArgumentNullException.ThrowIfNull(server_logic, $"server_logic is null !!!");
|
||||
|
||||
var instance_room_storage = new InstanceRoomStorage();
|
||||
instance_room_storage.Init(server_logic.getRedisDb(), "");
|
||||
|
||||
var edit_room_instance_room_id_base = InstanceRoomHandler.makeEditRoomInstanceRoomIdBase(myhomeOwnerGuid);
|
||||
var edit_room_instance_room_id = await InstanceRoomHandler.makeInstanceRoomId(edit_room_instance_room_id_base, 0);
|
||||
|
||||
var edit_room_instance_room_info = await instance_room_storage.GetInstanceRoomInfo(edit_room_instance_room_id);
|
||||
if (edit_room_instance_room_info != null)
|
||||
{
|
||||
if (edit_room_instance_room_info.MyhomeGuid == myhomeGuid)
|
||||
{
|
||||
err_msg = $"Myhome is Editting !!! : myhomeGuid:{myhomeGuid}";
|
||||
result.setFail(ServerErrorCode.MyhomeIsEditting, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Result getMyhomeInstanceId(int editableRoomId, out int instanceId)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
instanceId = 0;
|
||||
|
||||
if (!MetaData.Instance._EditableRoomMetaTable.TryGetValue(editableRoomId, out var editable_room_meta_data))
|
||||
{
|
||||
err_msg = $"Failed to MetaData.TryGetValue() !!! : editableRoomMetaId:{editableRoomId}";
|
||||
result.setFail(ServerErrorCode.EditableRoomMetaDataNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
switch(editable_room_meta_data.SizeType)
|
||||
{
|
||||
case MetaAssets.SizeType.SMALL:
|
||||
{
|
||||
instanceId = MetaHelper.GameConfigMeta.SmallTypeMyhome;
|
||||
}
|
||||
break;
|
||||
case MetaAssets.SizeType.MEDIUM:
|
||||
{
|
||||
instanceId = MetaHelper.GameConfigMeta.MediumTypeMyhome;
|
||||
}
|
||||
break;
|
||||
case MetaAssets.SizeType.LARGE:
|
||||
{
|
||||
instanceId = MetaHelper.GameConfigMeta.LargeTypeMyhome;
|
||||
}
|
||||
break;
|
||||
case MetaAssets.SizeType.GIANT:
|
||||
{
|
||||
instanceId = MetaHelper.GameConfigMeta.GiantTypeMyhome;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
{
|
||||
err_msg = $"SizeType invalid !!! : {editable_room_meta_data.SizeType.ToString()}";
|
||||
result.setFail(ServerErrorCode.EditableRoomSizeTypeInvalid, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
149
GameServer/Contents/MyHome/Helper/MyhomeNotifyHelper.cs
Normal file
149
GameServer/Contents/MyHome/Helper/MyhomeNotifyHelper.cs
Normal file
@@ -0,0 +1,149 @@
|
||||
using MongoDB.Bson.Serialization.Conventions;
|
||||
using ServerCommon;
|
||||
using ServerCore; using ServerBase;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static ClientToGameMessage.Types;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
internal static class MyhomeNotifyHelper
|
||||
{
|
||||
public static bool send_S2C_MYHOME_INFO_NOTI(this Player player)
|
||||
{
|
||||
var ntf_packet = new ClientToGame();
|
||||
ntf_packet.Message = new ClientToGameMessage();
|
||||
ntf_packet.Message.MyHomeInfoNoti = new MyHomeInfoNoti();
|
||||
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!!");
|
||||
|
||||
if (myhome_agent_action.tryGetSelectedMyhome(out var select_myhome))
|
||||
{
|
||||
var myhome_attribute = select_myhome.getEntityAttribute<MyhomeAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!!");
|
||||
|
||||
ntf_packet.Message.MyHomeInfoNoti.SelectedMyhomeGuid = myhome_attribute.MyhomeGuid;
|
||||
}
|
||||
|
||||
var user_contents_setting_attribute = player.getEntityAttribute<UserContentsSettingAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(user_contents_setting_attribute, () => $"user_contents_setting_attribute is null !!!");
|
||||
|
||||
ntf_packet.Message.MyHomeInfoNoti.OpenSlotCount = user_contents_setting_attribute.MyhomeSlotOpenCount;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ntf_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool send_S2C_NTF_MYHOME_INFO(this Player player)
|
||||
{
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!!");
|
||||
|
||||
var myhomes = myhome_agent_action.getMyHomes();
|
||||
foreach (var myhome in myhomes)
|
||||
{
|
||||
var ntf_packet = new ClientToGame();
|
||||
ntf_packet.Message = new ClientToGameMessage();
|
||||
ntf_packet.Message.NtfMyhomeInfo = new GS2C_NTF_MYHOME_INFO();
|
||||
|
||||
var myhome_action = myhome.getEntityAction<MyhomeAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!!");
|
||||
|
||||
var myhome_info = myhome_action.toMyHomeInfo();
|
||||
ntf_packet.Message.NtfMyhomeInfo.MyhomeInfo = myhome_info;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ntf_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public static ClientToGame makeNtfMyHomeAddPacket(int myhome_meta_id)
|
||||
{
|
||||
var ntf_packet = new ClientToGame();
|
||||
ntf_packet.Message = new ClientToGameMessage();
|
||||
ntf_packet.Message.MyHomeAddNoti = new MyHomeAddNoti();
|
||||
|
||||
ntf_packet.Message.MyHomeAddNoti.MyHomeId = myhome_meta_id;
|
||||
|
||||
return ntf_packet;
|
||||
}
|
||||
|
||||
public static bool send_S2C_NTF_MYHOME_UGC_INFO(Player player, MyHomeInfo myhomeInfo)
|
||||
{
|
||||
var ntf_packet = new ClientToGame();
|
||||
ntf_packet.Message = new ClientToGameMessage();
|
||||
ntf_packet.Message.NtfMyhomeUgcInfo = new GS2C_NTF_MYHOME_UGC_INFO();
|
||||
ntf_packet.Message.NtfMyhomeUgcInfo.MyhomeGuid = myhomeInfo.MyhomeGuid;
|
||||
ntf_packet.Message.NtfMyhomeUgcInfo.MyhomeUgcInfo = myhomeInfo.MyhomeUgcInfo;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ntf_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool send_GS2GS_NTF_EXCHANGE_MYHOME(string destServer, string roomId, string myhomeGuid, MyHomeInfo myhomeInfo)
|
||||
{
|
||||
var message = new ServerMessage();
|
||||
message.NtfExchangeMyhome = new();
|
||||
message.NtfExchangeMyhome.RoomId = roomId;
|
||||
message.NtfExchangeMyhome.MyhomeGuid = myhomeGuid;
|
||||
message.NtfExchangeMyhome.MyhomeInfo = myhomeInfo;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
||||
ArgumentNullException.ThrowIfNull(rabbit_mq);
|
||||
|
||||
rabbit_mq.SendMessage(destServer, message);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool send_GS2C_NTF_MYHOME_HOST_ENTER_EDIT_ROOM(Player player)
|
||||
{
|
||||
var ntf_packet = new ClientToGame();
|
||||
ntf_packet.Message = new ClientToGameMessage();
|
||||
ntf_packet.Message.NtfMyhomeHostEnterEditRoom = new GS2C_NTF_MYHOME_HOST_ENTER_EDIT_ROOM();
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(player, ntf_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool send_GS2GS_NTF_MYHOME_HOST_ENTER_EDIT_ROOM(string destServer, string roomId, string exceptUserGuid)
|
||||
{
|
||||
var message = new ServerMessage();
|
||||
message.NtfMyhomeHostEnterEditRoom = new();
|
||||
message.NtfMyhomeHostEnterEditRoom.RoomId = roomId;
|
||||
message.NtfMyhomeHostEnterEditRoom.ExceptUserGuid = exceptUserGuid;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var rabbit_mq = server_logic.getRabbitMqConnector() as RabbitMQ4Game;
|
||||
ArgumentNullException.ThrowIfNull(rabbit_mq);
|
||||
|
||||
rabbit_mq.SendMessage(destServer, message);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
130
GameServer/Contents/MyHome/Myhome.cs
Normal file
130
GameServer/Contents/MyHome/Myhome.cs
Normal file
@@ -0,0 +1,130 @@
|
||||
using ServerCommon;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using ServerCore; using ServerBase;
|
||||
using OWNER_GUID = System.String;
|
||||
using MASTER_GUID = System.String;
|
||||
|
||||
namespace GameServer
|
||||
{
|
||||
public class Myhome : EntityBase, IMergeWithInventory
|
||||
{
|
||||
public Myhome(MASTER_GUID masterGuid)
|
||||
: base(EntityType.MyHome, masterGuid)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
addEntityAttribute(new MyhomeAttribute(this));
|
||||
|
||||
addEntityAction(new MyhomeAction(this));
|
||||
addEntityAction(new MyhomeInventoryAction(this));
|
||||
|
||||
return await base.onInit();
|
||||
}
|
||||
|
||||
public async Task<Result> onMerge(List<ReservedSlotOnInven> reservedSlotOnInvens, TransactionRunner transactionRunner)
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
var inventory_action = getEntityAction<InventoryActionBase>();
|
||||
ArgumentNullException.ThrowIfNull(inventory_action, $"inventory_action is null !!! - {toBasicStringWithMaster()}");
|
||||
ArgumentNullException.ThrowIfNull(transactionRunner, $"transactionRunner is null !!! - {toBasicStringWithMaster()}");
|
||||
|
||||
result = await inventory_action.onMergeInventory(reservedSlotOnInvens, transactionRunner);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override EntityBase? onGetMasterEntity()
|
||||
{
|
||||
if (false == hasMasterGuid())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var master_guid = getMasterGuid();
|
||||
ArgumentNullException.ThrowIfNull(master_guid, $"master_guid is null !!! - {toBasicString()}");
|
||||
|
||||
var server_logc = GameServerApp.getServerLogic();
|
||||
ArgumentNullException.ThrowIfNull(server_logc, $"server_logc is null !!! - {toBasicString()}");
|
||||
var player_manager = server_logc.getPlayerManager();
|
||||
ArgumentNullException.ThrowIfNull(player_manager, $"player_manager is null !!! - {toBasicString()}");
|
||||
|
||||
if (false == player_manager.tryGetUserByPrimaryKey(master_guid, out var found_player))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return found_player;
|
||||
}
|
||||
|
||||
public override TAction getEntityAction<TAction>()
|
||||
{
|
||||
if (typeof(TAction) == typeof(InventoryActionBase))
|
||||
{
|
||||
var myhome_action = base.getEntityAction<MyhomeInventoryAction>() as TAction;
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!!");
|
||||
return myhome_action;
|
||||
}
|
||||
|
||||
var action = base.getEntityAction<TAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(action, () => $"action is null !!!");
|
||||
return action;
|
||||
}
|
||||
|
||||
public override Type onGetAvailableItemAttributeType()
|
||||
{
|
||||
return typeof(MyhomeItemAttribute);
|
||||
}
|
||||
|
||||
public override OWNER_GUID onGetGuidOfOwnerEntityType()
|
||||
{
|
||||
var myhome_attribute = getEntityAttributeWithReadOnly<MyhomeAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!! - {toBasicStringWithMaster()}");
|
||||
|
||||
return myhome_attribute.MyhomeGuid;
|
||||
}
|
||||
|
||||
public bool isAnchorInMyhome(string anchor_guid)
|
||||
{
|
||||
var myhome_attribute = getEntityAttributeWithReadOnly<MyhomeAttribute>();
|
||||
ArgumentNullException.ThrowIfNull(myhome_attribute, $"myhome_attribute is null !!! - {toBasicStringWithMaster()}");
|
||||
|
||||
foreach(var anchor in myhome_attribute.UgcInfo.AnchorInfos)
|
||||
{
|
||||
if(anchor.AnchorGuid == anchor_guid)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public override OwnerEntityType onGetOwnerEntityType()
|
||||
{
|
||||
return OwnerEntityType.Myhome;
|
||||
}
|
||||
|
||||
public override string toBasicString()
|
||||
{
|
||||
return $"{this.getTypeName()}, MyHomeGuid:{getOriginEntityAttribute<MyhomeAttribute>()?.MyhomeGuid}";
|
||||
}
|
||||
|
||||
public override string toSummaryString()
|
||||
{
|
||||
return $"{this.getTypeName()}, {getEntityAttribute<MyhomeAttribute>()?.toBasicString()}";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_DELETE_MYHOME), typeof(DeleteMyhomePacketHandler), typeof(GameLoginListener))]
|
||||
internal class DeleteMyhomePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_DELETE_MYHOME(Player owner, Result result, GS2C_ACK_DELETE_MYHOME res)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckDeleteMyhome = res;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqDeleteMyhome;
|
||||
var res = new GS2C_ACK_DELETE_MYHOME();
|
||||
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var rental_agent_action = player.getEntityAction<RentalAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(rental_agent_action, () => $"rental_agent_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
res.MyhomeGuid = request.MyhomeGuid;
|
||||
|
||||
if (rental_agent_action.isRentalMyhome(request.MyhomeGuid))
|
||||
{
|
||||
err_msg = $"Myhome is On Rental !!! : MyhomeGuid:{request.MyhomeGuid} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.MyhomeIsOnRental, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_DELETE_MYHOME(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
(result, var modify_ugc_npc_state_infos, var business_logs) = await myhome_agent_action.tryDeleteMyhome(request.MyhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryDeleteMyhome() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_DELETE_MYHOME(player, result, res);
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(modify_ugc_npc_state_infos, () => $"modify_ugc_npc_state_infos is null !!! - {player.toBasicString()}");
|
||||
NullReferenceCheckHelper.throwIfNull(business_logs, () => $"business_logs is null !!! - {player.toBasicString()}");
|
||||
|
||||
foreach (var (key, value) in modify_ugc_npc_state_infos)
|
||||
{
|
||||
res.ModigyUgcNpcStateInfos.Add(key, value);
|
||||
}
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.DeleteMyhome, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(business_logs);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_DELETE_MYHOME(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
|
||||
res.CommonResult = found_transaction_runner.getCommonResult();
|
||||
|
||||
send_S2C_ACK_DELETE_MYHOME(player, result, res);
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "DeleteMyhome", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,106 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameReq.Types;
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ExchangeMyHomeReq), typeof(ExchangeMyHomePacketHandler), typeof(GameLoginListener))]
|
||||
internal class ExchangeMyHomePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_EXCHANGE_MYHOME(Player owner, Result result, ExchagneMyHomeRes res)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.ExchagneMyHomeRes = new ExchagneMyHomeRes();
|
||||
ack_packet.Response.ExchagneMyHomeRes = res;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ExchangeMyHomeReq;
|
||||
var res = new ExchagneMyHomeRes();
|
||||
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
int myhome_id = 0;
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
(result, res, var business_logs) = myhome_agent_action.tryExchangeMyHome(request.MyhomeGuid);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryExchangeMyHome() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_EXCHANGE_MYHOME(player, result, res);
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(business_logs, () => $"business_logs is null !!! - {player.toBasicString()}");
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.None, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(business_logs);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_EXCHANGE_MYHOME(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
send_S2C_ACK_EXCHANGE_MYHOME(player, result, res);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "ExchangeMyHome", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
await QuestManager.It.QuestCheck(player, new QuestMyHome(EQuestEventTargetType.MYHOME, EQuestEventNameType.CHANGED, myhome_id.ToString()));
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.ExchangeMyHomePropReq), typeof(ExchangeMyHomePropPacketHandler), typeof(GameLoginListener))]
|
||||
internal class ExchangeMyHomePropPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_EXCHANGE_MYHOME_PROP(Player owner, Result result, string anchorGuid = "", string itemGuid = "")
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.ExchagneMyHomePropRes = new ExchagneMyHomePropRes();
|
||||
|
||||
if (result.isSuccess())
|
||||
{
|
||||
ack_packet.Response.ExchagneMyHomePropRes.AnchorGuid = anchorGuid;
|
||||
ack_packet.Response.ExchagneMyHomePropRes.ItmeGuid = itemGuid;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ExchangeMyHomePropReq;
|
||||
|
||||
// 미사용 패킷 정리
|
||||
result.setFail(ServerErrorCode.FunctionNotImplemented);
|
||||
send_S2C_ACK_EXCHANGE_MYHOME_PROP(player, result);
|
||||
|
||||
await Task.CompletedTask;
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_RENAME_MYHOME), typeof(RenameMyhomePacketHandler), typeof(GameLoginListener))]
|
||||
internal class RenameMyhomePacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_RENAME_MYHOME(Player owner, Result result, string myhomeGuid, string newMyhomeNmae)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckRenameMyhome = new();
|
||||
|
||||
if (result.isSuccess())
|
||||
{
|
||||
ack_packet.Response.AckRenameMyhome.MyhomeGuid = myhomeGuid;
|
||||
ack_packet.Response.AckRenameMyhome.NewMyhomeName = newMyhomeNmae;
|
||||
}
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {player.toBasicString()}");
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqRenameMyhome;
|
||||
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
|
||||
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
(result, var business_logs) = myhome_agent_action.tryRenameMyhome(request.MyhomeGuid, request.NewMyhomeName);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryRenameMyhome() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_RENAME_MYHOME(player, result, string.Empty, string.Empty);
|
||||
return result;
|
||||
}
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(business_logs, () => $"business_logs is null !!!");
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.RenameMyhome, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal());
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(business_logs);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
send_S2C_ACK_RENAME_MYHOME(player, result, string.Empty, string.Empty);
|
||||
return result;
|
||||
}
|
||||
|
||||
send_S2C_ACK_RENAME_MYHOME(player, result, request.MyhomeGuid, request.NewMyhomeName);
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "RenameMyhome", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,263 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using static ClientToGameRes.Types;
|
||||
|
||||
|
||||
namespace GameServer.PacketHandler;
|
||||
|
||||
|
||||
[PacketHandler(typeof(ClientToGameReq), typeof(ClientToGameReq.Types.C2GS_REQ_SAVE_MYHOME_UGC), typeof(SaveMyhomeUgcPacketHandler), typeof(GameLoginListener))]
|
||||
internal class SaveMyhomeUgcPacketHandler : PacketRecvHandler
|
||||
{
|
||||
public static bool send_S2C_ACK_SAVE_MYHOME_UGC(Player owner, Result result, GS2C_ACK_SAVE_MYHOME_UGC res)
|
||||
{
|
||||
var ack_packet = new ClientToGame();
|
||||
ack_packet.Response = new ClientToGameRes();
|
||||
|
||||
ack_packet.Response.ErrorCode = result.ErrorCode;
|
||||
ack_packet.Response.AckSaveMyhomeUgc = res;
|
||||
|
||||
if (false == GameServerApp.getServerLogic().onSendPacket(owner, ack_packet))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override async Task<Result> onProcessPacket(ISession entityWithSession, Google.Protobuf.IMessage recvMessage)
|
||||
{
|
||||
var result = new Result();
|
||||
var err_msg = string.Empty;
|
||||
|
||||
var player = entityWithSession as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
|
||||
var req_msg = recvMessage as ClientToGame;
|
||||
NullReferenceCheckHelper.throwIfNull(req_msg, () => $"req_msg is null !!! - {player.toBasicString()}");
|
||||
|
||||
var request = req_msg.Request.ReqSaveMyhomeUgc;
|
||||
NullReferenceCheckHelper.throwIfNull(request, () => $"request is null !!! - {player.toBasicString()}");
|
||||
|
||||
var res = new GS2C_ACK_SAVE_MYHOME_UGC();
|
||||
|
||||
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
Myhome? myhome;
|
||||
|
||||
if (request.MyhomeGuid == string.Empty)
|
||||
{
|
||||
result = myhome_agent_action.checkMyhomeSlot();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to checkMyhomeSlot() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
myhome = new Myhome(player.getUserGuid());
|
||||
result = await myhome.onInit();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to onInit() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
var new_myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(new_myhome_attribute, () => $"new_myhome_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
new_myhome_attribute.newEntityAttribute();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!myhome_agent_action.tryGetMyHome(request.MyhomeGuid, out myhome))
|
||||
{
|
||||
err_msg = $"Failed to tryGetMyHome() !!! : myhomeGuid:{request.MyhomeGuid} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
|
||||
Log.getLogger().error(result.toBasicString());
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
var myhome_origin_attribute = myhome.getOriginEntityAttribute<MyhomeAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_origin_attribute, () => $"myhome_origin_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
var old_myhome_ugc_info_s3_file_name = myhome_origin_attribute.MyhomeUgcInfoS3FileName;
|
||||
|
||||
var myhome_action = myhome.getEntityAction<MyhomeAction>();
|
||||
|
||||
(result, res, var business_logs) = await myhome_action.trySaveMyhomeUgcInfo(request.MyhomeName, request.MyhomeUgcInfo);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to trySaveMyhomeUgcInfo() !!! : {result.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(business_logs, () => $"business_logs is null !!! - {player.toBasicString()}");
|
||||
|
||||
// Mantis#3451 로 주석 처리
|
||||
//var myhome_instance_room_infos = new List<InstanceRoomInfo>();
|
||||
//var myhome_info = new MyHomeInfo();
|
||||
|
||||
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
var new_myhome_ugc_info_s3_file_name = myhome_attribute.MyhomeUgcInfoS3FileName;
|
||||
|
||||
// Mantis#3451 로 주석 처리
|
||||
//if (myhome_attribute.SelectedFlag == 1)
|
||||
//{
|
||||
// (result, myhome_instance_room_infos) = await InstanceRoomHandler.tryGetMyhomeInstanceRoomInfos(entity_player.getUserGuid());
|
||||
// if (result.isFail())
|
||||
// {
|
||||
// err_msg = $"Failed to tryGetMyhomeServers() !!! : {result.toBasicString()}";
|
||||
// Log.getLogger().error(err_msg);
|
||||
|
||||
// send_S2C_ACK_SAVE_MYHOME_UGC(entity_player, result, res);
|
||||
// return result;
|
||||
// }
|
||||
|
||||
// myhome_info = myhome_action.toMyHomeInfo();
|
||||
//}
|
||||
|
||||
result = await myhome_action.tryUploadMyhomeUgcInfoToS3();
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to tryUploadMyhomeUgcInfoToS3() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
var rental_agent_action = player.getEntityAction<RentalAgentAction>();
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.SaveMyhome, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
batch.addQuery(new QueryFinal(), onCommit);
|
||||
}
|
||||
|
||||
batch.appendBusinessLogs(business_logs);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
await MyhomeHelper.deleteMyhomeUgcInfo(request.MyhomeGuid, new_myhome_ugc_info_s3_file_name);
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
return result;
|
||||
}
|
||||
|
||||
await MyhomeHelper.deleteMyhomeUgcInfo(request.MyhomeGuid, old_myhome_ugc_info_s3_file_name);
|
||||
|
||||
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
res.CommonResult = found_transaction_runner.getCommonResult();
|
||||
|
||||
send_S2C_ACK_SAVE_MYHOME_UGC(player, result, res);
|
||||
|
||||
if (rental_agent_action.isRentalMyhome(request.MyhomeGuid))
|
||||
{
|
||||
if (res.ModigyUgcNpcStateInfos.Count > 0)
|
||||
{
|
||||
var add_ugc_npc_guids = new List<string>();
|
||||
var delete_ugc_npc_guids = new List<string>();
|
||||
|
||||
foreach (var (ugc_npc_guid, ugc_npc_state_info) in res.ModigyUgcNpcStateInfos)
|
||||
{
|
||||
switch (ugc_npc_state_info.StateType)
|
||||
{
|
||||
case EntityStateType.None:
|
||||
{
|
||||
delete_ugc_npc_guids.Add(ugc_npc_guid);
|
||||
}
|
||||
break;
|
||||
case EntityStateType.UsingByMyHome:
|
||||
{
|
||||
add_ugc_npc_guids.Add(ugc_npc_guid);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
var (land_meta_id, buidling_meta_id, floor) = rental_agent_action.getAddrressFromMyhome(request.MyhomeGuid);
|
||||
var modify_floor_linked_infos = new List<ModifyFloorLinkedInfo>();
|
||||
|
||||
if (add_ugc_npc_guids.Count > 0)
|
||||
{
|
||||
var add_modify_floor_linked_info = MapHelper.makeModifyFloorLinkedInfo(ModifyType.Add, land_meta_id, buidling_meta_id, floor, add_ugc_npc_guids);
|
||||
modify_floor_linked_infos.Add(add_modify_floor_linked_info);
|
||||
}
|
||||
|
||||
if (delete_ugc_npc_guids.Count > 0)
|
||||
{
|
||||
var delete_modify_floor_linked_info = MapHelper.makeModifyFloorLinkedInfo(ModifyType.Delete, land_meta_id, buidling_meta_id, floor, delete_ugc_npc_guids);
|
||||
modify_floor_linked_infos.Add(delete_modify_floor_linked_info);
|
||||
}
|
||||
|
||||
MapNotifyHelper.sendNtfModifyFloorLinkedInfos(modify_floor_linked_infos);
|
||||
}
|
||||
}
|
||||
|
||||
// Mantis#3451 로 주석 처리
|
||||
//foreach (var myhome_instance_room_info in myhome_instance_room_infos)
|
||||
//{
|
||||
// var server_name = ServerHelper.makeServerNameByNetworkAddress(ServerType.Indun, myhome_instance_room_info.InstanceAddress, (ushort)myhome_instance_room_info.InstancePort);
|
||||
|
||||
// MyhomeNotifyHelper.send_GS2GS_NTF_EXCHANGE_MYHOME(server_name, myhome_instance_room_info.roomId, request.MyhomeGuid, myhome_info);
|
||||
//}
|
||||
|
||||
if (request.MyhomeGuid == string.Empty)
|
||||
{
|
||||
myhome_agent_action.addMyhome(myhome_attribute.MyhomeGuid, myhome);
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "SaveMyhomeUgc", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
}
|
||||
|
||||
int npc_prop_count = request.MyhomeUgcInfo.AnchorInfos.Count(ugc_anchor_info => ugc_anchor_info.isNpcProp());
|
||||
|
||||
//지금 beacon만 들어간다는데 나중에 다른거 들어갈경우, 문자열 enum처리
|
||||
await QuestManager.It.QuestCheck(player, new QuestInteriroMode(EQuestEventTargetType.INTERIORMODE, EQuestEventNameType.COMPLETED, "BEACON", npc_prop_count));
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
async Task<QueryBatchBase.QueryResultType> onCommit(QueryExecutorBase query)
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
return QueryBatchBase.QueryResultType.Success;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user