Files
2025-05-01 07:20:41 +09:00

218 lines
7.6 KiB
C#

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<string, int> m_event_checkers { get; } = new();
private ConcurrentDictionary<string, int> 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<ValidattionError> 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}");
}
}
}
}