869 lines
30 KiB
C#
869 lines
30 KiB
C#
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;
|
|
}
|
|
}
|