using Amazon.CloudWatchLogs.Model; using Amazon.Runtime.Internal; using Amazon.S3.Model; using Google.Protobuf.WellKnownTypes; using MetaAssets; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Ocsp; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using static ClientToGameRes.Types; namespace GameServer { public class QuestTaskUpdateAction : EntityActionBase { public QuestTaskUpdateAction(EntityBase owner) : base(owner) { } public override Task onInit() { var result = new Result(); return Task.FromResult(result); } private Result taskFunctionProgress(QuestTaskUpdateHandler questTaskUpdateHandler) { ArgumentNullReferenceCheckHelper.throwIfNull(questTaskUpdateHandler.m_quest, () => $"questTaskUpdateHandler.m_quest is null !!!"); var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var quest_task = new QuestClientSide(owner); var quest = questTaskUpdateHandler.m_quest; var result = quest_task.questTaskFunctionProgress(owner, ref questTaskUpdateHandler); if(result.isFail()) return result; var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); if (quest_attribute.CurrentTaskComplete == 1 && quest_attribute.IsComplete == 0) { result = questNextTaskUpdate(questTaskUpdateHandler); if(result.isFail()) return result; } quest_attribute.modifiedEntityAttribute(); return result; } private async Task rewardUpdate(QuestTaskUpdateHandler questTaskUpdateHandler) { var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); IReward reward_proc = new QuestTaskReward(owner, owner.getUserGuid(), questTaskUpdateHandler); var result = await RewardManager.It.proceedRewardProcess(reward_proc); if (result.isFail()) return result; return result; } private async Task delteItemUpdate(QuestTaskUpdateHandler questTaskUpdateHandler) { var result = new Result(); //아이템 삭제 처리 var delete_items = questTaskUpdateHandler.m_deletable_items; foreach (var item in delete_items) { var item_id = item.Key; var item_count = item.Value; var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var inventory_action = owner.getEntityAction(); (result, var deleted_item) = await inventory_action.tryDeleteItemByMetaId((uint)item_id, (ushort)item_count); if (result.isFail()) { var err_msg = $"delteItemUpdate error delteitem : {JsonConvert.SerializeObject(item)}, owner : {owner.toBasicString()}"; Log.getLogger().error(err_msg); return result; } questTaskUpdateHandler.m_deleted_items.AddRange(deleted_item); } return result; } public Result questNextTaskUpdate(QuestTaskUpdateHandler questTaskUpdateHandler) { ArgumentNullReferenceCheckHelper.throwIfNull(questTaskUpdateHandler.m_quest_meta_info, () => $"questTaskUpdateHandler.m_quest_meta_info is null !!!"); ArgumentNullReferenceCheckHelper.throwIfNull(questTaskUpdateHandler.m_quest, () => $"questTaskUpdateHandler.m_quest is null !!!"); var result = new Result(); //var task_group = questTaskUpdateHandler.m_quest_task_group; var next_task_num = questTaskUpdateHandler.m_next_task_number; var task_group_list = questTaskUpdateHandler.m_quest_meta_info.QuestTaskGroupList; if (false == task_group_list.TryGetValue(next_task_num, out var questTaskInfo)) { var err_msg = $"questEventInfo InvalidData questId = {questTaskUpdateHandler.m_quest_id}, next_task_num : {next_task_num}"; result.setFail(ServerErrorCode.QuestInvalidValue, err_msg); return result; } var quest_attribute = questTaskUpdateHandler.m_quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); quest_attribute.CurrentTaskNum = next_task_num; quest_attribute.CurrentTaskComplete = 0; DateTime now = DateTime.UtcNow; quest_attribute.TaskStartTime = now; quest_attribute.ActiveEvents.Clear(); quest_attribute.ActiveEvents.AddRange(questTaskInfo.EventStringList); quest_attribute.HasTimer = 0; quest_attribute.TimerCompleteTime = now; quest_attribute.CompletedIdxStrings.Clear(); if (questTaskInfo.HasCounter) { quest_attribute.HasCounter = 1; quest_attribute.MaxCounter = questTaskInfo.MaxCounter; quest_attribute.MinCounter = questTaskInfo.MinCounter; quest_attribute.CurrentCounter = questTaskInfo.MinCounter; } else { quest_attribute.HasCounter = 0; quest_attribute.MaxCounter = 0; quest_attribute.MinCounter = 0; quest_attribute.CurrentCounter = 0; } return result; } public Result taskUpdateConditionCheck(ref QuestTaskUpdateHandler questTaskUpdateHandler) { ArgumentNullReferenceCheckHelper.throwIfNull(questTaskUpdateHandler.m_quest_meta_info, () => $"questTaskUpdateHandler.m_quest_meta_info is null !!!"); ArgumentNullReferenceCheckHelper.throwIfNull(questTaskUpdateHandler.m_quest, () => $"questTaskUpdateHandler.m_quest is null !!!"); var result = new Result(); var owner = getOwner() as Player; NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var quest_id = questTaskUpdateHandler.m_quest_id; var server_logic = GameServerApp.getServerLogic(); var quest_action = owner.getEntityAction(); var quest_type = questTaskUpdateHandler.m_quest_type; var quest = questTaskUpdateHandler.m_quest; var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); if (quest_attribute.IsComplete == 1) { result.setFail(ServerErrorCode.QuestAlreadyComplete, $"Already Complete Quest QuestID : {quest_id}"); return result; } var active_event = questTaskUpdateHandler.m_active_event; if (false == quest_attribute.ActiveEvents.Contains(active_event)) { string err_msg = $"ActiveIdxList info Invalie questId : {quest_id}, activeEvent : {active_event} User QuestInfo : {JsonConvert.SerializeObject(quest_attribute)}"; result.setFail(ServerErrorCode.QuestMailNotExist, err_msg); return result; } if (false == questTaskUpdateHandler.m_quest_meta_info.QuestTaskGroupList.TryGetValue(quest_attribute.CurrentTaskNum, out var questTaskInfo)) { string err_msg = $"questBaseInfo.QuestTaskGroupList InvalidData CurrentTaskNum : {quest_attribute.CurrentTaskNum}"; result.setFail(ServerErrorCode.QuestInvalidValue, err_msg); return result; } questTaskUpdateHandler.m_quest_task_group = questTaskInfo; result = QuestMetaHelper.getQuestTaskEventGroupByEventString(questTaskInfo, active_event, out var questEventInfo); if(result.isFail()) return result; NullReferenceCheckHelper.throwIfNull(questEventInfo, () => $"questEventInfo is null !!!"); EQuestEventTargetType targetType = EnumHelper.convertEnumTypeAndValueStringToEnum(questEventInfo.EventTarget, EQuestEventTargetType.NONE); EQuestEventNameType nameType = EnumHelper.convertEnumTypeAndValueStringToEnum(questEventInfo.EventName, EQuestEventNameType.NONE); if (false == checkClientSideEvent(targetType, nameType)) { string err_msg = $"scriptDataList does not match EQuestEventTargetType questId : {quest_id}, targetType : {targetType.ToString()}, nameType : {nameType.ToString()}"; result.setFail(ServerErrorCode.QuestInvalidValue, err_msg); return result; } questTaskUpdateHandler.m_target_type = targetType; questTaskUpdateHandler.m_name_type = nameType; return result; } public bool checkClientSideEvent(EQuestEventTargetType target, EQuestEventNameType nameType) { if (target.Equals(EQuestEventTargetType.GUI) && nameType.Equals(EQuestEventNameType.POPUP)) return true; if (target.Equals(EQuestEventTargetType.CONCERT) && nameType.Equals(EQuestEventNameType.STARTED)) return true; if (target.Equals(EQuestEventTargetType.CONCERT) && nameType.Equals(EQuestEventNameType.ENDED)) return true; if (target.Equals(EQuestEventTargetType.CUTSCENE)) return true; if (target.Equals(EQuestEventTargetType.DIALOGUE)) return true; if (target.Equals(EQuestEventTargetType.MANNEQUIN) && nameType.Equals(EQuestEventNameType.USED)) return true; if (target.Equals(EQuestEventTargetType.MOVEMENT) && nameType.Equals(EQuestEventNameType.FEVER)) return true; if (target.Equals(EQuestEventTargetType.MOVEMENT)) return true; if (target.Equals(EQuestEventTargetType.NPC)) return true; if (target.Equals(EQuestEventTargetType.SOCIALACTION) && nameType.Equals(EQuestEventNameType.ACTIVED)) return true; if (target.Equals(EQuestEventTargetType.SPECIALGUIDE)) return true; if (target.Equals(EQuestEventTargetType.TAXI) && nameType.Equals(EQuestEventNameType.USED)) return true; if (target.Equals(EQuestEventTargetType.TRIGGER)) return true; if (target.Equals(EQuestEventTargetType.VIDEO)) return true; if (target.Equals(EQuestEventTargetType.INTERIORMODE) && nameType.Equals(EQuestEventNameType.STOPPED)) return true; if (target.Equals(EQuestEventTargetType.BEACONDIALOGUE) && nameType.Equals(EQuestEventNameType.SENDED)) return true; if (target.Equals(EQuestEventTargetType.BEACONDIALOGUE) && nameType.Equals(EQuestEventNameType.RECEIVED)) return true; if (target.Equals(EQuestEventTargetType.WAITING)) return true; if (target.Equals(EQuestEventTargetType.PROP) && nameType.Equals(EQuestEventNameType.SWITCHED)) return true; return false; } public async Task questTaskUpdate(QuestTaskUpdateHandler questTaskUpdateDataRef) { var result = new Result(); result = taskFunctionProgress(questTaskUpdateDataRef); if (result.isFail()) return result; result = await rewardUpdate(questTaskUpdateDataRef); if (result.isFail()) return result; result = await delteItemUpdate(questTaskUpdateDataRef); if (result.isFail()) return result; return result; } public override void onClear() { return; } } }