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 onPrepareCreate() { var result = new Result(); var err_msg = string.Empty; var owner = getOwner(); var user_create_or_load_action = owner.getEntityAction(); NullReferenceCheckHelper.throwIfNull(user_create_or_load_action, () => $"user_create_or_load_action is null !!! - {owner.toBasicString()}"); var user_attribute = getOwner().getEntityAttribute(); 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(); NullReferenceCheckHelper.throwIfNull(character_attribute, () => $"character_attribute is null !!!- {owner.toBasicString()}"); var to_add_write_docs = new List(); // 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 onTriggerEffect() { var owner = getOwner(); var user_create_or_load_action = owner.getEntityAction(); 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( 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 tryUpdateTestCharacterCreate(QueryExecutorBase contextBase) { await Task.CompletedTask; var owner = getOwner(); setCompleted(); var user_create_or_load_action = owner.getEntityAction(); 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(); 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; } } }