using Amazon.DynamoDBv2.Model.Internal.MarshallTransformations; using GameServer; using Google.Protobuf.WellKnownTypes; using MetaAssets; using ServerCommon; using ServerCore; using ServerBase; using System; using System.Collections.Generic; using System.Runtime.Intrinsics.Arm; // TODO: spooky000 테이블 코드 교체 작업으로 인해 현재 안 쓰는 코드는 주석 처리해 둠. // questTaskFunctionProgress 함수 호출되지 않아 reward 관련 코드 주석 처리. namespace GameServer { public abstract class QuestBase : IQuest { public EQuestEventTargetType m_target_type; public EQuestEventNameType m_name_type; public int m_request_idx { get; set; } public string m_active_event_string { get; set; } = string.Empty; public string m_condition_1 { get; set; } = string.Empty; public string m_condition_2 { get; set; } = string.Empty; public string m_condition_3 { get; set; } = string.Empty; public QuestBase(EQuestEventTargetType targetType, EQuestEventNameType eventNameType, int requestIdx, string cond1, string cond2, string cond3) { m_target_type = targetType; m_name_type = eventNameType; m_request_idx = requestIdx; m_condition_1 = cond1; m_condition_2 = cond2; m_condition_3 = cond3; } public QuestBase(EQuestEventTargetType targetType, EQuestEventNameType eventNameType, string eventString, string cond1, string cond2, string cond3) { m_target_type = targetType; m_name_type = eventNameType; m_active_event_string = eventString; m_condition_1 = cond1; m_condition_2 = cond2; m_condition_3 = cond3; } public virtual bool checkValidTaskScript(QuestAttribute questAttribute, QuestTaskUpdateHandler questTaskUpdateHandler) { var quest_task = questTaskUpdateHandler.m_quest_task_group; var event_string = questTaskUpdateHandler.m_active_event; NullReferenceCheckHelper.throwIfNull(quest_task, () => $"quest_task is null !!!"); var result = QuestMetaHelper.getQuestTaskEventGroupByEventString(quest_task, event_string, out var events); if (result.isFail()) return false; NullReferenceCheckHelper.throwIfNull(events, () => $"events is null !!!"); if (!events.EventTarget.Equals(m_target_type.ToString()) || !events.EventName.Equals(m_name_type.ToString())) return false; bool subCheck = checkSubValidTaskScript(questAttribute, events); return subCheck; } public virtual bool checkSubValidTaskScript(QuestAttribute questAttribute, QuestEventInfo events) { return true; } public virtual async Task postProcess(Player player, QuestTaskUpdateHandler questTaskUpdateHandler) { await Task.CompletedTask; return new Result(); } public virtual Result questTaskFunctionProgress(Player player, ref QuestTaskUpdateHandler questTaskUpdateHandler) { var quest_action = player.getEntityAction(); var quest_id = questTaskUpdateHandler.m_quest_id; var quest = questTaskUpdateHandler.m_quest; NullReferenceCheckHelper.throwIfNull(quest, () => $"quest is null !!!"); var quest_attribute = quest.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(quest_attribute, () => $"quest_attribute is null !!!"); var active_evnet = questTaskUpdateHandler.m_active_event; var quest_task_group = questTaskUpdateHandler.m_quest_task_group; NullReferenceCheckHelper.throwIfNull(quest_task_group, () => $"quest_task_group is null !!!"); var result = QuestMetaHelper.getQuestTaskEventGroupByEventString(quest_task_group, active_evnet, out var questEventInfo); if(result.isFail()) return result; NullReferenceCheckHelper.throwIfNull(questEventInfo, () => $"questEventInfo is null !!!"); result = functionCheck(player, questEventInfo, quest_attribute, ref questTaskUpdateHandler); if (result.isFail()) return result; quest_attribute.ActiveEvents.Remove(active_evnet); //패러럴일경우 문자열을 가지고 있는다. if (quest_task_group.EventStringList.Count >= 2) { string str = MetaData.Instance.makeEventScriptStringByEventInfo(questEventInfo); quest_attribute.CompletedIdxStrings.Add(str); } return result; } private Result functionCheck(Player player, QuestEventInfo questEventInfo, QuestAttribute quest_attribute, ref QuestTaskUpdateHandler questTaskUpdateHandler) { var result = new Result(); foreach (var funcInfo in questEventInfo.QuestEventFunctionList) { if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.QUEST)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.COMPLETE))) { quest_attribute.IsComplete = true ? 1 : 0; quest_attribute.ActiveEvents.Clear(); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.COUNTER)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.INCREASE))) { int counter = int.Parse(funcInfo.FunctionCondition1); quest_attribute.CurrentCounter += counter; questTaskUpdateHandler.m_need_counter_check = true; } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.TASK)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.COMPLETE))) { quest_attribute.CurrentTaskComplete = 1; } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.TASK)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.ACTIVE))) { questTaskUpdateHandler.m_next_task_number = int.Parse(funcInfo.FunctionCondition1); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.REWARD)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.SET))) { quest_attribute.ReplacedRewardGroupId = int.Parse(funcInfo.FunctionCondition1); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.TIMER)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.START))) { quest_attribute.HasTimer = 1; if (long.TryParse(funcInfo.FunctionCondition1, out long elapsedTime) == false) { Log.getLogger().error($"{funcInfo.FunctionCondition1} is not number"); elapsedTime = 10000000; } DateTime now = DateTime.UtcNow; quest_attribute.TimerCompleteTime = now.AddSeconds(elapsedTime); QuestManager.It.m_timer_check_users.TryAdd(player.getUserGuid(), string.Empty); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.ITEM)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.GIVE))) { (result, var reward) = RewardManager.It.makeRewardFromItemStr(funcInfo.FunctionCondition1, funcInfo.FunctionCondition2); if (result.isFail()) return result; NullReferenceCheckHelper.throwIfNull(reward, () => $"reward is null !!!"); questTaskUpdateHandler.m_rewards.Add(reward); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.ITEM)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.DELETE))) { if (false == int.TryParse(funcInfo.FunctionCondition1, out int delete_item_id)) { string err_msg = $"delete item id is not number : {funcInfo.FunctionCondition1}"; result.setFail(ServerErrorCode.ItemParsingFromStringToIntErorr, err_msg); Log.getLogger().error(result.toBasicString()); return result; } if (false == int.TryParse(funcInfo.FunctionCondition2, out int delete_item_cnt)) { string err_msg = $"delete item id is not number : {funcInfo.FunctionCondition2}"; result.setFail(ServerErrorCode.ItemParsingFromStringToIntErorr, err_msg); Log.getLogger().error(result.toBasicString()); return result; } questTaskUpdateHandler.m_deletable_items.TryAdd(delete_item_id, delete_item_cnt); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.REWARD)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.GIVE))) { (var resutlt, var reward_metas) = RewardManager.It.makeRewardsInfo(funcInfo.FunctionCondition1); if (resutlt.isFail()) { return resutlt; } NullReferenceCheckHelper.throwIfNull(reward_metas, () => $"reward_metas is null !!!"); foreach (var meta in reward_metas) { questTaskUpdateHandler.m_rewards.Add(meta.Reward); } } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.QUEST)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.ASSIGN))) { questTaskUpdateHandler.m_last_check_functions.Add(funcInfo); } else if (funcInfo.FunctionTarget.Equals(nameof(EQuestFunctionTargetType.PROP)) && funcInfo.FunctionName.Equals(nameof(EQuestFunctionNameType.SWITCH))) { questTaskUpdateHandler.m_last_check_functions.Add(funcInfo); } } return result; } } }