초기커밋
This commit is contained in:
240
GameServer/Contents/QuestUGQ/Action/UgqAbortAction.cs
Normal file
240
GameServer/Contents/QuestUGQ/Action/UgqAbortAction.cs
Normal file
@@ -0,0 +1,240 @@
|
||||
using Google.Protobuf;
|
||||
using Google.Protobuf.WellKnownTypes;
|
||||
|
||||
|
||||
using ServerCore;
|
||||
using ServerBase;
|
||||
using ServerCommon;
|
||||
using ServerCommon.BusinessLogDomain;
|
||||
using MetaAssets;
|
||||
|
||||
|
||||
using UGQDatabase.Models;
|
||||
|
||||
|
||||
namespace GameServer;
|
||||
|
||||
public class UgqAbortAction : EntityActionBase
|
||||
{
|
||||
public UgqAbortAction(EntityBase owner)
|
||||
: base(owner)
|
||||
{
|
||||
}
|
||||
|
||||
public override async Task<Result> onInit()
|
||||
{
|
||||
await Task.CompletedTask;
|
||||
|
||||
var result = new Result();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public override void onClear()
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<Result> ugqAbort(UInt32 questId, UInt32 questRevision)
|
||||
{
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var quest_action = player.getEntityAction<QuestAction>();
|
||||
|
||||
var result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!");
|
||||
|
||||
//내가 들고 있는 퀘스트 리비전기준으로 apiserver 에서 정보를 가져와서 shutdown 상태가 아니면 환불 취소를 할수없다.
|
||||
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
|
||||
var owned_quest_revision = quest_attribute.UgqInfo.QuestRevision;
|
||||
|
||||
var ugq_info_action = player.getEntityAction<UgqInfoAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(ugq_info_action, () => $"ugq_info_action is null !!! - {player.toBasicString()}");
|
||||
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
|
||||
var language_type = account_attribute.LanguageType;
|
||||
|
||||
(result, var state, _) = await ugq_info_action.makeUgqCurrentState(questId, owned_quest_revision, language_type);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(state, () => $"state is null !!! - {player.toBasicString()}");
|
||||
|
||||
//리비전 변경된 상태도 아니고, 셧다운 상태도 아니, 스탠바이 상태도 아니면 포기할수 없다.
|
||||
if (state.UgqState != UgqStateType.Shutdown && state.UgqState != UgqStateType.RevisionChanged && state.UgqState != UgqStateType.Standby)
|
||||
{
|
||||
var err_msg = $"can't abort ugq, cause ugqState Invalid () !!! questId : {questId}, revision : {owned_quest_revision}, state : {state.UgqState} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.UgqAbortCannotCauseInvalidState, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
quest_attribute.deleteEntityAttribute();
|
||||
|
||||
(result, var quest_meta_all_base_info) = await QuestMetaManager.It.getQuestMeta(player, questId, questRevision);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(quest_meta_all_base_info, () => $"quest_meta_all_base_info is null !!! - {player.toBasicString()}");
|
||||
NullReferenceCheckHelper.throwIfNull(quest_meta_all_base_info.m_quest_data_entity, () => $"quest_meta_all_base_info.m_quest_data_entity is null !!! - {player.toBasicString()}");
|
||||
|
||||
var cost = UgqMetaHelper.getUgqCost(quest_meta_all_base_info.m_quest_data_entity.GradeType);
|
||||
var end_quest_action = player.getEntityAction<EndQuestAction>();
|
||||
NullReferenceCheckHelper.throwIfNull(end_quest_action, () => $"end_quest_action is null !!! - {player.toBasicString()}");
|
||||
|
||||
var has_end_quest = end_quest_action.hasEndQuest(questId, questRevision);
|
||||
|
||||
//이미 깬 이력이 있으면 환불할 것도 없다.
|
||||
if (cost > 0 && has_end_quest == false)
|
||||
{
|
||||
var currency_type = UgqMetaHelper.getUgqUsageFeeType(quest_meta_all_base_info.m_quest_data_entity.GradeType);
|
||||
var money_action = player.getEntityAction<MoneyAction>();
|
||||
result = await money_action.changeMoney(currency_type, cost);
|
||||
if (result.isFail()) return result;
|
||||
}
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.UgqAbort, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
var log_invoker = new UgqAbortBusinessLog(questId, questRevision, UgqAbortType.Revision_Changed);
|
||||
batch.appendBusinessLog(log_invoker);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
var found_transaction_runner = player.findTransactionRunner(TransactionIdType.PrivateContents);
|
||||
NullReferenceCheckHelper.throwIfNull(found_transaction_runner, () => $"found_transaction_runner is null !!! - {player.toBasicString()}");
|
||||
|
||||
var common_result = found_transaction_runner.getCommonResult();
|
||||
QuestNotifyHelper.send_GS2C_NTF_QUEST_REWARD(player, common_result);
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqAbort", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
|
||||
|
||||
UGQAbortReason reason = state.UgqState.convertUGQAbortReason();
|
||||
var ugq_api_manager = server_logic.GetUqgApiManager();
|
||||
var api_result = await ugq_api_manager.setUgqQuestAborted(player.getUserGuid(), questId, owned_quest_revision, reason, language_type);
|
||||
if (api_result.isFail())
|
||||
{
|
||||
//로그만 남긴다.
|
||||
Log.getLogger().error($"Failed to setUgqQuestAborted : {api_result.toBasicString()} - {player.toBasicString()}");
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<Result> ugqAbortBySelf(UInt32 questId, UInt32 questRevision)
|
||||
{
|
||||
//셀프 포기는 재화를 환불해 주지 않는다.
|
||||
var player = getOwner() as Player;
|
||||
NullReferenceCheckHelper.throwIfNull(player, () => $"player is null !!!");
|
||||
|
||||
var server_logic = GameServerApp.getServerLogic();
|
||||
var quest_action = player.getEntityAction<QuestAction>();
|
||||
|
||||
var ugq_api_manager = server_logic.GetUqgApiManager();
|
||||
|
||||
var account_attribute = player!.getEntityAttribute<AccountAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(account_attribute, () => $"account_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
var language_type = account_attribute.LanguageType;
|
||||
|
||||
(var result, var latest_quest_data) = await ugq_api_manager.getUgqLatestQuestData(questId, language_type);
|
||||
if (result.isFail()) return result;
|
||||
|
||||
NullReferenceCheckHelper.throwIfNull(latest_quest_data, () => $"latest_quest_data is null !!! - {player.toBasicString()}");
|
||||
var latest_revision = latest_quest_data.Revision;
|
||||
|
||||
result = quest_action.getQuest(EQuestType.UGQ, questId, out var quest);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!");
|
||||
|
||||
var quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
|
||||
|
||||
if (quest_attribute.UgqInfo.QuestRevision != latest_revision || latest_quest_data.State != QuestContentState.Live)
|
||||
{
|
||||
var err_msg = $"can't abort ugq by self, cause quest revision changed !!! questId : {questId}, revision : {quest_attribute.UgqInfo.QuestRevision}, latest_revision : {latest_revision} - {player.toBasicString()}";
|
||||
result.setFail(ServerErrorCode.UgqAbortCannotCauseInvalidState, err_msg);
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
|
||||
var fn_transaction_runner = async delegate ()
|
||||
{
|
||||
var result = new Result();
|
||||
|
||||
quest_attribute = quest.getEntityAttribute<QuestAttribute>();
|
||||
NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!! - {player.toBasicString()}");
|
||||
quest_attribute.deleteEntityAttribute();
|
||||
|
||||
var batch = new QueryBatchEx<QueryRunnerWithDocument>(player, LogActionType.None, server_logic.getDynamoDbClient());
|
||||
{
|
||||
batch.addQuery(new DBQWriteToAttributeAllWithTransactionRunner());
|
||||
}
|
||||
|
||||
var log_invoker = new UgqAbortBusinessLog(questId, questRevision, UgqAbortType.Self);
|
||||
batch.appendBusinessLog(log_invoker);
|
||||
|
||||
result = await QueryHelper.sendQueryAndBusinessLog(batch);
|
||||
if (result.isFail())
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
result = await player.runTransactionRunnerSafely(TransactionIdType.PrivateContents, "UgqAbortBySelf", fn_transaction_runner);
|
||||
if (result.isFail())
|
||||
{
|
||||
var err_msg = $"Failed to runTransactionRunnerSafely() !!! : {result.toBasicString()} - {player.toBasicString()}";
|
||||
Log.getLogger().error(err_msg);
|
||||
return result;
|
||||
}
|
||||
result = quest_action.deleteQuest(EQuestType.UGQ, questId);
|
||||
|
||||
|
||||
var api_result = await ugq_api_manager.setUgqQuestAborted(player.getUserGuid(), questId, questRevision, UGQAbortReason.Player, language_type);
|
||||
if (api_result.isFail())
|
||||
{
|
||||
//로그만 남긴다.
|
||||
Log.getLogger().error($"Failed to setUgqQuestAborted by self : {api_result.toBasicString()} - {player.toBasicString()}");
|
||||
}
|
||||
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user