using System.Collections.Concurrent; using System.Text; using Microsoft.Extensions.Primitives; using ServerCore; using ServerBase; namespace ServerCommon; /* * QustSript 체크후 * m_event_check_keys, m_function_check_keys 이 두 변수에 데이터가 남아 있으면 안된다. */ public class QuestMetaValidateHandler { private UInt32 m_quest_id { get; } = 0; private ConcurrentDictionary m_event_checkers { get; } = new(); private ConcurrentDictionary m_function_checkers { get; }= new(); public QuestMetaValidateHandler() { } public QuestMetaValidateHandler(UInt32 questId) { m_quest_id = questId; } //해당 이벤트가 체크되어야햘 항목에 있는지 확인하고 있으면 삭제 처리 public void checkEventTarget(string eventTarget, string eventName, string eventCond1, string eventCond2, string eventCond3) { StringBuilder str_builder = new(); if (eventTarget.Equals(EQuestEventTargetType.TASK.ToString()) && eventName.Equals(EQuestEventNameType.ACTIVED.ToString())) { str_builder.Append(eventTarget).Append(eventName).Append(eventCond1); } else if (eventTarget.Equals(EQuestEventTargetType.TRIGGER.ToString()) && eventName.Equals(EQuestEventNameType.ENTERED.ToString())) { str_builder.Append(eventTarget).Append(eventName).Append(eventCond1); } else if (eventTarget.Equals(EQuestEventTargetType.DIALOGUE.ToString()) && eventName.Equals(EQuestEventNameType.ENDED.ToString())) { str_builder.Append(eventTarget).Append(eventName).Append(eventCond1); } decreaseEventChecker(str_builder.ToString()); } //해당 펑션이 체크되어야햘 항목에 있는지 확인하고 있으면 삭제 처리 public void checkFuncTarget(string funcTarget, string funcName, string funcCond1, string funcCond2, string funcCond3) { StringBuilder str_builder = new(); if (funcTarget.Equals(EQuestFunctionTargetType.TASK.ToString()) && funcName.Equals(EQuestFunctionNameType.TITLE_UPDATE.ToString())) { str_builder.Append(funcTarget).Append(funcName).Append(funcCond1); } else if (funcTarget.Equals(EQuestFunctionTargetType.TASK.ToString()) && funcName.Equals(EQuestFunctionNameType.LOCATION.ToString())) { str_builder.Append(funcTarget).Append(funcName); } else if (funcTarget.Equals(EQuestFunctionTargetType.QUEST.ToString()) && funcName.Equals(EQuestFunctionNameType.COMPLETE.ToString())) { str_builder.Append(funcTarget).Append(funcName).Append(funcCond1); } decreaseFuncChecker(str_builder.ToString()); } //해당 이벤트 타겟에 대한 체크항목 생성 //여기에 계속 추가해야한다. public void makeEventTargetValidator(string eventTarget, string eventName, string eventCond1, string eventCond2, string eventCond3) { if (eventTarget.Equals(EQuestEventTargetType.TASK.ToString()) && eventName.Equals(EQuestEventNameType.ACTIVED.ToString())) { _ = new QuestValidatorForTaskActived(this, eventCond1); } } //해당 펑션 타겟에 대한 체크항목 생성 //여기에 계속 추가해야 한다. public void makeFuncTargetValidator(string funcTarget, string funcName, string funcCond1, string funcCond2, string funcCond3) { if (funcTarget.Equals(EQuestEventTargetType.TRIGGER.ToString()) && funcName.Equals(EQuestFunctionNameType.SET.ToString())) { _ = new QuestValidatorForTriggerSet(this, funcCond1); } else if (funcTarget.Equals(EQuestEventTargetType.NPC.ToString()) && funcName.Equals(EQuestFunctionNameType.DIALOGUE_SET.ToString())) { _ = new QuestValidatorForNpcDialogueSet(this, funcCond2); } } public void addEventChecker(string eventStr) { int update_cnt = 0; if (false == m_event_checkers.TryGetValue(eventStr, out var cnt)) { update_cnt = 1; m_event_checkers.TryAdd(eventStr, update_cnt); } else { update_cnt = ++cnt; m_event_checkers.AddOrUpdate(eventStr, update_cnt, (s, i) => update_cnt); } } public void decreaseEventChecker(string eventStr) { if (m_event_checkers.ContainsKey(eventStr)) { m_event_checkers.TryGetValue(eventStr, out var cnt); var update_cnt = --cnt; if (update_cnt <= 0) { m_event_checkers.TryRemove(eventStr, out _); } else { m_event_checkers.AddOrUpdate(eventStr, update_cnt, (s, i) => update_cnt); } } } public void addFunctionChecker(string functionStr) { int update_cnt = 0; if (false == m_function_checkers.TryGetValue(functionStr, out var cnt)) { update_cnt = 1; m_function_checkers.TryAdd(functionStr, update_cnt); } else { update_cnt = ++cnt; m_function_checkers.AddOrUpdate(functionStr, update_cnt, (s, i) => update_cnt); } } public void decreaseFuncChecker(string funcStr) { if (m_function_checkers.ContainsKey(funcStr)) { m_function_checkers.TryGetValue(funcStr, out var cnt); var update_cnt = --cnt; if (update_cnt <= 0) { m_function_checkers.TryRemove(funcStr, out _); } else { m_function_checkers.AddOrUpdate(funcStr, update_cnt, (s, i) => update_cnt); } } } public void remainDataCheck(ValidatorErrorCollection errors) { List error_list = new(); if (m_event_checkers.Keys.Count > 0) { foreach (var checker in m_event_checkers) { ValidattionError validation_error = new(); validation_error.Name = "Quest Script Event Validation Error"; validation_error.ArrayIndex = (int)m_quest_id; validation_error.Message = $"quest : {m_quest_id}, {checker.Key} is not checked, cnt : {checker.Value}"; error_list.Add(validation_error); } } if (m_function_checkers.Keys.Count > 0) { foreach (var checker in m_function_checkers) { ValidattionError validation_error = new(); validation_error.Name = "Quest Script Func Validation Error"; validation_error.ArrayIndex = (int)m_quest_id; validation_error.Message = $"quest : {m_quest_id}, {checker.Key} is not checked, cnt : {checker.Value}"; error_list.Add(validation_error); } } if (error_list.Count > 0) { //원래 검증 완료하면 여기에 추가를 해서 서버가 안뜨게 해야 되는게 맞는데 //지금 엑섹을 만들었다 지우면서 발생한 쓰레기 json이 퀘스트로 등록이 되는 상황이라 이런경우 어떠허게 처리해야될지 정리후에 //errors 로 넘긴다 //그 전까진 error log만 남긴다. //errors.Errors.TryAdd("Quest Script Error", error_list); foreach (var error in error_list) { Log.getLogger().warn($"[ Quest : {m_quest_id}] Script Validation Error : {error.Message}"); } } } }