402 lines
18 KiB
C#
402 lines
18 KiB
C#
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;
|
|
}
|