초기커밋

This commit is contained in:
2025-05-01 07:20:41 +09:00
commit 98bb2e3c5c
2747 changed files with 646947 additions and 0 deletions

View File

@@ -0,0 +1,218 @@
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}");
}
}
}
}

View File

@@ -0,0 +1,16 @@

namespace ServerCommon;
public abstract class QuestScriptValidatorBase : IQuestScriptValidator
{
protected QuestMetaValidateHandler m_handler { get; set; } = new();
public QuestScriptValidatorBase(QuestMetaValidateHandler handler)
{
m_handler = handler;
}
public abstract void init();
}

View File

@@ -0,0 +1,47 @@
using System.Text;
using Microsoft.Extensions.Primitives;
using ServerCore;
using ServerBase;
namespace ServerCommon;
/*
* Rule
* TASK, ACTIVED 1
* QUEST, COMPLETE (questId) 는 무조건 존재해야 한다.
*
*/
public class QuestValidatorForMustHave : QuestScriptValidatorBase
{
private UInt32 m_quest_id = 0;
public QuestValidatorForMustHave(QuestMetaValidateHandler handler, UInt32 questId) : base(handler)
{
m_quest_id = questId;
init();
}
public override void init()
{
StringBuilder str_builder_task = new();
str_builder_task
.Append(EQuestEventTargetType.TASK.ToString())
.Append(EQuestEventNameType.ACTIVED.ToString())
.Append("1");
m_handler.addEventChecker(str_builder_task.ToString());
StringBuilder str_builder_quest = new();
str_builder_quest
.Append(EQuestFunctionTargetType.QUEST.ToString())
.Append(EQuestFunctionNameType.COMPLETE.ToString())
.Append(m_quest_id.ToString());
m_handler.addFunctionChecker(str_builder_quest.ToString());
}
}

View File

@@ -0,0 +1,28 @@
using System.Text;
using Google.Protobuf.WellKnownTypes;
namespace ServerCommon;
public class QuestValidatorForNpcDialogueSet : QuestScriptValidatorBase
{
private string m_func_cond2 = string.Empty;
public QuestValidatorForNpcDialogueSet(QuestMetaValidateHandler handler, string funcCond2) : base(handler)
{
m_func_cond2 = funcCond2;
init();
}
public override void init()
{
StringBuilder dialogue_ended = new();
dialogue_ended.Append(EQuestEventTargetType.DIALOGUE.ToString()).Append(EQuestEventNameType.ENDED.ToString())
.Append(m_func_cond2);
m_handler.addEventChecker(dialogue_ended.ToString());
}
}

View File

@@ -0,0 +1,48 @@
using System.Text;
using Microsoft.Extensions.Primitives;
using ServerCore;
using ServerBase;
namespace ServerCommon;
/*
* TASK, ACTIVED 가 있으면
* TASK, TITLA_UPDATE, (TASKID)
* TASK, LOCATION
* 필수
*
*/
public class QuestValidatorForTaskActived : QuestScriptValidatorBase
{
private string m_event_cond1 = string.Empty;
public QuestValidatorForTaskActived(QuestMetaValidateHandler handler, string eventCond1) : base(handler)
{
m_event_cond1 = eventCond1;
init();
}
public override void init()
{
StringBuilder title_update = new();
title_update
.Append(EQuestFunctionTargetType.TASK.ToString())
.Append(EQuestFunctionNameType.TITLE_UPDATE.ToString())
.Append(m_event_cond1);
m_handler.addFunctionChecker(title_update.ToString());
// StringBuilder location = new();
// location
// .Append(EQuestFunctionTargetType.TASK.ToString())
// .Append(EQuestFunctionNameType.LOCATION.ToString());
// m_handler.addFunctionChecker(location.ToString());
}
}

View File

@@ -0,0 +1,24 @@
using System.Text;
namespace ServerCommon;
public class QuestValidatorForTriggerSet: QuestScriptValidatorBase
{
private string m_func_cond1 = string.Empty;
public QuestValidatorForTriggerSet(QuestMetaValidateHandler handler, string funcCond1) : base(handler)
{
m_func_cond1 = funcCond1;
init();
}
public override void init()
{
StringBuilder trigger_entered = new();
trigger_entered.Append(EQuestEventTargetType.TRIGGER.ToString()).Append(EQuestEventNameType.ENTERED.ToString())
.Append(m_func_cond1);
m_handler.addEventChecker(trigger_entered.ToString());
}
}