초기커밋

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

View File

@@ -0,0 +1,122 @@

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
namespace GameServer
{
public abstract class EntityCreatorBase : SimpleEventTriggerBase
{
private readonly Player m_owner;
private List<DynamoDbDocBase> m_to_write_docs = new();
private bool m_is_completed_prepare_create = false;
public EntityCreatorBase(Player owner)
{
m_owner = owner;
}
public abstract Task<Result> onPrepareCreate();
protected Result addWriteDocBases(List<DynamoDbDocBase> docBases)
{
var result = new Result();
var err_msg = string.Empty;
foreach (var doc_base in docBases)
{
result = addWriteDocBase(doc_base);
if(result.isFail())
{
return result;
}
}
return result;
}
protected Result addWriteDocBase(DynamoDbDocBase docBase)
{
var result = new Result();
var err_msg = string.Empty;
if (true == m_to_write_docs.Exists(x => x.GetType() == docBase.GetType()))
{
err_msg = $"Already added DynamoDbDocBase by Exists() !!!, duplicated Doc : {docBase.getTypeName()} - {toBasicString()}";
result.setFail(ServerErrorCode.UserCreationForDynamoDbDocDuplicated, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
m_to_write_docs.Add(docBase);
return result;
}
protected void pushWriteDocBase(DynamoDbDocBase docBase)
{
m_to_write_docs.Add(docBase);
}
protected void pushWriteDocBases(List<DynamoDbDocBase> docBases)
{
m_to_write_docs.AddRange(docBases);
}
public void deleteWriteDoc<TDoc>()
where TDoc : DynamoDbDocBase
{
var found_doc = getToWriteDocBase<TDoc>();
if (found_doc == null)
{
return;
}
m_to_write_docs.Remove(found_doc);
}
public TDoc? getToWriteDocBase<TDoc>()
where TDoc : DynamoDbDocBase
{
return m_to_write_docs.Find(x => x is TDoc == true) as TDoc;
}
public List<TDoc> getToWriteDocBases<TDoc>()
where TDoc : DynamoDbDocBase
{
return m_to_write_docs.FindAll(doc => doc is TDoc == true).ConvertAll(doc => (TDoc)doc);
}
public List<DynamoDbDocBase> getToWriteDocBases()
{
return m_to_write_docs;
}
public bool isCompletedPrepareCreate() => m_is_completed_prepare_create;
public void setCompetedPrepareCreate(bool isTrue) => m_is_completed_prepare_create = isTrue;
public Player getOwner() => m_owner;
}
}

View File

@@ -0,0 +1,205 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using Amazon.S3.Model;
using ServerCommon.BusinessLogDomain;
namespace GameServer
{
public class DefaultCharacterCreator : EntityCreatorBase
{
private ServerCommon.BusinessLogDomain.CharacterCreateLogInfo m_character_create_log = new();
private ServerCommon.BusinessLogDomain.CharacterLogInfo m_character_log = new();
public DefaultCharacterCreator(Player owner)
: base(owner)
{
}
public override async Task<Result> onPrepareCreate()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var player_action = owner.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var character = new Character(owner);
result = await character.onInit();
if (result.isFail())
{
return result;
}
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!! - {owner.toBasicString()}");
// 1. CharacterBaseDoc 정보를 구성 한다.
(result, var new_character_base_doc) = await MetaHelper.fillupCharacterBaseDocByUserCreateData( ServerCommon.Constant.USER_CREATE_META_DEFAULT_ID
, user_attribute, character_attribute );
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(new_character_base_doc, () => $"new_character_base_doc is null !!! - {owner.toBasicString()}");
result = addWriteDocBase(new_character_base_doc);
if (result.isFail())
{
return result;
}
user_create_or_load_action.setReservedCharacterForCreation(character);
// 2. UserBaseDoc 정보를 갱신 한다. SelectedCharacterGuid 설정 !!!
user_attribute.SelectedCharacterGuid = character_attribute.CharacterGuid;
user_attribute.modifiedEntityAttribute();
var user_base_doc = user_attribute.onCreateDocBase() as UserBaseDoc;
NullReferenceCheckHelper.throwIfNull(user_base_doc, () => $"user_base_doc is null !!! - {owner.toBasicString()}");
result = await user_attribute.fillupDoc4QueryWithAttribute(user_base_doc);
if (result.isFail())
{
return result;
}
result = addWriteDocBase(user_base_doc);
if (result.isFail())
{
return result;
}
(result, var found_user_create_data) = await MetaHelper.getUserCreateDataByAccountId(ServerCommon.Constant.USER_CREATE_META_DEFAULT_ID, user_attribute.AccountId);
if (result.isFail())
{
err_msg = $"Not found serCreateData for Character Create !!! : {result.toBasicString()} - accountId:{user_attribute.AccountId}";
Log.getLogger().error(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(found_user_create_data, () => $"found_user_create_data is null !!! - {owner.toBasicString()}");
setCompetedPrepareCreate(true);
// CharacterCreate 로그 설정
m_character_create_log.CharacterGuid = character_attribute.CharacterGuid;
m_character_create_log.CharacterPK = new_character_base_doc.getPK();
m_character_create_log.CharacterSK = new_character_base_doc.getSK();
m_character_create_log.CharacterCreateMetaType = found_user_create_data.getTypeName();
m_character_create_log.CharacterCreateMetaId = (META_ID)found_user_create_data.MetaId;
// . 유저 닉네임이 생성된 경우는 즉시 캐릭터 정보를 생성 한다.
if (user_create_or_load_action.isCreatedUserNickname())
{
await onTriggerEffect();
}
Log.getLogger().info($"Step Prepare Create Default Character Success : onPrepareCreate() - {owner.toBasicString()}");
return result;
}
public override async Task<Result> onTriggerEffect()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var server_logic = GameServerApp.getServerLogic();
if (false == isCompletedPrepareCreate())
{
err_msg = $"Not completed isCompletedPrepareCreate() !!! - {toBasicString()}, {getOwner().toBasicString()}";
result.setFail(ServerErrorCode.DefaultCharacterPrepareCreateNotCompleted, err_msg);
return result;
}
if (true == isCompleted())
{
err_msg = $"Default Character completed creation !!! - {toBasicString()}, {getOwner().toBasicString()}";
Log.getLogger().info(err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.CharacterCreate
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQEntityWrite(getToWriteDocBases()));
batch.addQuery(new QueryFinal(), tryUpdateCharacterCreate);
}
return await QueryHelper.sendQueryAndBusinessLog(batch);
}
public async Task<QueryBatchBase.QueryResultType> tryUpdateCharacterCreate(QueryExecutorBase queryExecutorBase)
{
var owner = getOwner();
setCompleted();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var reserved_create_character = user_create_or_load_action.getReservedCharacterForCreation();
NullReferenceCheckHelper.throwIfNull(reserved_create_character, () => $"reserved_create_character is null !!! - {owner.toBasicString()}");
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
var character_attribute = reserved_create_character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!! - {owner.toBasicString()}");
(var result, var character_log_info) = await character_attribute.toCharacterLogInfo();
if (result.isFail())
{
var err_msg = $"Failed to toCharacterLogInfo() !!! : {result.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
NullReferenceCheckHelper.throwIfNull(character_log_info, () => $"character_log_info is null !!! - {owner.toBasicString()}");
m_character_log.setInfo(character_log_info);
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new CharacterCreateBusinessLog(log_action, DateTimeHelper.Current, m_character_create_log));
query_batch.appendBusinessLog(new CharacterBusinessLog(log_action, m_character_log));
}
return QueryBatchBase.QueryResultType.Success;
}
}
}

View File

@@ -0,0 +1,755 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Amazon.S3.Model;
using ServerCore; using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using SESSION_ID = System.Int32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
namespace GameServer
{
public class DefaultUserCreator : EntityCreatorBase
{
private ServerCommon.BusinessLogDomain.UserCreateLogInfo m_user_create_log = new();
private ServerCommon.BusinessLogDomain.UserLogInfo m_user_log = new();
public DefaultUserCreator(Player owner)
: base(owner)
{
}
public override async Task<Result> onPrepareCreate()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var account_attribute = owner.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}");
var account_id = account_attribute.AccountId;
var to_add_write_docs = new List<DynamoDbDocBase>();
// 1. AccountBaseDoc를 write 목록에 등록 한다.
account_attribute.modifiedEntityAttribute();
(result, var account_base_doc) = await account_attribute.toDocBase();
if (result.isFail())
{
return result;
}
var modify_account_base_doc = account_base_doc as AccountBaseDoc;
NullReferenceCheckHelper.throwIfNull(modify_account_base_doc, () => $"modify_account_base_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(modify_account_base_doc);
// 2. UserBaseDoc 정보를 구성 한다.
(result, var new_user_base_doc) = await MetaHelper.fillupUserBaseDocBy(owner, modify_account_base_doc);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(new_user_base_doc, () => $"new_user_base_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(new_user_base_doc);
// 3. UserGuid를 각각의 관계된 위치에 설정 한다.
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
if (false == user_attribute.applyUserGuidToRefAttributes(modify_account_base_doc, account_attribute, new_user_base_doc))
{
err_msg = $"Failed to applyUserGuidToRefAttributes() !!! : newUserGuid:{user_attribute.UserGuid} - {owner.toBasicString()}";
result.setFail(ServerErrorCode.UserGuidApplyToRefAttributeAllFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
// 4. 기본 지급 정보들을 구성을 한다.
(result, var found_user_create_data) = await MetaHelper.getUserCreateDataByAccountId(ServerCommon.Constant.USER_CREATE_META_DEFAULT_ID, account_id);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(found_user_create_data, () => $"found_user_create_data is null !!! - {owner.toBasicString()}");
// 5. LevelDoc 구성 한다.
var level_attribute = owner.getEntityAttribute<LevelAttribute>();
NullReferenceCheckHelper.throwIfNull(level_attribute, () => $"level_attribute is null !!! - {owner.toBasicString()}");
level_attribute.newEntityAttribute();
(result, var level_doc) = await level_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(level_doc, () => $"level_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(level_doc);
// 6. MoneyDoc을 구성 한다.
var money_attribute = owner.getEntityAttribute<MoneyAttribute>();
NullReferenceCheckHelper.throwIfNull(money_attribute, () => $"money_attribute is null !!! - {owner.toBasicString()}");
money_attribute.newEntityAttribute();
money_attribute.Gold = found_user_create_data.CurrencyGold;
money_attribute.Sapphire = found_user_create_data.currency_sapphire;
money_attribute.Calium = found_user_create_data.currency_calium;
money_attribute.Ruby = found_user_create_data.currency_ruby;
(result, var money_doc) = await money_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(money_doc, () => $"money_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(money_doc);
// 7. LocationDoc을 구성 한다.
var location_attribute = owner.getEntityAttribute<LocationAttribute>();
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"location_attribute is null !!! - {owner.toBasicString()}");
location_attribute.newEntityAttribute();
(result, var location_doc) = await location_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(location_doc, () => $"location_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(location_doc);
result = addWriteDocBases(to_add_write_docs);
if (result.isFail())
{
return result;
}
// 8. ItemDoc 구성을 한다.
var inventory_action = owner.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}");
var to_add_item_meta_ids = new List<META_ID>();
try
{
to_add_item_meta_ids = found_user_create_data.InventoryItems.toMetaIds();
foreach (var item_meta_id in to_add_item_meta_ids)
{
if (0 >= item_meta_id)
{
continue;
}
(result, var reserved_items) = await inventory_action.tryTakalbleToBag(item_meta_id);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakalbleToBag() by UserCreateData.InventoryItems !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
to_add_item_meta_ids = found_user_create_data.WearingItems.toMetaIds();
foreach (var item_meta_id in to_add_item_meta_ids)
{
if (0 >= item_meta_id)
{
continue;
}
(result, var reserved_items) = await inventory_action.tryTakableToBagWithEquip(item_meta_id);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakableToBagWithEquip() by UserCreateData.WearingItems !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
to_add_item_meta_ids = found_user_create_data.ToolPresets.toMetaIds();
foreach (var item_meta_id in to_add_item_meta_ids)
{
if (0 >= item_meta_id)
{
continue;
}
(result, var reserved_items) = await inventory_action.tryTakableToBagWithEquip(item_meta_id);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakableToBagWithEquip() by UserCreateData.ToolPresets !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
}
catch (Exception e)
{
err_msg = $"Exception !!!, Failed to add Item by UserCreateData !!! : exception{e} - {owner.toBasicString()}";
result.setFail(ServerErrorCode.TryCatchException, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var bag_inven = inventory_action.getBagInven();
var has_items = bag_inven.getHasItemBases();
// 9. 지급된 아이템을 모두 참조 한다.
foreach (var item in has_items)
{
var new_item = item;
var item_attribute = new_item.getEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
(result, var item_doc) = await item_attribute.toDocBase();
if (result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(item_doc, () => $"item_docs is null !!! - {owner.toBasicString()}");
pushWriteDocBase(item_doc);
}
// 10. 소셜 액션
var social_action_agent_action = owner.getEntityAction<SocialActionLoadAction>();
NullReferenceCheckHelper.throwIfNull(social_action_agent_action, () => $"social_action_agent_action is null !!! - {owner.toBasicString()}");
foreach (var social_action_meta_data in MetaData.Instance._SocialActionTable.Values)
{
if (!social_action_meta_data.IsDefault)
continue;
result = await social_action_agent_action.tryAddSocialActionFromMetaId(social_action_meta_data.SocialActionId);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryAddSocialActionFromMetaId() !!! : socialActionMetaId:{social_action_meta_data.SocialActionId} - {owner.toBasicString()}");
continue;
}
if (!social_action_agent_action.tryGetSocialAction(social_action_meta_data.SocialActionId, out var social_action))
{
Log.getLogger().error($"Failed to tryGetSocialAction() !!! : socialActionMetaId:{social_action_meta_data.SocialActionId} - {owner.toBasicString()}");
continue;
}
if (social_action_meta_data.SlotNum != 0)
{
var social_action_action = social_action.getEntityAction<SocialActionAction>();
NullReferenceCheckHelper.throwIfNull(social_action_action, () => $"social_action_action is null !!! - {owner.toBasicString()}");
result = social_action_action.tryEquipSocialAction((UInt16)social_action_meta_data.SlotNum);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryEquipSocialAction() !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
var social_action_attribute = social_action.getEntityAttribute<UserSocialActionAttribute>();
NullReferenceCheckHelper.throwIfNull(social_action_attribute, () => $"social_action_attribute is null !!! - {owner.toBasicString()}");
(result, var social_action_doc) = await social_action_attribute.toDocBase();
if (result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(social_action_doc, () => $"social_action_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(social_action_doc);
}
// 11. 마이홈
var myhome_agent_action = owner.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {owner.toBasicString()}");
(result, var myhome) = await myhome_agent_action.tryMakeDefaultMyhome();
if (result.isFail())
{
err_msg = $"Failed to tryAddMyhomeFromUgc() !!! : {result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(myhome, () => $"myhome is null !!! - {owner.toBasicString()}");
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!! - {owner.toBasicString()}");
(result, var myhome_doc) = await myhome_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(myhome_doc, () => $"myhome_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(myhome_doc);
var myhome_inventory_action = myhome.getEntityAction<MyhomeInventoryAction>();
NullReferenceCheckHelper.throwIfNull(myhome_inventory_action, () => $"myhome_inventory_action is null !!! - {owner.toBasicString()}");
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 !!! - {owner.toBasicString()}");
(result, var item_doc) = await item_attribute.toDocBase();
if (result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(item_doc, () => $"item_docs is null !!! - {owner.toBasicString()}");
pushWriteDocBase(item_doc);
}
// 12. 카트
var cart_action = owner.getEntityAction<CartAction>();
NullReferenceCheckHelper.throwIfNull(cart_action, () => $"cart_action is null !!! - {owner.toBasicString()}");
var cart = cart_action.getCart();
NullReferenceCheckHelper.throwIfNull(cart, () => $"cart is null !!! - {owner.toBasicString()}");
var cart_attribute = cart.getEntityAttribute<CartAttribute>();
NullReferenceCheckHelper.throwIfNull(cart_attribute, () => $"cart_attribute is null !!! - {owner.toBasicString()}");
cart_attribute.newEntityAttribute();
(result, var cart_doc) = await cart_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(cart_doc, () => $"cart_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(cart_doc);
// 13. friendFolder
//이건 CustomDefineUI 로 사용변경 예정, 추후 삭제 예정
var friend_folder_attribute = owner.getEntityAttribute<FriendFolderAttribute>();
NullReferenceCheckHelper.throwIfNull(friend_folder_attribute, () => $"friend_folder_attribute is null !!! - {owner.toBasicString()}");
friend_folder_attribute.fillNewData();
friend_folder_attribute.newEntityAttribute();
(result, var friend_folder_doc) = await friend_folder_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(friend_folder_doc, () => $"friend_folder_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(friend_folder_doc);
// 14. 퀘스트 메일
var quest_mail_action = owner.getEntityAction<QuestMailAction>();
NullReferenceCheckHelper.throwIfNull(quest_mail_action, () => $"quest_mail_action is null !!! - {owner.toBasicString()}");
(var mail_quest_ids, var force_accept_quest_ids) = await quest_mail_action.makeQuestMailDocByType(EAssignRequireType.PlayerInitial);
var quest_mails = quest_mail_action.makeNewSystemQuestMail(mail_quest_ids);
foreach (var quest_mail in quest_mails)
{
var attribute = quest_mail.getEntityAttribute<QuestMailAttribute>();
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!! - {owner.toBasicString()}");
attribute.newEntityAttribute();
(result, var quest_mail_doc) = await attribute.toDocBase();
if (quest_mail_doc is null) continue;
pushWriteDocBase(quest_mail_doc);
}
var quest_action = owner.getEntityAction<QuestAction>();
var new_quests = await quest_action.makeNewQuestByCreateUser(force_accept_quest_ids);
foreach (var new_quest in new_quests)
{
var attribute = new_quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(attribute, () => $"attribute is null !!! - {owner.toBasicString()}");
attribute.newEntityAttribute();
(result, var quest_doc) = await attribute.toDocBase();
if (quest_doc is null) continue;
pushWriteDocBase(quest_doc);
}
// 15. RepeatQuest
var repeat_quest_attribute = owner.getEntityAttribute<RepeatQuestAttribute>();
NullReferenceCheckHelper.throwIfNull(repeat_quest_attribute, () => $"repeat_quest_attribute is null !!! - {owner.toBasicString()}");
repeat_quest_attribute.newEntityAttribute();
(result, var repeat_quest_doc) = await repeat_quest_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(repeat_quest_doc, () => $"repeat_quest_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(repeat_quest_doc);
// 16. CraftHelp
var craft_help_attribute = owner.getEntityAttribute<CraftHelpAttribute>();
NullReferenceCheckHelper.throwIfNull(craft_help_attribute, () => $"craft_help_attribute is null !!! - {owner.toBasicString()}");
craft_help_attribute.newEntityAttribute();
(result, var craft_help_doc) = await craft_help_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(craft_help_doc, () => $"craft_help_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(craft_help_doc);
// 17. UserContentsSetting
var user_contents_setting_attribute = owner.getEntityAttribute<UserContentsSettingAttribute>();
NullReferenceCheckHelper.throwIfNull(user_contents_setting_attribute, () => $"user_contents_setting_attribute is null !!! - {owner.toBasicString()}");
user_contents_setting_attribute.MyhomeSlotOpenCount = MetaHelper.GameConfigMeta.MyHomeDefaultSaveSlot;
user_contents_setting_attribute.newEntityAttribute();
(result, var user_contents_setting_doc) = await user_contents_setting_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(user_contents_setting_doc, () => $"user_contents_setting_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(user_contents_setting_doc);
// 18. characterProfile
var character_profile_attribute = owner.getEntityAttribute<CharacterProfileAttribute>();
NullReferenceCheckHelper.throwIfNull(character_profile_attribute, () => $"character_profile_attribute is null !!! - {owner.toBasicString()}");
character_profile_attribute.newEntityAttribute();
(result, var character_profile_doc) = await character_profile_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(character_profile_doc, () => $"character_profile_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(character_profile_doc);
// 19. PackageLastOrderRecode
var package_last_order_recode_attribute = owner.getEntityAttribute<PackageLastOrderRecodeAttribute>();
NullReferenceCheckHelper.throwIfNull(package_last_order_recode_attribute, () => $"package_last_order_recode_attribute is null !!! - {owner.toBasicString()}");
package_last_order_recode_attribute.newEntityAttribute();
(result, var package_last_order_recode_doc) = await package_last_order_recode_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(package_last_order_recode_doc, () => $"package_last_order_recode_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(package_last_order_recode_doc);
// 20. UgqDailyRewardCount
var ugq_daily_reward_count_attribute = owner.getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_count_attribute, () => $"ugq_daily_reward_count_attribute is null !!! - {owner.toBasicString()}");
ugq_daily_reward_count_attribute.modifiedEntityAttribute(true);
(result, var ugq_daily_reward_count_doc) = await ugq_daily_reward_count_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_count_doc, () => $"ugq_daily_reward_count_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(ugq_daily_reward_count_doc);
// 21. DailyQuestCheck
// 22. SeasonPass
var server_logic = GameServerApp.getServerLogic();
var seasonPassManager = server_logic.getSeasonPassManager();
var season_pass_attribute = owner.getEntityAttribute<SeasonPassAttribute>();
NullReferenceCheckHelper.throwIfNull(season_pass_attribute, () => $"season_pass_attribute is null !!! - {owner.toBasicString()}");
season_pass_attribute.newEntityAttribute();
season_pass_attribute.SeasonPassMetaId = seasonPassManager.currentSeasonPass;
season_pass_attribute.IsChargedPass = false;
season_pass_attribute.Exp = 0;
season_pass_attribute.Grade = 1;
season_pass_attribute.takenRewards.Clear();
(result, var season_pass_doc) = await season_pass_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(season_pass_doc, () => $"season_pass_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(season_pass_doc);
setCompetedPrepareCreate(true);
// UserCreate 로그 설정
m_user_create_log.UserGuid = user_attribute.UserGuid;
m_user_create_log.UserPK = new_user_base_doc.getPK();
m_user_create_log.UserSK = new_user_base_doc.getSK();
m_user_create_log.AccountCreationType = account_attribute.AccountCreationType;
m_user_create_log.UserCreationMetaType = found_user_create_data.getTypeName();
m_user_create_log.UserCreateMetaId = (META_ID)found_user_create_data.MetaId;
Log.getLogger().info($"Step Prepare Create Default User Success : onPrepareCreate() - {owner.toBasicString()}");
return result;
}
public override async Task<Result> onTriggerEffect()
{
var owner = getOwner();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
if (false == isCompletedPrepareCreate())
{
err_msg = $"Not completed isCompletedPrepareCreate() !!! - {toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.DefaultUserPrepareCreateNotCompleted, err_msg);
return result;
}
if (true == isCompleted())
{
err_msg = $"Default User completed creation !!! - {toBasicString()}, {owner.toBasicString()}";
Log.getLogger().info(err_msg);
return result;
}
// 유저 닉네임 생성을 위한 정보를 등록 한다.
result = await createAndPushUserNicknameDocQuery(owner);
if(result.isFail())
{
return result;
}
// 기본 마이홈 Ugc Info를 S3에 업로드 한다
result = await tryUploadDefaultMyhomeUgcInfoToS3(owner);
if (result.isFail())
{
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserCreate
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQEntityWrite(getToWriteDocBases()));
batch.addQuery(new QueryFinal(), completedDefaultUserCreate);
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
// S3에 업로드한 Ugc Info를 제거한다.
await tryDeleteDefaultMyhomeUgcInfoFromS3(owner);
return result;
}
return result;
}
private async Task<Result> createAndPushUserNicknameDocQuery(Player owner)
{
var result = new Result();
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var nickname_attribute = owner.getEntityAttribute<NicknameAttribute>();
NullReferenceCheckHelper.throwIfNull(nickname_attribute, () => $"nickname_attribute is null !!! - {owner.toBasicString()}");
var user_guid = user_attribute.UserGuid;
var account_id = user_attribute.AccountId;
var nickname = nickname_attribute.Nickname;
nickname_attribute.newEntityAttribute();
deleteWriteDoc<UserNicknameRegistryDoc>();
var user_nickname_registry_doc = new UserNicknameRegistryDoc(nickname);
result = await user_nickname_registry_doc.newDoc4Query();
if (result.isFail())
{
return result;
}
var doc_user_nickname_attrib = user_nickname_registry_doc.getAttrib<UserNicknameRegistryAttrib>();
NullReferenceCheckHelper.throwIfNull(doc_user_nickname_attrib, () => $"doc_user_nickname_attrib is null !!! - {owner.toBasicString()}");
doc_user_nickname_attrib.Nickname = nickname;
doc_user_nickname_attrib.UserGuid = user_guid;
doc_user_nickname_attrib.AccountId = account_id;
pushWriteDocBase(user_nickname_registry_doc);
deleteWriteDoc<NicknameDoc>();
(result, var nickname_base_doc) = await nickname_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(nickname_base_doc, () => $"nickname_base_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(nickname_base_doc);
m_user_create_log.UserNickname = nickname;
return result;
}
async Task<Result> tryUploadDefaultMyhomeUgcInfoToS3(Player player)
{
var result = new Result();
var err_msg = string.Empty;
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!!");
if (!myhome_agent_action.tryGetSelectedMyhome(out var myhome))
{
err_msg = $"Failed to tryGetSelectedMyHome() !!! : {this.getTypeName()}";
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var myhome_action = myhome.getEntityAction<MyhomeAction>();
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!!");
result = await myhome_action.tryUploadMyhomeUgcInfoToS3();
if (result.isFail())
{
err_msg = $"Failed to tryUploadMyhomeUgcInfoToS3() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
async Task<Result> tryDeleteDefaultMyhomeUgcInfoFromS3(Player player)
{
var result = new Result();
var err_msg = string.Empty;
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!!");
if (!myhome_agent_action.tryGetSelectedMyhome(out var myhome))
{
err_msg = $"Failed to tryGetSelectedMyHome() !!! : {this.getTypeName()}";
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var myhome_action = myhome.getEntityAction<MyhomeAction>();
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!!");
result = await myhome_action.tryDeleteMyhomeUgcInfoFolderFileFromS3();
if (result.isFail())
{
err_msg = $"Failed to tryDeleteMyhomeUgcInfoFolderFileFromS3() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<QueryBatchBase.QueryResultType> completedDefaultUserCreate(QueryExecutorBase queryExecutorBase)
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
setCompleted();
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
m_user_log.setInfo(owner.toUserLogInfo());
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new UserCreateBusinessLog(log_action, DateTimeHelper.Current, m_user_create_log));
query_batch.appendBusinessLog(new UserBusinessLog(log_action, m_user_log ));
var created_item_docs = getToWriteDocBases<ItemDoc>();
foreach(var item_doc in created_item_docs)
{
(result, var item_log_info) = await item_doc.toItemLogInfo4Create();
if(result.isFail())
{
err_msg = $"Failed to toItemLogInfo4Create() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
continue;
}
NullReferenceCheckHelper.throwIfNull(item_log_info, () => $"item_log_info is null !!! - {owner.toBasicString()}");
query_batch.appendBusinessLog(new ItemBusinessLog(item_log_info));
}
return QueryBatchBase.QueryResultType.Success;
}
}
}

View File

@@ -0,0 +1,208 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
namespace GameServer
{
public class TestCharacterCreator : EntityCreatorBase
{
private ServerCommon.BusinessLogDomain.CharacterCreateLogInfo m_character_create_log = new();
private ServerCommon.BusinessLogDomain.CharacterLogInfo m_character_log = new();
public TestCharacterCreator(Player owner)
: base(owner)
{
}
public override async Task<Result> onPrepareCreate()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var user_attribute = getOwner().getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var character = new Character(owner);
result = await character.onInit();
if(result.isFail())
{
return result;
}
var character_attribute = character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!- {owner.toBasicString()}");
var to_add_write_docs = new List<DynamoDbDocBase>();
// 1. CharacterBaseDoc 정보를 구성 한다.
(result, CharacterBaseDoc? new_character_base_doc) = await MetaHelper.fillupCharacterBaseDocByTestUserCreateData(user_attribute, character_attribute);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(new_character_base_doc, () => $"new_character_base_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(new_character_base_doc);
foreach (var to_write_doc in to_add_write_docs)
{
result = addWriteDocBase(to_write_doc);
if (result.isFail())
{
return result;
}
}
user_create_or_load_action.setReservedCharacterForCreation(character);
// 2. UserBaseDoc 정보를 갱신 한다. SelectedCharacterGuid 설정 !!!
user_attribute.SelectedCharacterGuid = character_attribute.CharacterGuid;
user_attribute.modifiedEntityAttribute();
var user_base_doc = user_attribute.onCreateDocBase() as UserBaseDoc;
NullReferenceCheckHelper.throwIfNull(user_base_doc, () => $"user_base_doc is null !!! - {owner.toBasicString()}");
result = await user_attribute.fillupDoc4QueryWithAttribute(user_base_doc);
if (result.isFail())
{
return result;
}
result = addWriteDocBase(user_base_doc);
if (result.isFail())
{
return result;
}
(result, TestUserCreateMetaData? found_test_user_create_data) = await MetaHelper.getTestUserCreateDataByAccountId(user_attribute.AccountId);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(found_test_user_create_data, () => $"found_test_user_create_data is null !!! - {owner.toBasicString()}");
setCompetedPrepareCreate(true);
// CharacterCreate 로그 설정
m_character_create_log.CharacterGuid = character_attribute.CharacterGuid;
m_character_create_log.CharacterPK = new_character_base_doc.getPK();
m_character_create_log.CharacterSK = new_character_base_doc.getSK();
m_character_create_log.CharacterCreateMetaType = found_test_user_create_data.getTypeName();
m_character_create_log.CharacterCreateMetaId = (META_ID)found_test_user_create_data.MetaId;
// 3. 유저 닉네임이 생성된 경우는 즉시 캐릭터 정보를 생성 한다.
if (user_create_or_load_action.isCreatedUserNickname())
{
await onTriggerEffect();
}
Log.getLogger().info($"Step Prepare Create Test Character Success : onPrepareCreate() - {owner.toBasicString()}");
return result;
}
public override async Task<Result> onTriggerEffect()
{
var owner = getOwner();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var server_logic = GameServerApp.getServerLogic();
var result = new Result();
var err_msg = string.Empty;
if (false == isCompletedPrepareCreate())
{
err_msg = $"Not completed isCompletedPrepareCreate() !!! - {toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.TestCharacterPrepareCreateNotCompleted , err_msg);
return result;
}
if (true == isCompleted())
{
err_msg = $"Test Character completed creation !!! - {toBasicString()}, {getOwner().toBasicString()}";
Log.getLogger().info(err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.CharacterCreate
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQEntityWrite( getToWriteDocBases() ));
batch.addQuery(new QueryFinal(), tryUpdateTestCharacterCreate);
}
return await QueryHelper.sendQueryAndBusinessLog(batch);
}
public async Task<QueryBatchBase.QueryResultType> tryUpdateTestCharacterCreate(QueryExecutorBase contextBase)
{
await Task.CompletedTask;
var owner = getOwner();
setCompleted();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var reserved_create_character = user_create_or_load_action.getReservedCharacterForCreation();
NullReferenceCheckHelper.throwIfNull(reserved_create_character, () => $"reserved_create_character is null !!! - {owner.toBasicString()}");
var query_batch = contextBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
var character_attribute = reserved_create_character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!! - {owner.toBasicString()}");
(var result, var character_log_info) = await character_attribute.toCharacterLogInfo();
if(result.isFail())
{
var err_msg = $"Failed to toCharacterLogInfo() !!! : {result.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
NullReferenceCheckHelper.throwIfNull(character_log_info, () => $"character_log_info is null !!! - {owner.toBasicString()}");
m_character_log.setInfo(character_log_info);
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new CharacterCreateBusinessLog(log_action, DateTimeHelper.Current, m_character_create_log));
query_batch.appendBusinessLog(new CharacterBusinessLog(log_action, m_character_log));
}
return QueryBatchBase.QueryResultType.Success;
}
}
}

View File

@@ -0,0 +1,838 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
namespace GameServer
{
public class TestUserCreator : EntityCreatorBase
{
private bool m_is_pass_register_user_nickname_registeration = false;
private ServerCommon.BusinessLogDomain.UserCreateLogInfo m_user_create_log = new();
private ServerCommon.BusinessLogDomain.UserLogInfo m_user_log = new();
public TestUserCreator(Player owner)
: base(owner)
{
}
public override async Task<Result> onPrepareCreate()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var server_logic = GameServerApp.getServerLogic();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var account_attribute = owner.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}");
var account_id = account_attribute.AccountId;
var to_add_write_docs = new List<DynamoDbDocBase>();
//=====================================================================================
// 1. AccountBaseDoc 갱신 한다.
//=====================================================================================
account_attribute.modifiedEntityAttribute();
(result, var account_base_doc) = await account_attribute.toDocBase();
if (result.isFail())
{
return result;
}
var modify_account_base_doc = account_base_doc as AccountBaseDoc;
NullReferenceCheckHelper.throwIfNull(modify_account_base_doc, () => $"modify_account_base_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(modify_account_base_doc);
//=====================================================================================
// 2. UserBaseDoc 생성 한다.
//=====================================================================================
(result, UserBaseDoc? new_user_base_doc) = await MetaHelper.fillupUserBaseDocBy(owner, modify_account_base_doc);
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(new_user_base_doc, () => $"new_user_base_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(new_user_base_doc);
//=====================================================================================
// 3. AccountBaseDoc & UserBaseDoc 갱신 한다.
//=====================================================================================
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
if (false == user_attribute.applyUserGuidToRefAttributes(modify_account_base_doc, account_attribute, new_user_base_doc))
{
err_msg = $"Failed to applyUserGuidToRefAttributes() !!! : newUserGuid:{user_attribute.UserGuid} - {owner.toBasicString()}";
result.setFail(ServerErrorCode.UserGuidApplyToRefAttributeAllFailed, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
(result, TestUserCreateMetaData? found_test_user_create_data) = await MetaHelper.getTestUserCreateDataByAccountId(account_id);
if (result.isFail())
{
return result;
}
ArgumentNullException.ThrowIfNull(found_test_user_create_data, $"found_test_user_create_data is null !!! - {owner.toBasicString()}");
//=====================================================================================
// 4. LevelDoc 생성 한다.
//=====================================================================================
var level_attribute = owner.getEntityAttribute<LevelAttribute>();
NullReferenceCheckHelper.throwIfNull(level_attribute, () => $"level_attribute is null !!! - {owner.toBasicString()}");
level_attribute.newEntityAttribute();
(result, var level_doc) = await level_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(level_doc, () => $"level_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(level_doc);
//=====================================================================================
// 5. MoneyDoc 생성 한다.
//=====================================================================================
var money_attribute = owner.getEntityAttribute<MoneyAttribute>();
NullReferenceCheckHelper.throwIfNull(money_attribute, () => $"money_attribute is null !!! - {owner.toBasicString()}");
money_attribute.newEntityAttribute();
(result, var money_doc) = await money_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(money_doc, () => $"money_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(money_doc);
//=====================================================================================
// 6. LocationDoc 생성 한다.
//=====================================================================================
var location_attribute = owner.getEntityAttribute<LocationAttribute>();
NullReferenceCheckHelper.throwIfNull(location_attribute, () => $"location_attribute is null !!! - {owner.toBasicString()}");
location_attribute.newEntityAttribute();
(result, var location_doc) = await location_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(location_doc, () => $"location_doc is null !!! - {owner.toBasicString()}");
to_add_write_docs.Add(location_doc);
//=====================================================================================
// 7. 1~6 까지 등록된 Write Doc 목록을 모두 등록 한다.
//=====================================================================================
result = addWriteDocBases(to_add_write_docs);
if (result.isFail())
{
return result;
}
//=====================================================================================
// 8. ItemDoc 목록을 생성 한다.
//=====================================================================================
(result, var created_item_docs) = await createItemDocsByTestUserCreateData(owner, found_test_user_create_data);
if(result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(created_item_docs, () => $"created_item_docs is null !!! - {owner.toBasicString()}");
pushWriteDocBases(created_item_docs);
//=====================================================================================
// 8. SocialActionDoc 목록을 생성 한다.
//=====================================================================================
var social_action_agent_action = owner.getEntityAction<SocialActionLoadAction>();
NullReferenceCheckHelper.throwIfNull(social_action_agent_action, () => $"social_action_agent_action is null !!! - {owner.toBasicString()}");
foreach (var social_action_meta_data in MetaData.Instance._SocialActionTable.Values)
{
if (!social_action_meta_data.IsDefault)
continue;
result = await social_action_agent_action.tryAddSocialActionFromMetaId(social_action_meta_data.SocialActionId);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryAddSocialActionFromMetaId() !!! : socialActionMetaId:{social_action_meta_data.SocialActionId} - {owner.toBasicString()}");
continue;
}
if (!social_action_agent_action.tryGetSocialAction(social_action_meta_data.SocialActionId, out var social_action))
{
Log.getLogger().error($"Failed to tryGetSocialAction() !!! : socialActionMetaId:{social_action_meta_data.SocialActionId} - {owner.toBasicString()}");
continue;
}
if (social_action_meta_data.SlotNum != 0)
{
var social_action_action = social_action.getEntityAction<SocialActionAction>();
NullReferenceCheckHelper.throwIfNull(social_action_action, () => $"social_action_action is null !!! - {owner.toBasicString()}");
result = social_action_action.tryEquipSocialAction((UInt16)social_action_meta_data.SlotNum);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryEquipSocialAction() !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
var social_action_attribute = social_action.getEntityAttribute<UserSocialActionAttribute>();
NullReferenceCheckHelper.throwIfNull(social_action_attribute, () => $"social_action_attribute is null !!! - {owner.toBasicString()}");
(result, var social_action_doc) = await social_action_attribute.toDocBase();
if (result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {social_action.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(social_action_doc, () => $"social_action_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(social_action_doc);
}
//=====================================================================================
// 9. MyHome & ItemDoc 목록을 생성 한다.
//=====================================================================================
var myhome_agent_action = owner.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {owner.toBasicString()}");
(result, var myhome) = await myhome_agent_action.tryMakeDefaultMyhome();
if (result.isFail())
{
err_msg = $"Failed to tryAddMyhomeFromUgc() !!! : {result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(myhome, () => $"myhome is null !!! - {owner.toBasicString()}");
var myhome_attribute = myhome.getEntityAttribute<MyhomeAttribute>();
NullReferenceCheckHelper.throwIfNull(myhome_attribute, () => $"myhome_attribute is null !!! - {owner.toBasicString()}");
(result, var myhome_doc) = await myhome_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(myhome_doc, () => $"myhome_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(myhome_doc);
var myhome_inventory_action = myhome.getEntityAction<MyhomeInventoryAction>();
NullReferenceCheckHelper.throwIfNull(myhome_doc, () => $"myhome_doc is null !!! - {owner.toBasicString()}");
var bag_inven = myhome_inventory_action.getBagInven();
NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {owner.toBasicString()}");
var has_items = bag_inven.getHasItemBases();
NullReferenceCheckHelper.throwIfNull(has_items, () => $"has_items is null !!! - {owner.toBasicString()}");
foreach (var item in has_items)
{
var new_item = item;
var item_attribute = new_item.getEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
(result, var item_doc) = await item_attribute.toDocBase();
if (result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by DefaultUserCreator !!! : {new_item.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(item_doc, () => $"item_docs is null !!! - {owner.toBasicString()}");
pushWriteDocBase(item_doc);
}
//=====================================================================================
// 10. CartDoc 생성 한다.
//=====================================================================================
var cart_action = owner.getEntityAction<CartAction>();
NullReferenceCheckHelper.throwIfNull(cart_action, () => $"cart_action is null !!! - {owner.toBasicString()}");
var cart = cart_action.getCart();
NullReferenceCheckHelper.throwIfNull(cart, () => $"cart is null !!! - {owner.toBasicString()}");
var cart_attribute = cart.getEntityAttribute<CartAttribute>();
NullReferenceCheckHelper.throwIfNull(cart_attribute, () => $"cart_attribute is null !!! - {owner.toBasicString()}");
cart_attribute.newEntityAttribute();
(result, var cart_doc) = await cart_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(cart_doc, () => $"cart_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(cart_doc);
//=====================================================================================
// 11. FriendFolder 생성 한다.
//=====================================================================================
//이건 CustomDefineUI 로 사용변경 예정, 추후 삭제 예정
var friend_folder_attribute = owner.getEntityAttribute<FriendFolderAttribute>();
NullReferenceCheckHelper.throwIfNull(friend_folder_attribute, () => $"friend_folder_attribute is null !!! - {owner.toBasicString()}");
friend_folder_attribute.fillNewData();
friend_folder_attribute.newEntityAttribute();
(result, var friend_folder_doc) = await friend_folder_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(friend_folder_doc, () => $"friend_folder_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(friend_folder_doc);
//=====================================================================================
// 12. QuestMailDoc & QuestDoc 목록을 생성 한다.
//=====================================================================================
var quest_mail_action = owner.getEntityAction<QuestMailAction>();
NullReferenceCheckHelper.throwIfNull(quest_mail_action, () => $"quest_mail_action is null !!! - {owner.toBasicString()}");
(var mail_quest_ids, var force_accept_quest_ids) = await quest_mail_action.makeQuestMailDocByType(EAssignRequireType.PlayerInitial);
var quest_mails = quest_mail_action.makeNewSystemQuestMail(mail_quest_ids);
foreach (var quest_mail in quest_mails)
{
var quest_mail_attribute = quest_mail.getEntityAttribute<QuestMailAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_mail_attribute, () => $"quest_mail_attribute is null !!! - {owner.toBasicString()}");
quest_mail_attribute.newEntityAttribute();
(result, var quest_mail_doc) = await quest_mail_attribute.toDocBase();
if (quest_mail_doc is null) continue;
NullReferenceCheckHelper.throwIfNull(quest_mail_doc, () => $"quest_mail_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(quest_mail_doc);
}
var quest_action = owner.getEntityAction<QuestAction>();
NullReferenceCheckHelper.throwIfNull(quest_action, () => $"quest_action is null !!! - {owner.toBasicString()}");
var new_quests = await quest_action.makeNewQuestByCreateUser(force_accept_quest_ids);
foreach (var new_quest in new_quests)
{
var quest_attribute = new_quest.getEntityAttribute<QuestAttribute>();
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {owner.toBasicString()}");
quest_attribute.newEntityAttribute();
(result, var quest_doc) = await quest_attribute.toDocBase();
if (quest_doc is null) continue;
NullReferenceCheckHelper.throwIfNull(quest_doc, () => $"quest_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(quest_doc);
}
//=====================================================================================
// 13. RepeatQuestDoc 목록을 생성 한다.
//=====================================================================================
var repeat_quest_attribute = owner.getEntityAttribute<RepeatQuestAttribute>();
NullReferenceCheckHelper.throwIfNull(repeat_quest_attribute, () => $"repeat_quest_attribute is null !!! - {owner.toBasicString()}");
repeat_quest_attribute.newEntityAttribute();
(result, var repeat_quest_doc) = await repeat_quest_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(repeat_quest_doc, () => $"repeat_quest_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(repeat_quest_doc);
//=====================================================================================
// 14. CraftHelpDoc 목록을 생성 한다.
//=====================================================================================
var craft_help_attribute = owner.getEntityAttribute<CraftHelpAttribute>();
NullReferenceCheckHelper.throwIfNull(craft_help_attribute, () => $"craft_help_attribute is null !!! - {owner.toBasicString()}");
craft_help_attribute.newEntityAttribute();
(result, var craft_help_doc) = await craft_help_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(craft_help_doc, () => $"repeat_quest_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(craft_help_doc);
//=====================================================================================
// 15. UserContentsSettingDoc 목록을 생성 한다.
//=====================================================================================
var user_contents_setting_attribute = owner.getEntityAttribute<UserContentsSettingAttribute>();
NullReferenceCheckHelper.throwIfNull(user_contents_setting_attribute, () => $"user_contents_setting_attribute is null !!! - {owner.toBasicString()}");
user_contents_setting_attribute.MyhomeSlotOpenCount = MetaHelper.GameConfigMeta.MyHomeDefaultSaveSlot;
user_contents_setting_attribute.newEntityAttribute();
(result, var user_contents_setting_doc) = await user_contents_setting_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(user_contents_setting_doc, () => $"user_contents_setting_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(user_contents_setting_doc);
//=====================================================================================
// 16. CharacterProfileDoc 목록을 생성 한다.
//=====================================================================================
var character_profile_attribute = owner.getEntityAttribute<CharacterProfileAttribute>();
NullReferenceCheckHelper.throwIfNull(character_profile_attribute, () => $"character_profile_attribute is null !!! - {owner.toBasicString()}");
character_profile_attribute.newEntityAttribute();
(result, var character_profile_doc) = await character_profile_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(character_profile_doc, () => $"character_profile_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(character_profile_doc);
//=====================================================================================
// 17. PackageLastOrderRecodeDoc 목록을 생성 한다.
//=====================================================================================
var package_last_order_recode_attribute = owner.getEntityAttribute<PackageLastOrderRecodeAttribute>();
NullReferenceCheckHelper.throwIfNull(package_last_order_recode_attribute, () => $"package_last_order_recode_attribute is null !!! - {owner.toBasicString()}");
package_last_order_recode_attribute.newEntityAttribute();
(result, var package_last_order_recode_doc) = await package_last_order_recode_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(package_last_order_recode_doc, () => $"package_last_order_recode_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(package_last_order_recode_doc);
//=====================================================================================
// 18. UgqDailyRewardCountDoc 목록을 생성 한다.
//=====================================================================================
var ugq_daily_reward_count_attribute = owner.getEntityAttribute<UgqDailyRewardCountAttribute>();
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_count_attribute, () => $"repeat_quest_attribute is null !!! - {owner.toBasicString()}");
ugq_daily_reward_count_attribute.modifiedEntityAttribute(true);
(result, var ugq_daily_reward_count_doc) = await ugq_daily_reward_count_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(ugq_daily_reward_count_doc, () => $"ugq_daily_reward_count_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(ugq_daily_reward_count_doc);
// // 21. DailyQuestCheck
//=====================================================================================
// 20. SeasonPassDoc 목록을 생성 한다.
//=====================================================================================
var seasonPassManager = server_logic.getSeasonPassManager();
var season_pass_attribute = getOwner().getEntityAttribute<SeasonPassAttribute>();
NullReferenceCheckHelper.throwIfNull(season_pass_attribute, () => $"season_pass_attribute is null !!! - {owner.toBasicString()}");
season_pass_attribute.newEntityAttribute();
season_pass_attribute.SeasonPassMetaId = seasonPassManager.currentSeasonPass;
season_pass_attribute.IsChargedPass = false;
season_pass_attribute.Exp = 0;
season_pass_attribute.Grade = 1;
season_pass_attribute.takenRewards.Clear();
(result, var season_pass_doc) = await season_pass_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(season_pass_doc, () => $"season_pass_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(season_pass_doc);
setCompetedPrepareCreate(true);
//=====================================================================================
// 21. UserCreate 로그 설정 한다.
//=====================================================================================
m_user_create_log.UserGuid = user_attribute.UserGuid;
m_user_create_log.UserPK = new_user_base_doc.getPK();
m_user_create_log.UserSK = new_user_base_doc.getSK();
m_user_create_log.AccountCreationType = account_attribute.AccountCreationType;
m_user_create_log.UserCreationMetaType = found_test_user_create_data.getTypeName();
m_user_create_log.UserCreateMetaId = (META_ID)found_test_user_create_data.MetaId;
Log.getLogger().info($"Step Prepare Create Test User Success : onPrepareCreate() - {owner.toBasicString()}");
return result;
}
public static async Task<(Result, List<DynamoDbDocBase>?)> createItemDocsByTestUserCreateData(Player owner, MetaAssets.TestUserCreateMetaData testUserCreateData)
{
ArgumentNullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var result = new Result();
var err_msg = string.Empty;
var make_item_docs = new List<DynamoDbDocBase>();
//=====================================================================================
// 1. 아이템을 구성 한다.
//=====================================================================================
var inventory_action = owner.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}");
var to_add_item_meta_ids = new List<META_ID>();
try
{
foreach (var item_meta_id in testUserCreateData.InventoryItems)
{
(result, var reserved_items) = await inventory_action.tryTakalbleToBag((uint)item_meta_id);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakalbleToBag() by TestUserCreateData.InventoryItems !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
foreach (var item_meta_id in testUserCreateData.WearingItems)
{
(result, var reserved_items) = await inventory_action.tryTakableToBagWithEquip((uint)item_meta_id);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakableToBagWithEquip() by TestUserCreateData.WearingItems !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
foreach (var (item_meta_id, index) in testUserCreateData.ToolPresets.Select((item_meta_id, index) => (item_meta_id, index)))
{
if (0 == item_meta_id)
{
continue;
}
(result, var reserved_items) = await inventory_action.tryTakableToBagWithEquip((uint)item_meta_id, 1, (Int16)index);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakableToBagWithEquip() by TestUserCreateData.ToolPresets !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
foreach (var (item_meta_id, index) in testUserCreateData.TattooItems.Select((item_meta_id, index) => (item_meta_id, index)))
{
if (0 == item_meta_id)
{
continue;
}
(result, var reserved_items) = await inventory_action.tryTakableToBagWithEquip((uint)item_meta_id, 1, (Int16)index);
if (result.isFail())
{
Log.getLogger().error($"Failed to tryTakableToBagWithEquip() by TestUserCreateData.TattooItems !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
}
}
catch (Exception e)
{
err_msg = $"Exception !!!, Failed to add Item by TestUserCreateData !!! : exception:{e} - {owner.toBasicString()}";
result.setFail(ServerErrorCode.TryCatchException, err_msg);
Log.getLogger().error(result.toBasicString());
return (result, null);
}
var to_create_items = new Dictionary<ITEM_GUID, Item>();
//=====================================================================================
// 2. 지급된 아이템을 모두 참조 한다.
//=====================================================================================
var bag_inven = inventory_action.getBagInven();
NullReferenceCheckHelper.throwIfNull(bag_inven, () => $"bag_inven is null !!! - {owner.toBasicString()}");
var has_items = bag_inven.getHasItemBases();
foreach (var item in has_items)
{
var new_item = item as Item;
NullReferenceCheckHelper.throwIfNull(new_item, () => $"new_item is null !!! - {owner.toBasicString()}");
var item_attribute = new_item.getEntityAttribute<ItemAttributeBase>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
(result, var item_doc) = await item_attribute.toDocBase();
if(result.isFail())
{
Log.getLogger().error($"Failed to toDocBase() by TestUserCreator !!! : {result.toBasicString()} - {owner.toBasicString()}");
continue;
}
NullReferenceCheckHelper.throwIfNull(item_doc, () => $"item_doc is null !!! - {owner.toBasicString()}");
var item_attrib = item_doc.getAttrib<ItemAttrib>();
NullReferenceCheckHelper.throwIfNull(item_attrib, () => $"item_attrib is null !!! - {owner.toBasicString()}");
if(false == to_create_items.TryAdd(item_attrib.ItemGuid, new_item))
{
Log.getLogger().error($"Failed to TryAdd() Item !!!, duplicated ItemGuid : {new_item.toBasicString()} - {owner.toBasicString()}");
continue;
}
make_item_docs.Add(item_doc);
}
return (result, make_item_docs);
}
public override async Task<Result> onTriggerEffect()
{
var result = new Result();
var err_msg = string.Empty;
var owner = getOwner();
var server_logic = GameServerApp.getServerLogic();
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
if(false == isCompletedPrepareCreate())
{
err_msg = $"Not completed isCompletedPrepareCreate() !!! - {toBasicString()}, {getOwner().toBasicString()}";
result.setFail(ServerErrorCode.TestUserPrepareCreateNotCompleted , err_msg);
return result;
}
if (true == isCompleted())
{
err_msg = $"Test User completed creation !!! - {toBasicString()}, {getOwner().toBasicString()}";
result.setFail(ServerErrorCode.UserCreateCompleted, err_msg);
return result;
}
// 유저 닉네임 생성을 위한 정보를 등록 한다.
result = await createAndPushUserNicknameDocQuery(owner);
if(result.isFail())
{
return result;
}
// 기본 마이홈 Ugc Info를 S3에 업로드 한다
result = await tryUploadDefaultMyhomeUgcInfoToS3(owner);
if (result.isFail())
{
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserCreate
, server_logic.getDynamoDbClient()
, true );
{
batch.addQuery(new DBQEntityWrite( getToWriteDocBases() ));
batch.addQuery(new QueryFinal(), completedTestUserCreate);
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
// S3에 업로드한 Ugc Info를 제거한다.
await tryDeleteDefaultMyhomeUgcInfoFromS3(owner);
return result;
}
return result;
}
private async Task<Result> createAndPushUserNicknameDocQuery(Player owner)
{
ArgumentNullException.ThrowIfNull(owner, $"owner is null !!!");
var result = new Result();
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var nickname_attribute = owner.getEntityAttribute<NicknameAttribute>();
NullReferenceCheckHelper.throwIfNull(nickname_attribute, () => $"nickname_attribute is null !!! - {owner.toBasicString()}");
var user_guid = user_attribute.UserGuid;
var account_id = user_attribute.AccountId;
var nickname = nickname_attribute.Nickname;
nickname_attribute.newEntityAttribute();
if (false == m_is_pass_register_user_nickname_registeration)
{
deleteWriteDoc<UserNicknameRegistryDoc>();
var user_nickname_registry_doc = new UserNicknameRegistryDoc(nickname);
result = await user_nickname_registry_doc.newDoc4Query();
if (result.isFail())
{
return result;
}
var doc_user_nickname_attrib = user_nickname_registry_doc.getAttrib<UserNicknameRegistryAttrib>();
NullReferenceCheckHelper.throwIfNull(doc_user_nickname_attrib, () => $"doc_user_nickname_attrib is null !!! - {owner.toBasicString()}");
doc_user_nickname_attrib.Nickname = nickname;
doc_user_nickname_attrib.UserGuid = user_guid;
doc_user_nickname_attrib.AccountId = account_id;
pushWriteDocBase(user_nickname_registry_doc);
}
deleteWriteDoc<NicknameDoc>();
(result, var nickname_base_doc) = await nickname_attribute.toDocBase();
if (result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(nickname_base_doc, () => $"nickname_base_doc is null !!! - {owner.toBasicString()}");
pushWriteDocBase(nickname_base_doc);
m_user_create_log.UserNickname = nickname;
return result;
}
async Task<Result> tryUploadDefaultMyhomeUgcInfoToS3(Player player)
{
var result = new Result();
var err_msg = string.Empty;
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {player.toBasicString()}");
if (!myhome_agent_action.tryGetSelectedMyhome(out var myhome))
{
err_msg = $"Failed to tryGetSelectedMyHome() !!! : {this.getTypeName()}";
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var myhome_action = myhome.getEntityAction<MyhomeAction>();
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!! - {player.toBasicString()}");
result = await myhome_action.tryUploadMyhomeUgcInfoToS3();
if (result.isFail())
{
err_msg = $"Failed to tryUploadMyhomeUgcInfoToS3() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
async Task<Result> tryDeleteDefaultMyhomeUgcInfoFromS3(Player player)
{
var result = new Result();
var err_msg = string.Empty;
var myhome_agent_action = player.getEntityAction<MyhomeAgentAction>();
NullReferenceCheckHelper.throwIfNull(myhome_agent_action, () => $"myhome_agent_action is null !!! - {player.toBasicString()}");
if (!myhome_agent_action.tryGetSelectedMyhome(out var myhome))
{
err_msg = $"Failed to tryGetSelectedMyHome() !!! : {this.getTypeName()}";
result.setFail(ServerErrorCode.MyHomeNotFound, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
var myhome_action = myhome.getEntityAction<MyhomeAction>();
NullReferenceCheckHelper.throwIfNull(myhome_action, () => $"myhome_action is null !!! - {player.toBasicString()}");
result = await myhome_action.tryDeleteMyhomeUgcInfoFolderFileFromS3();
if (result.isFail())
{
err_msg = $"Failed to tryDeleteMyhomeUgcInfoFolderFileFromS3() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
return result;
}
public async Task<QueryBatchBase.QueryResultType> completedTestUserCreate(QueryExecutorBase queryExecutorBase)
{
await Task.CompletedTask;
var err_msg = string.Empty;
var owner = getOwner();
setCompleted();
// 생성시 DBEntityWrite 처리 후 DB 에서 다시 로딩하게 되어있다.
// 나중에 최적화 목적으로 DBEntityWrite 처리 후 각각의 EntityAttribute 에 적재하는 방안도 고려 하자 !!! - kangms
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
m_user_log.setInfo(owner.toUserLogInfo());
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new UserCreateBusinessLog(log_action, DateTimeHelper.Current, m_user_create_log));
query_batch.appendBusinessLog(new UserBusinessLog(log_action, m_user_log));
var created_item_docs = getToWriteDocBases<ItemDoc>();
foreach (var item_doc in created_item_docs)
{
(var result, var item_log_info) = await item_doc.toItemLogInfo4Create();
if (result.isFail())
{
err_msg = $"Failed to toItemLogInfo4Create() !!! : {result.toBasicString()}";
Log.getLogger().error(err_msg);
continue;
}
NullReferenceCheckHelper.throwIfNull(item_log_info, () => $"item_log_info is null !!! - {owner.toBasicString()}");
query_batch.appendBusinessLog(new ItemBusinessLog(item_log_info));
}
return QueryBatchBase.QueryResultType.Success;
}
}
}

View File

@@ -0,0 +1,401 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using META_ID = System.UInt32;
namespace GameServer;
public class TestUserInitializer : SimpleEventTriggerBase
{
private readonly Player m_owner;
private bool m_is_completed_prepare_intialize = false;
private readonly List<QueryExecutorBase> m_query_executor_bases = new();
private bool m_is_test_user = false;
private ServerCommon.BusinessLogDomain.UserInitialLogInfo m_user_initial_log = new();
private ServerCommon.BusinessLogDomain.UserLogInfo m_user_log = new();
public TestUserInitializer(Player owner)
{
m_owner = owner;
}
public async Task<Result> onPrepareInitializer()
{
var owner = getOwner();
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_connector = server_logic.getDynamoDbClient();
var result = new Result();
var err_msg = string.Empty;
var account_attribute = owner.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}");
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var inventory_action_base = owner.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action_base, () => $"inventory_action_base is null !!! - {owner.toBasicString()}");
var account_id = account_attribute.AccountId;
var user_guid = user_attribute.UserGuid;
var selected_character_guid = user_attribute.SelectedCharacterGuid;
foreach (var meta_data in MetaData.Instance.m_test_user_initial_meta_datas.Values)
{
if (false == account_id.StartsWith(meta_data.IdPattern, StringComparison.OrdinalIgnoreCase))
{
continue;
}
//=================================================================================
// Intialize Items of Inventories
//=================================================================================
if (true == meta_data.IsInventoryInitialize)
{
inventory_action_base.onClear();
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<ItemDoc>(user_guid));
var inventory_action = owner.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}");
await inventory_action.clearItemAllFromMemory();
}
//=================================================================================
// Intialize Mails
//=================================================================================
if (meta_data.IsMailInitialize)
{
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<ReceivedMailDoc>(user_guid));
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<SentMailDoc>(user_guid));
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<MailProfileDoc>(user_guid));
}
//=================================================================================
// Intialize SocialActionDoc
//=================================================================================
if (meta_data.IsSocialActionInitialize)
{
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<SocialActionDoc>(user_guid));
}
//=================================================================================
// Intialize Customize State of CharacterBaseDoc
//=================================================================================
if (meta_data.IsAvatarCustomize)
{
if (true == selected_character_guid.isNullOrWhiteSpace())
{
err_msg = $"Not selected Character !!!, to Customize - {toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
DBQEntityWriteAfterRead<CharacterBaseDoc>.FnEntityWrite entity_write_func = async delegate (List<CharacterBaseDoc> readCharacterBaseDocs)
{
var result = new Result();
var err_msg = string.Empty;
if (0 >= readCharacterBaseDocs.Count)
{
err_msg = $"No read CharacterBaseDoc !!!";
Log.getLogger().warn(err_msg);
}
else
{
var found_character_base_doc = readCharacterBaseDocs.Find(x => x.getAttrib<CharacterBaseAttrib>()?.CharacterGuid == selected_character_guid);
if (null == found_character_base_doc)
{
err_msg = $"Not found CharacterBaseDoc !!! - {owner.toBasicString()}";
result.setFail(ServerErrorCode.CharacterNotFound, err_msg);
return result;
}
var character_base_attrib = found_character_base_doc.getAttrib<CharacterBaseAttrib>();
NullReferenceCheckHelper.throwIfNull(character_base_attrib, () => $"character_base_attrib is null - {owner.toBasicString()}");
character_base_attrib.ApperanceProfileValue.IsCustomCompleted = false;
await found_character_base_doc.updateDoc4Query();
}
return result;
};
m_query_executor_bases.Add(new DBQEntityWriteAfterRead<CharacterBaseDoc>(user_guid, selected_character_guid, entity_write_func));
}
}
//=================================================================================
// Create Items of TestUserCreate Meta
//=================================================================================
if (meta_data.IsResetToItemsOfTestUserCreate)
{
if(false == meta_data.IsInventoryInitialize)
{
m_query_executor_bases.Add(new DBQEntityDeleteAfterReadAll<ItemDoc>(user_guid));
var inventory_action = owner.getEntityAction<InventoryActionBase>();
NullReferenceCheckHelper.throwIfNull(inventory_action, () => $"inventory_action is null !!! - {owner.toBasicString()}");
await inventory_action.clearItemAllFromMemory();
}
(result, var found_test_user_create_data) = await MetaHelper.getTestUserCreateDataByAccountId(account_id);
if (result.isSuccess())
{
NullReferenceCheckHelper.throwIfNull(found_test_user_create_data, () => $"found_test_user_create_data is null !!! - {owner.toBasicString()}");
(result, var created_item_docs) = await TestUserCreator.createItemDocsByTestUserCreateData(owner, found_test_user_create_data);
if(result.isFail())
{
return result;
}
NullReferenceCheckHelper.throwIfNull(created_item_docs, () => $"created_item_docs is null - {owner.toBasicString()}");
m_query_executor_bases.Add(new DBQEntityWrite(created_item_docs));
}
}
//=================================================================================
// Intialize MoneyDoc
//=================================================================================
{
DBQEntityWriteAfterRead<MoneyDoc>.FnEntityWrite entity_write_func = async delegate (List<MoneyDoc> readMoneyDocs)
{
var result = new Result();
var err_msg = string.Empty;
if (0 >= readMoneyDocs.Count)
{
err_msg = $"No read readMoneyDocs !!!";
Log.getLogger().warn(err_msg);
}
else
{
var found_money_doc = readMoneyDocs.Find(x => x.getAttrib<MoneyAttrib>()?.OwnerGuid == user_guid);
if (null == found_money_doc)
{
err_msg = $"Not found found_money_doc !!! - {owner.toBasicString()}";
result.setFail(ServerErrorCode.UserMoneyDocEmpty, err_msg);
return result;
}
var money_attrib = found_money_doc.getAttrib<MoneyAttrib>();
NullReferenceCheckHelper.throwIfNull(money_attrib, () => $"money_attrib is null - {owner.toBasicString()}");
if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.CurrencyGold))
{
money_attrib.Gold = meta_data.CurrencyGold;
}
if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_sapphire))
{
money_attrib.Sapphire = meta_data.currency_sapphire;
}
if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_calium))
{
money_attrib.Calium = meta_data.currency_calium;
}
if (true == CurrencyType.Gold.isBalanceWithinMaxCurrency(meta_data.currency_ruby))
{
money_attrib.Ruby = meta_data.currency_ruby;
}
await found_money_doc.updateDoc4Query();
}
return result;
};
m_query_executor_bases.Add(new DBQEntityWriteAfterRead<MoneyDoc>(user_guid, "", entity_write_func));
}
//=================================================================================
// Intialize LocationDoc
//=================================================================================
{
DBQEntityWriteAfterRead<LocationDoc>.FnEntityWrite entity_write_func = async delegate (List<LocationDoc> readLocationDocs)
{
var result = new Result();
var err_msg = string.Empty;
if (0 >= readLocationDocs.Count)
{
err_msg = $"No read readLocationDocs !!!";
Log.getLogger().warn(err_msg);
}
else
{
if (readLocationDocs.Count > 1)
{
err_msg = $"More than One registered LocationDoc !!! : TgtDoc:{typeof(LocationDoc).Name} - {owner.toBasicString()}";
Log.getLogger().warn(result.toBasicString());
}
var found_location_doc = readLocationDocs[0];
var location_attrib = found_location_doc.getAttrib<LocationAttrib>();
NullReferenceCheckHelper.throwIfNull(location_attrib, () => $"location_attrib is null - {owner.toBasicString()}");
location_attrib.LastConnectedChannelServerLocation.fromPos(new Pos() { X = meta_data.StartX, Y = meta_data.StartY, Z = meta_data.StartZ, Angle = meta_data.StartAngle });
await found_location_doc.updateDoc4Query();
// 테스트 유저 입장 처리를 위해 설정 한다. !!!
setTestUser(true);
}
return result;
};
m_query_executor_bases.Add(new DBQEntityWriteAfterRead<LocationDoc>(user_guid, "", entity_write_func));
}
//=================================================================================
// Intialize Myhomes
//=================================================================================
if (meta_data.IsMyHomeInitialize)
{
MyhomeUgcInfo? myhome_ugc_info;
if (meta_data.MyhomeFile == string.Empty)
{
var default_myhome_ugc_info_file_name = MetaHelper.GameConfigMeta.MyHomeDefaultSaveFileName;
if (!MapManager.Instance.getDefaultMyhomeUgcInfo(default_myhome_ugc_info_file_name, out 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;
}
}
else
{
if (!MapManager.Instance.getDefaultMyhomeUgcInfo(meta_data.MyhomeFile, out myhome_ugc_info))
{
err_msg = $"Failed to getDefaultMyhomeUgcInfo() !!! : {meta_data.MyhomeFile} : {this.getTypeName()}";
result.setFail(ServerErrorCode.MyhomeUgcInfoFileNotFoune, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
}
m_query_executor_bases.Add(new DBQMyhomeInitializeForTestUser(user_guid, myhome_ugc_info));
}
(result, var user_doc) = await user_attribute.toDocBase(false);
if (result.isFail())
{
err_msg = $"Failed to toDocBase() !!! : {result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().warn(err_msg);
return result;
}
NullReferenceCheckHelper.throwIfNull(user_doc, () => $"user_doc is null !!! - {owner.toBasicString()}");
// UserCreate 로그 설정
m_user_initial_log.UserGuid = user_attribute.UserGuid;
m_user_initial_log.UserPK = user_doc.getPK();
m_user_initial_log.UserSK = user_doc.getSK();
m_user_initial_log.UserInitialMetaType = meta_data.getTypeName();
m_user_initial_log.UserInitialMetaId = (META_ID)meta_data.MetaId;
break;
}
setCompetedPrepareInitialize(true);
return result;
}
public override async Task<Result> onTriggerEffect()
{
var owner = getOwner();
ArgumentNullException.ThrowIfNull(owner, $"owner is null");
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {owner.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (false == isCompletedPrepareInitialize())
{
err_msg = $"Not completed isCompletedPrepareLoad() !!! - {toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.UserPrepareLoadNotCompleted, err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.TestUserInitial
, server_logic.getDynamoDbClient()
, false );
{
foreach(var query_executor in m_query_executor_bases)
{
batch.addQuery(query_executor);
}
batch.addQuery(new QueryFinal(), completedTestUserInitial);
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
setCompleted();
return result;
}
public async Task<QueryBatchBase.QueryResultType> completedTestUserInitial(QueryExecutorBase queryExecutorBase)
{
await Task.CompletedTask;
var owner = getOwner();
var err_msg = string.Empty;
setCompleted();
// 생성시 DBEntityWrite 처리 후 DB 에서 다시 로딩하게 되어있다.
// 나중에 최적화 목적으로 DBEntityWrite 처리 후 각각의 EntityAttribute 에 적재하는 방안도 고려 하자 !!! - kangms
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
m_user_log.setInfo(owner.toUserLogInfo());
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new UserInitialBusinessLog(log_action, m_user_initial_log));
query_batch.appendBusinessLog(new UserBusinessLog(log_action, m_user_log));
return QueryBatchBase.QueryResultType.Success;
}
public bool isCompletedPrepareInitialize() => m_is_completed_prepare_intialize;
public void setCompetedPrepareInitialize(bool isTrue) => m_is_completed_prepare_intialize = isTrue;
public bool isTestUser() => m_is_test_user;
public void setTestUser(bool isTrue) => m_is_test_user = isTrue;
public Player getOwner() => m_owner;
}

View File

@@ -0,0 +1,147 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using ServerCommon.BusinessLogDomain;
namespace GameServer
{
public class CharacterLoader : EntityLoaderBase
{
private ServerCommon.BusinessLogDomain.CharacterLogInfo m_character_log = new();
public CharacterLoader(Player owner)
: base(owner)
{
}
public override async Task<Result> onPrepareLoad()
{
await Task.CompletedTask;
var result = new Result();
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
setCompetedPrepareLoad(true);
return result;
}
public override async Task<Result> onTriggerEffect()
{
await Task.CompletedTask;
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var server_logic = GameServerApp.getServerLogic();
NullReferenceCheckHelper.throwIfNull(server_logic, () => $"server_logic is null !!! - {owner.toBasicString()}");
var result = new Result();
var err_msg = string.Empty;
if (false == isCompletedPrepareLoad())
{
err_msg = $"Not completed isCompletedPrepareLoad() !!! - {toBasicString()}, {owner.toBasicString()}";
result.setFail(ServerErrorCode.CharacterPrepareLoadNotCompleted , err_msg);
return result;
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.CharacterLoading
, server_logic.getDynamoDbClient() );
{
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
batch.addQuery(new DBQCharacterReadAll(user_attribute.UserGuid));
batch.addQuery(new QueryFinal(), tryUpdateCharacterLoadStep);
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
}
public async Task<QueryBatchBase.QueryResultType> tryUpdateCharacterLoadStep(QueryExecutorBase queryExecutorBase)
{
await Task.CompletedTask;
var err_msg = string.Empty;
var query_result_type = QueryBatchBase.QueryResultType.Success;
var owner = getOwner();
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
user_create_or_load_action.clearReservedCharacterForCreation();
var player_action = owner.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var selected_character = player_action.getSelectedCharacter();
if(null == selected_character)
{
err_msg = $"Character Not selected !!! - {owner.toBasicString()}";
getLoadResult().setFail(ServerErrorCode.CharacterNotSelected, err_msg);
return query_result_type;
}
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
var character_attribute = selected_character.getEntityAttribute<CharacterAttribute>();
NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!! - {owner.toBasicString()}");
(var result, var character_log_info) = await character_attribute.toCharacterLogInfo();
if (result.isFail())
{
err_msg = $"Failed to toCharacterLogInfo() !!! : {result.toBasicString()} - {toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
if (character_log_info is not null)
{
m_character_log.setInfo(character_log_info);
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new CharacterBusinessLog(log_action, m_character_log));
}
}
getLoadResult().setSuccess();
setCompleted();
return query_result_type;
}
}
}

View File

@@ -0,0 +1,61 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServerCore; using ServerBase;
using ServerCommon;
namespace GameServer
{
public abstract class EntityLoaderBase : SimpleEventTriggerBase
{
private Player m_owner;
private ConcurrentDictionary<Type, List<DynamoDbDocBase>> m_to_read_doc_bases = new();
private bool m_is_completed_prepare_load = false;
private readonly Result m_load_result = new();
public EntityLoaderBase(Player owner)
{
m_owner = owner;
m_load_result.set(ServerErrorCode.ResultCodeNotSet, $"Result Code not set !!!");
}
public abstract Task<Result> onPrepareLoad();
public bool isCompletedPrepareLoad() => m_is_completed_prepare_load;
public void setCompetedPrepareLoad(bool isTrue) => m_is_completed_prepare_load = isTrue;
protected Result addToReadDocBase(DynamoDbDocBase docBase)
{
var result = new Result();
var err_msg = string.Empty;
if (false == m_to_read_doc_bases.TryGetValue(docBase.GetType(), out var found_doc_bases))
{
found_doc_bases = new List<DynamoDbDocBase>();
m_to_read_doc_bases.TryAdd(docBase.GetType(), found_doc_bases);
}
found_doc_bases.Add(docBase);
return result;
}
public ConcurrentDictionary<Type, List<DynamoDbDocBase>> getToReadDocBases() => m_to_read_doc_bases;
public Result getLoadResult() => m_load_result;
public Player getOwner() => m_owner;
}
}

View File

@@ -0,0 +1,678 @@
using Google.Protobuf;
using Google.Protobuf.WellKnownTypes;
using ServerCore;
using ServerBase;
using ServerCommon;
using ServerCommon.BusinessLogDomain;
using MetaAssets;
using SESSION_ID = System.Int32;
using WORLD_META_ID = System.UInt32;
using META_ID = System.UInt32;
using ENTITY_GUID = System.String;
using ACCOUNT_ID = System.String;
using OWNER_GUID = System.String;
using USER_GUID = System.String;
using CHARACTER_GUID = System.String;
using ITEM_GUID = System.String;
using PARTY_GUID = System.String;
using Amazon.S3.Model;
namespace GameServer;
public class UserLoader : EntityLoaderBase
{
private List<FarmingSummary> m_progress_farming_summaries = new();
private string m_transact_guid = string.Empty;
private ServerCommon.BusinessLogDomain.UserLogInfo m_user_log = new();
public UserLoader(Player owner)
: base(owner)
{
}
protected virtual async Task onResetUser()
{
var result = new Result();
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var user_create_or_load_action = player.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {player.toBasicString()}");
user_create_or_load_action.onClearUserCreators();
await player.onResetUser();
}
public override async Task<Result> onPrepareLoad()
{
await Task.CompletedTask;
var result = new Result();
var err_msg = string.Empty;
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var account_attribute = player.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
var account_base_doc = account_attribute.getOriginDocBase<AccountAttribute>() as AccountBaseDoc;
if (null == account_base_doc)
{
err_msg = $"Not load AccountBaseDoc !!! - {player.toBasicString()}";
result.setFail(ServerErrorCode.AccountBaseDocNotLoad, err_msg);
Log.getLogger().error(result.toBasicString());
return result;
}
setCompetedPrepareLoad(true);
return result;
}
public override async Task<Result> onTriggerEffect()
{
var player = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
var result = new Result();
var err_msg = string.Empty;
if (false == isCompletedPrepareLoad())
{
err_msg = $"Not completed isCompletedPrepareLoad() !!! - {toBasicString()}, {player.toBasicString()}";
result.setFail(ServerErrorCode.UserPrepareLoadNotCompleted, err_msg);
return result;
}
m_transact_guid = Guid.NewGuid().ToString("N");
// Player 초기화 작업
await onResetUser();
//=====================================================================================
// Cache to Attribute
//=====================================================================================
result = await onLoadEntityAttributeFromCache();
if (result.isFail())
{
return result;
}
//=====================================================================================
// Doc to Attribute
//=====================================================================================
result = await onLoadEntityAttriubteFromDoc();
if (result.isFail())
{
return result;
}
//=====================================================================================
// Contents Load
//=====================================================================================
result = await onContentsLoading();
if (result.isFail())
{
return result;
}
return result;
}
protected async Task<Result> onContentsLoading()
{
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var result = new Result();
var err_msg = string.Empty;
var user_create_or_loading_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_loading_action, () => $"user_create_or_loading_action is null !!! - {owner.toBasicString()}");
if(true == user_create_or_loading_action.isFirstLogin())
{
var account_attribute = owner.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}");
if(0 < account_attribute.SsoAccountAuthJWT.Length)
{
result = await onLoadNftFromUrl(owner);
if (result.isFail())
{
err_msg = $"Failed to onLoadNftFromUrl() !!! : {result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
}
}
LandAuctionManager.It.sendLandAuctionAllToUserGuid(owner);
return result;
}
protected virtual async Task<Result> onLoadEntityAttributeFromCache()
{
var result = new Result();
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var game_login_action = owner.getEntityAction<GameLoginAction>();
NullReferenceCheckHelper.throwIfNull(game_login_action, () => $"game_login_action is null !!! - {owner.toBasicString()}");
var login_cache_request = game_login_action.getLoginCacheRequest();
NullReferenceCheckHelper.throwIfNull(login_cache_request, () => $"login_cache_request is null !!! - {owner.toBasicString()}");
var login_cache = login_cache_request.getLoginCache();
NullReferenceCheckHelper.throwIfNull(login_cache, () => $"login_cache is null !!! - {owner.toBasicString()}");
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
result = await ServerBase.DataCopyHelper.copyEntityAttributeFromCaches(user_attribute, (new List<CacheBase>() { login_cache }));
if (result.isFail())
{
return result;
}
var location_action = owner.getEntityAction<LocationAction>();
NullReferenceCheckHelper.throwIfNull(location_action, () => $"location_action is null !!! - {owner.toBasicString()}");
result = await location_action.tryLoadEntityAttributeFromCache();
if (result.isFail())
{
return result;
}
return result;
}
protected virtual async Task<Result> onLoadEntityAttriubteFromDoc()
{
var result = new Result();
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
result = await onLoadUserFromDoc(owner);
if (result.isFail())
{
return result;
}
result = await onLoadUgcNpcFromDoc(owner);
if (result.isFail())
{
return result;
}
await onLoadFarmingEffectFromDoc(owner);
var user_land_auction_action = owner.getEntityAction<UserLandAuctionAction>();
NullReferenceCheckHelper.throwIfNull(user_land_auction_action, () => $"user_land_auction_action is null !!! - {owner.toBasicString()}");
result = await user_land_auction_action.tryLoadLandAuctionBidPriceAllFromDb();
if (result.isFail())
{
return result;
}
result = await onLoadMyhomeFromDoc(owner);
if (result.isFail())
{
return result;
}
result = await onLoadPackageFromDoc(owner);
if(result.isFail()) return result;
result = await onLoadAiChatFromDoc(owner);
if (result.isFail()) return result;
result = await onLoadSeasonPassFromDoc(owner);
if (result.isFail()) return result;
var server_logic = GameServerApp.getServerLogic();
var nickname_attribute = owner.getEntityAttribute<NicknameAttribute>();
NullReferenceCheckHelper.throwIfNull(nickname_attribute, () => $"nickname_attribute is null !!! - {owner.toBasicString()}");
var player_manager = server_logic.getPlayerManager();
var buff_action = owner.getEntityAction<BuffAction>();
NullReferenceCheckHelper.throwIfNull(buff_action, () => $"buff_action is null !!! - {owner.toBasicString()}");
result = await buff_action.loadBuff();
if (result.isFail())
{
return result;
}
// 유저의 Nickname을 PlayerManager에 SubKey로 등록 한다.
result = player_manager.trySubKeyBindToPrimaryKey(nickname_attribute.Nickname, owner.getUserGuid(), owner);
if (result.isFail())
{
return result;
}
return result;
}
protected virtual async Task<Result> onLoadUserFromDoc(Player owner)
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var entity_attribute_owner = owner;
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserLoading
, server_logic.getDynamoDbClient()
, false, getTransactGuid() );
{
var user_guid = user_attribute.UserGuid;
batch.addQuery(new DBQEntityReadToAttribute<CraftHelpDoc>(entity_attribute_owner, user_guid, new[] { typeof(CraftHelpAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<NicknameDoc>(entity_attribute_owner, user_guid, new[] { typeof(NicknameAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<LevelDoc>(entity_attribute_owner, user_guid, new[] { typeof(LevelAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<MoneyDoc>(entity_attribute_owner, user_guid, new[] { typeof(MoneyAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<CaliumDoc>(entity_attribute_owner, user_guid, new[] { typeof(CaliumAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<MailProfileDoc>(entity_attribute_owner, user_guid, new[] { typeof(MailProfileAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<GameOptionDoc>(entity_attribute_owner, user_guid, new[] { typeof(GameOptionAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<CharacterProfileDoc>(entity_attribute_owner, user_guid, new[] { typeof(CharacterProfileAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<LocationDoc>(entity_attribute_owner, user_guid, new[] { typeof(LocationAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<EscapePositionDoc>(entity_attribute_owner, user_guid, new[] { typeof(EscapePositionAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<SeasonPassDoc>(entity_attribute_owner, user_guid, new[] { typeof(SeasonPassAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<UserContentsSettingDoc>(entity_attribute_owner, user_guid, new[] { typeof(UserContentsSettingAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<PackageLastOrderRecodeDoc>(entity_attribute_owner, user_guid, new[] { typeof(PackageLastOrderRecodeAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<PackageRepeatDoc>(entity_attribute_owner, user_guid, new[] { typeof(PackageRepeatAttribute) }));
batch.addQuery(new DBQEntityReadToAttribute<AiChatDoc>(entity_attribute_owner, user_guid, new[] { typeof(AiChatAttribute) }));
batch.addQuery(new DBQItemReadAll<UserInventoryAction>(OwnerEntityType.User));
batch.addQuery(new DBQShopProductTradingMeterReadAll(user_guid));
batch.addQuery(new DBQRentalReadAll(user_guid));
batch.addQuery(new DBQOwnedBuildingReadAll(user_guid));
batch.addQuery(new DBQOwnedLandReadAll(user_guid));
batch.addQuery(new DBQSocailActionReadAll(user_guid));
batch.addQuery(new DBQToolActionRead(user_guid));
batch.addQuery(new DBQRoomReadAll(user_guid));
batch.addQuery(new DBQMinimapMarkerReadAll(user_guid));
batch.addQuery(new DBQItemFirstPurchaseHistoryReadAll(user_guid));
batch.addQuery(new DBQRentalInstanceVisitReadAll(user_guid));
batch.addQuery(new DBQDailyQuestCheckReadAll(user_guid));//legacy
batch.addQuery(new DBQSwitchingPropReadAll(user_guid));
batch.addQuery(new DBQQuestPeriodRepeatReadAll(user_guid));
batch.addQuery(new DBQCartReadAll(user_guid));
batch.addQuery(new DBQMailReadAll(user_guid));
batch.addQuery(new DBQCraftReadAll(user_guid));
batch.addQuery(new DBQCraftRecipeReadAll(user_guid));
batch.addQuery(new DBQTaskReservationReadAll(user_guid));
batch.addQuery(new DBQPackageRepeatReadAll(user_guid));
batch.addQuery(new DBQClaimReadAll(user_guid));
batch.addQuery(new DBQFriendsReadAll(user_guid));
//friendFolder는 클라와 협의후 customDefineUI 로 변경하고 이후 DBQFriendFoldersReadAll은 미사용 예정
batch.addQuery(new DBQFriendFoldersReadAll(user_guid));
batch.addQuery(new DBQQuestsReadAll(user_guid));
batch.addQuery(new DBQEndQuestsReadAll(user_guid));
batch.addQuery(new DBQQuestMailsReadAll(user_guid));
batch.addQuery(new DBQBlockUsersReadAll(user_guid));
batch.addQuery(new DBQRepeatQuestRead(user_guid));
batch.addQuery(new DBQCustomDefinedUiReadAll(OwnerEntityType.User));
batch.addQuery(new DBQUgqDailyRewardCountRead(user_guid));
batch.addQuery(new DBQBeaconShopSoldReadAll(user_guid));
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
}
protected virtual async Task<Result> onLoadUgcNpcFromDoc(Player owner)
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var entity_attribute_owner = owner;
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserLoading
, server_logic.getDynamoDbClient()
, false, getTransactGuid() );
{
var user_guid = user_attribute.UserGuid;
batch.addQuery(new DBQUgcNpcReadAll(user_guid));
batch.addQuery(new DBQItemReadAll<UgcNpcInventoryAction>(OwnerEntityType.UgcNpc));
batch.addQuery(new DBQCustomDefinedUiReadAll(OwnerEntityType.UgcNpc));
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
}
protected virtual async Task onLoadFarmingEffectFromDoc(Player owner)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
// by Player
await FarmingHelper.tryFinalyzeUncompletedFarmingByOwner(owner);
// by UgcNpc All
var player_action = owner.getEntityAction<PlayerAction>();
NullReferenceCheckHelper.throwIfNull(player_action, () => $"player_action is null !!! - {owner.toBasicString()}");
var ugc_npcs = player_action.getHadUgcNpcs();
foreach (var each in ugc_npcs)
{
var ugc_npc = each.Value;
(result, var is_farming_force_release) = await FarmingHelper.tryFinalyzeUncompletedFarmingByOwner(ugc_npc, this);
if (result.isFail())
{
err_msg = $"Failed to tryFinalyzeUncompletedFarmingByOwner() !!! : {result.toBasicString()} - {ugc_npc.toBasicString()}, {owner.toBasicString()}";
ServerCore.Log.getLogger().error(err_msg);
}
if(true == is_farming_force_release)
{
// 파밍을 강제 해제 한다. !!!
var farming_action = ugc_npc.getEntityAction<FarmingAction>();
NullReferenceCheckHelper.throwIfNull(farming_action, () => $"farming_action is null !!! - {ugc_npc.toBasicString()}, {owner.toBasicString()}");
var reset_result = await farming_action.resetFarmingState();
if (reset_result.isFail())
{
err_msg = $"Failed to resetFarmingState() !!! : {reset_result.toBasicString()} - {ugc_npc.toBasicString()}, {owner.toBasicString()}";
ServerCore.Log.getLogger().error(err_msg);
}
else
{
err_msg = $"Farming force released !!!, in onLoadFarmingEffectFromDoc() - {ugc_npc.toBasicString()}, {owner.toBasicString()}";
Log.getLogger().debug(err_msg);
}
}
}
}
protected virtual async Task<Result> onLoadMyhomeFromDoc(Player owner)
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var user_attribute = owner.getEntityAttribute<UserAttribute>();
NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}");
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserLoading
, server_logic.getDynamoDbClient()
, false, getTransactGuid() );
{
var user_guid = user_attribute.UserGuid;
batch.addQuery(new DBQMyhomeReadAll(user_guid));
batch.addQuery(new DBQItemReadAll<MyhomeInventoryAction>(OwnerEntityType.Myhome));
batch.addQuery(new QueryFinal(), tryUpdateUserLoadStep);
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
return result;
}
protected virtual async Task<Result> onLoadSeasonPassFromDoc(Player owner)
{
var result = new Result();
var server_logic = GameServerApp.getServerLogic();
var season_pass_action = owner.getEntityAction<SeasonPassAction>();
NullReferenceCheckHelper.throwIfNull(season_pass_action, () => $"season_pass_action is null !!! - {owner.toBasicString()}");
result = await season_pass_action.tryUpdateSeasonPass(getTransactGuid());
if (result.isFail())
{
return result;
}
return result;
}
protected async Task<QueryBatchBase.QueryResultType> tryUpdateUserLoadStep(QueryExecutorBase queryExecutorBase)
{
await Task.CompletedTask;
var err_msg = string.Empty;
var owner = getOwner() as Player;
NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!");
var user_create_or_load_action = owner.getEntityAction<UserCreateOrLoadAction>();
NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}");
var query_batch = queryExecutorBase.getQueryBatch();
NullReferenceCheckHelper.throwIfNull(query_batch, () => $"query_batch is null !!! - {owner.toBasicString()}");
var log_action = query_batch.getLogAction();
NullReferenceCheckHelper.throwIfNull(log_action, () => $"log_action is null !!! - {owner.toBasicString()}");
m_user_log.setInfo(owner.toUserLogInfo());
// 비즈니스 로그 추가
query_batch.appendBusinessLog(new UserBusinessLog(log_action, m_user_log));
user_create_or_load_action.onClear();
getLoadResult().setSuccess();
setCompleted();
return QueryBatchBase.QueryResultType.Success;
}
protected virtual async Task<Result> onLoadPackageFromDoc(Player owner)
{
var result = new Result();
var package_action = owner.getEntityAction<PackageAction>();
NullReferenceCheckHelper.throwIfNull(package_action, () => $"package_action is null !!! - {owner.toBasicString()}");
result = await package_action.InsertPackageLastOrderRecodeDoc();
if (result.isFail())
{
return result;
}
await package_action.tryOrderNewProductList();
return result;
}
protected virtual async Task<Result> onLoadAiChatFromDoc(Player owner)
{
var result = new Result();
var ai_chat_attribute = owner.getEntityAttribute<AiChatAttribute>();
NullReferenceCheckHelper.throwIfNull(ai_chat_attribute, () => $"ai_chat_attribute is null !!! - {owner.toBasicString()}");
var ai_chat_doc = ai_chat_attribute.getOriginDocBase<AiChatAttribute>();
if (ai_chat_doc == null)
{
var server_logic = GameServerApp.getServerLogic();
var dynamo_db_client = server_logic.getDynamoDbClient();
ArgumentNullException.ThrowIfNull(dynamo_db_client);
result = await dynamo_db_client.simpleInsertDocumentWithDocType(new AiChatDoc(owner.getUserGuid()));
if (result.isFail())
{
var err_msg = $"Failed to simpleInsertDocumentWithDocType<AiChatDoc> !!! - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
}
return result;
}
protected virtual async Task<Result> onLoadNftFromUrl(Player owner)
{
var result = new Result();
var err_msg = string.Empty;
var server_logic = GameServerApp.getServerLogic();
var account_attribute = owner.getEntityAttribute<AccountAttribute>();
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {owner.toBasicString()}");
var to_check_item_meta_id = MetaHelper.GameConfigMeta.CPNFTHolderKeyItem;
if(0 >= to_check_item_meta_id)
{
err_msg = $"Invalid ItemMetaId !!!, GameConfigMeta.CPNFTHolderKeyItem !!! : {to_check_item_meta_id} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
(var nft_result, var is_found) = await NFTHelper.hasStakedNft(account_attribute.SsoAccountAuthJWT);
if (nft_result.isFail())
{
err_msg = $"Failed to NFTHelper.hasStakedNft() !!! : {nft_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
else
{
var to_write_docs = new List<DynamoDbDocBase>();
var user_inventory_action = owner.getEntityAction<UserInventoryAction>();
NullReferenceCheckHelper.throwIfNull(user_inventory_action, () => $"user_inventory_action is null !!! - {owner.toBasicString()}");
if (false == is_found)
{
// 보유중인 CPNFTHolderKeyItem 을 모두 삭제 한다.
(var delete_result, var to_delete_items) = await user_inventory_action.tryDeleteItemByMetaId((META_ID)to_check_item_meta_id);
if (delete_result.isFail())
{
err_msg = $"Failed to tryDeleteItemByMetaId() !!! : {delete_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
return result;
}
foreach(var delete_item in to_delete_items)
{
var item_attribute = delete_item.getEntityAttribute<UserItemAttribute>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
(var doc_result, var doc) = await item_attribute.toDocBase();
if(doc_result.isFail())
{
err_msg = $"Failed to toDocBase() !!!, at tryDeleteItemByMetaId() : {doc_result.toBasicString()} - {item_attribute.toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
continue;
}
NullReferenceCheckHelper.throwIfNull(doc, () => $"doc is null !!! - {owner.toBasicString()}");
to_write_docs.Add(doc);
}
}
else
{
// 보유중인 CPNFTHolderKeyItem 이 없다면, 지급해 준다. !!!
if (false == user_inventory_action.hasItemByMetaId((META_ID)to_check_item_meta_id))
{
(var add_result, var to_add_items) = await user_inventory_action.tryTakalbleToBag((META_ID)to_check_item_meta_id);
if(add_result.isFail())
{
err_msg = $"Failed to tryTakalbleToBag() !!! : {add_result.toBasicString()} - {owner.toBasicString()}";
Log.getLogger().error(err_msg);
}
foreach (var add_item in to_add_items)
{
var item_attribute = add_item.getEntityAttribute<UserItemAttribute>();
NullReferenceCheckHelper.throwIfNull(item_attribute, () => $"item_attribute is null !!! - {owner.toBasicString()}");
(var doc_result, var doc) = await item_attribute.toDocBase();
if (doc_result.isFail())
{
err_msg = $"Failed to toDocBase() !!!, at tryTakalbleToBag() : {doc_result.toBasicString()} - {item_attribute.toBasicString()}, {owner.toBasicString()}";
Log.getLogger().error(err_msg);
continue;
}
NullReferenceCheckHelper.throwIfNull(doc, () => $"doc is null !!! - {owner.toBasicString()}");
to_write_docs.Add(doc);
}
}
}
var batch = new QueryBatchEx<QueryRunnerWithDocument>( owner, LogActionType.UserLoading
, server_logic.getDynamoDbClient()
, false, getTransactGuid() );
{
batch.addQuery(new DBQEntityWrite(to_write_docs));
batch.addQuery(new QueryFinal());
}
result = await QueryHelper.sendQueryAndBusinessLog(batch);
if (result.isFail())
{
return result;
}
}
return result;
}
public void pushProgressFarmingSummary(FarmingSummary progressFarmingSummary)
{
m_progress_farming_summaries.Add(progressFarmingSummary);
}
public List<FarmingSummary> getProgressFarmingSummaryAll() => m_progress_farming_summaries;
public string getTransactGuid() => m_transact_guid;
}