218 lines
7.6 KiB
C#
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}");
|
|
}
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} |