Compare commits

..

3 Commits

66 changed files with 778 additions and 1044 deletions

View File

@ -2,10 +2,6 @@
cmake-build-debug/ cmake-build-debug/
cmake-build-release/ cmake-build-release/
# IDE folders
.vscode/
.idea/
# Dockerfile (in order to allow changes without rebuilding) # Dockerfile (in order to allow changes without rebuilding)
Dockerfile Dockerfile

580
.idea/editor.xml generated
View File

@ -1,580 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="BackendCodeEditorSettings">
<option name="/Default/CodeStyle/CodeFormatting/CppClangFormat/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/EditorConfig/EnableClangFormatSupport/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_BINARY_EXPRESSIONS_CHAIN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_CALLS_CHAIN/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXPRESSION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_FOR_STMT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTIPLE_DECLARATION/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_TERNARY/@EntryValue" value="ALIGN_ALL" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_CLASS_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_BLANK_LINES_IN_CODE/@EntryValue" value="2" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/KEEP_USER_LINEBREAKS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CASE_FROM_SWITCH/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_COMMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INT_ALIGN_EQ/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SIMPLE_BLOCK_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COMMA_IN_TEMPLATE_PARAMS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_SEMICOLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_SEMICOLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_UNARY_OPERATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_ARRAY_ACCESS_BRACKETS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_METHOD_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_INITIALIZER_BRACES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPECIAL_ELSE_IF_TREATMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_CAST_EXPRESSION_PARENTHESES/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_BINARY_OPSIGN/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_TERNARY_OPSIGNS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TYPE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/OTHER_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CASE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DECLARATION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_FUNCTION_DEFINITION/@EntryValue" value="1" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_WHILE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_ELSE_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_CATCH_ON_NEW_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_INDENTATION/@EntryValue" value="All" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_ARGUMENT/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_EXTENDS_LIST/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_PARAMETER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_ARGUMENT/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ALIGN_MULTILINE_TYPE_PARAMETER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BLANK_LINES_AROUND_DECLARATIONS/@EntryValue" value="0" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_ACCESS_SPECIFIERS_FROM_CLASS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_CLASS_MEMBERS_FROM_ACCESS_SPECIFIERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/LINE_BREAK_AFTER_COLON_IN_MEMBER_INITIALIZER_LISTS/@EntryValue" value="ON_SINGLE_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/MEMBER_INITIALIZER_LIST_STYLE/@EntryValue" value="DO_NOT_CHANGE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/PLACE_NAMESPACE_DEFINITIONS_ON_SAME_LINE/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_COLON_IN_BITFIELD_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_EXTENDS_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_FOR_COLON/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_FOR_COLON/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_PTR_IN_NESTED_DECLARATOR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBER/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_DATA_MEMBERS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_AFTER_REF_IN_METHOD/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_PTR_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_ABSTRACT_DECL/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBER/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_DATA_MEMBERS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_REF_IN_METHOD/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BEFORE_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_BETWEEN_CLOSING_ANGLE_BRACKETS_IN_TEMPLATE_ARGS/@EntryValue" value="true" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_ARGS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_TEMPLATE_PARAMS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_DECLARATION_PARENTHESES/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/SPACE_WITHIN_EMPTY_BLOCKS/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_INVOCATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_INVOCATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_AFTER_DECLARATION_LPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_BEFORE_DECLARATION_RPAR/@EntryValue" value="false" type="bool" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_ARGUMENTS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/WRAP_PARAMETERS_STYLE/@EntryValue" value="WRAP_IF_LONG" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/BREAK_TEMPLATE_DECLARATION/@EntryValue" value="LINE_BREAK" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/NAMESPACE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/FREE_BLOCK_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INVOCABLE_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/ANONYMOUS_METHOD_DECLARATION_BRACES/@EntryValue" value="END_OF_LINE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INITIALIZER_BRACES/@EntryValue" value="END_OF_LINE_NO_SPACE" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_STYLE/@EntryValue" value="Space" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/INDENT_SIZE/@EntryValue" value="4" type="int" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/CONTINUOUS_LINE_INDENT/@EntryValue" value="Double" type="string" />
<option name="/Default/CodeStyle/CodeFormatting/CppFormatting/TAB_WIDTH/@EntryValue" value="4" type="int" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSmartPointerVsMakeFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCStyleCast/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionalStyleCast/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReinterpretCastFromVoidPtr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConvertingConstructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExplicitConversionOperator/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDiscardedPostfixOperatorResult/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstValueFunctionReturnType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberFunctionMayBeStatic/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConst/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVariableCanBeMadeConstexpr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterMayBeConstPtrOrRef/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPassValueParameterByConstReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppThrowExpressionCanBeReplacedWithRethrow/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroConstantCanBeReplacedWithNullptr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCompileTimeConstantCanBeReplacedWithBooleanConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIfCanBeReplacedByConstexprIf/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IfStdIsConstantEvaluatedCanBeReplaced/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StdIsConstantEvaluatedWillAlwaysEvaluateToConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=ConstevalIfIsAlwaysConstant/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassCanBeFinal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStructuredBinding/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseTypeTraitAlias/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAlgorithmWithCount/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseRangeAlgorithm/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseElementsView/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseStdSize/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForLoopCanBeReplacedWithWhile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppJoinDeclarationAndAssignment/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceTieWithStructuredBinding/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReplaceMemsetWithZeroInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAssociativeContains/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseEraseAlgorithm/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseFamiliarTemplateSyntaxForGenericLambdas/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTooWideScopeInitStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantNamespaceDefinition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineFunctionDefinitionInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonInlineVariableDefinitionInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionIsNotImplemented/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrivateSpecialMemberFunctionIsNotImplemented/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHiddenFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHidingFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPolymorphicClassWithNonVirtualPublicDestructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractClassWithoutSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompleteSwitchStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultCaseNotHandledInSwitchStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyErroneousEmptyStatements/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExpressionWithoutSideEffects/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNoDiscardExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionResultShouldBeUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingKeywordThrow/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTypeWithoutTypenameKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDependentTemplateWithoutTemplateKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppImplicitDefaultConstructorNotAvailable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeedsConstructorBecauseOfUninitializedMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedNonStaticDataMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRangeBasedForIncompatibleReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppZeroValuedExpressionUsedAsNullPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUnintendedObjectSlicing/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPossiblyUninitializedMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorDisambiguatedAsFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionInFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMustBePublicVirtualToImplementInterface/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationSpecifierWithoutDeclarators/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEmptyDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesLocal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclarationHidesUncapturedLocal/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMismatchedClassTags/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUsingResultOfAssignmentAsCondition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIntegralToPointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerToIntegralConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIncompatiblePointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPointerConversionDropsQualifiers/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStringLiteralToCharPointerConversion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNonExceptionSafeResourceAcquisition/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVirtualFunctionCallInsideCtor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractVirtualFunctionCallInCtor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInvalidLineContinuation/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfBadFormat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfRiskyFormat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfMissedArg/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrintfExtraArg/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatBadCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatLegacyCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatMixedArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooFewArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBoostFormatTooManyArgs/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedEntity/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMissingIncludeGuard/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenSyntaxError/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUnresolvedReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDoxygenUndocumentedParameter/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeletingVoidPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppBooleanIncrementExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeprecatedRegisterStorageClassSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppIdenticalOperandsInBinaryExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEqualOperandsInBinaryExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedefinitionOfDefaultArgumentInOverrideFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnamedNamespaceInHeaderFile/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNamesMismatch/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultedSpecialMemberFunctionIsImplicitlyDeleted/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNodiscardFunctionWithoutReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantComplexityInComparison/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAbstractFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSpecialFunctionWithoutNoexceptSpecification/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnsignedZeroComparison/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterLiteral/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMultiCharacterWideLiteral/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantQualifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantAccessSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAccessSpecifierWithNoDeclarations/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTypenameKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElseKeywordInsideCompoundStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantControlFlowJump/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyStatement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantEmptyDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantParentheses/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantLambdaParameterList/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantCastExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppHeaderHasBeenAlreadyIncluded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateArgumentsCanBeDeduced/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantTemplateArguments/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticSpecifierOnAnonymousNamespaceMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnMemberAllocationFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantStaticSpecifierOnThreadLocalLocalVariable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassAccessSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantInlineSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConstSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBooleanExpressionArgument/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantVoidArgumentList/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantMemberInitializer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantBaseClassInitializer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConstParameterInDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppVolatileParameterInDeclaration/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalFunctionInFinalClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFinalNonOverridingVirtualFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantElaboratedTypeSpecifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantDereferencingAndTakingAddress/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantConditionalExpression/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConditionalExpressionCanBeSimplified/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantExportKeyword/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRedundantZeroInitializerInAggregateInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUserDefinedLiteralSuffixDoesNotStartWithUnderscore/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassIsIncomplete/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterShadowing/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMutableSpecifierOnReferenceMember/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultInitializationWithNoUserConstructor/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppExplicitSpecializationInNonNamespaceScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnionMemberOfReferenceType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUninitializedDependentBaseClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderIsNotIncluded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppPrecompiledHeaderNotFound/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCoroutineCallResolveError/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppAwaiterTypeIsNotClass/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppOutParameterMustBeWritten/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWarningDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticAssertFailure/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEvaluationFailure/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTypeAliasNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppConceptNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppClassNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnumeratorNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLambdaCaptureNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableWithNonTrivialDtorIsNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppParameterNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTemplateParameterNeverUsed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityAssignedButNoRead/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEntityUsedOnlyInUnevaluatedContext/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLocalVariableMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppObjectMemberMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppSomeObjectMembersMightNotBeInitialized/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexedValue" value="ERROR" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDeclaratorUsedBeforeInitialization/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnusedIncludeDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppNotAllPathsReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CDeclarationWithImplicitIntType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppFunctionDoesntReturnValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppReturnNoValueInNonVoidFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppCVQualifierCanNotBeAppliedToReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDereferenceOperatorLimitExceeded/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppForwardEnumDeclarationWithoutUnderlyingType/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaRegionDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnmatchedPragmaEndRegionDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppStaticDataMemberInUnnamedStruct/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDefaultIsUsedAsIdentifier/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppLongFloat/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtReinterpretCastFromNullptr/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtBindingRValueToLvalueReference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtAddressOfClassRValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtDoubleUserConversionInCopyInit/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtCopyElisionInCopyInitDeclarator/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMsExtNotInitializedStaticConstLocalVar/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppRemoveRedundantBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceIfStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceForStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceWhileStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceDoStatementBraces/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongIncludesOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppWrongSlashesInIncludeDirective/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceNestedNamespacesStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceTypeAliasCodeStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceFunctionDeclarationStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppMemberInitializersOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingFunctionStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexedValue" value="SUGGESTION" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceOverridingDestructorStyle/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAuto/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUseAutoForNumeric/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersPlacement/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppEnforceCVQualifiersOrder/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppUnnecessaryWhitespace/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppTabsAreDisallowed/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantConditions/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANullDereference/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFANotInitializedField/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALoopConditionNotUpdated/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFADeletedPointer/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAMemoryLeak/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInvalidatedMemory/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesScope/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFALocalValueEscapesFunction/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantParameter/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAConstantFunctionResult/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAArrayIndexOutOfBounds/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableCode/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreachableFunctionCall/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAEndlessLoop/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAInfiniteRecursion/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnusedValue/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexedValue" value="WARNING" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFAUnreadVariable/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexedValue" value="HINT" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppDFATimeOver/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CppInconsistentNaming/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=StringLiteralTypo/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=CommentTypo/@EntryIndexRemoved" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexedValue" value="DO_NOT_SHOW" type="string" />
<option name="/Default/CodeInspection/Highlighting/InspectionSeverities/=IdentifierTypo/@EntryIndexRemoved" />
</component>
</project>

6
.idea/encodings.xml generated
View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>

3
.idea/misc.xml generated
View File

@ -1,8 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="CMakePythonSetting">
<option name="pythonIntegrationState" value="YES" />
</component>
<component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" /> <component name="CMakeWorkspace" PROJECT_DIR="$PROJECT_DIR$" />
<component name="CidrRootsConfiguration"> <component name="CidrRootsConfiguration">
<excludeRoots> <excludeRoots>

View File

@ -1,8 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Test Server" type="CompoundRunConfigurationType">
<toRun name="auth" type="CMakeRunConfiguration" />
<toRun name="db" type="CMakeRunConfiguration" />
<toRun name="game" type="CMakeRunConfiguration" />
<method v="2" />
</configuration>
</component>

View File

@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="auth" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$PROJECT_DIR$/test/auth" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Metin2 Server" TARGET_NAME="game" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Metin2 Server" RUN_TARGET_NAME="game">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="db" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$PROJECT_DIR$/test/db" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Metin2 Server" TARGET_NAME="db" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Metin2 Server" RUN_TARGET_NAME="db">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,7 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="game" type="CMakeRunConfiguration" factoryName="Application" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" EMULATE_TERMINAL="false" WORKING_DIR="file://$PROJECT_DIR$/test/game" PASS_PARENT_ENVS_2="true" PROJECT_NAME="Metin2 Server" TARGET_NAME="game" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="Metin2 Server" RUN_TARGET_NAME="game">
<method v="2">
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@ -1,4 +1,4 @@
FROM ubuntu:22.04 AS build FROM ubuntu:22.04 as build
WORKDIR /app WORKDIR /app
# Set up the CMake repository # Set up the CMake repository
@ -17,7 +17,7 @@ ENV VCPKG_FORCE_SYSTEM_BINARIES=1
# Install vcpkg and the required libraries # Install vcpkg and the required libraries
RUN git clone https://github.com/Microsoft/vcpkg.git RUN git clone https://github.com/Microsoft/vcpkg.git
RUN bash ./vcpkg/bootstrap-vcpkg.sh RUN bash ./vcpkg/bootstrap-vcpkg.sh
RUN ./vcpkg/vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2 RUN ./vcpkg/vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog argon2
COPY . . COPY . .
@ -26,10 +26,10 @@ RUN mkdir build/
RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake .. RUN cd build && cmake -DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake ..
RUN cd build && make -j $(nproc) RUN cd build && make -j $(nproc)
FROM ubuntu:22.04 AS app FROM ubuntu:22.04 as app
WORKDIR /app WORKDIR /app
RUN apt-get update && apt-get install -y gettext python2 libdevil-dev libbsd-dev && apt-get clean RUN apt-get update && apt-get install -y python2 libdevil-dev libbsd-dev && apt-get clean
# Copy the binaries from the build stage # Copy the binaries from the build stage
COPY --from=build /app/build/src/db/db /bin/db COPY --from=build /app/build/src/db/db /bin/db
@ -39,9 +39,6 @@ COPY --from=build /app/build/src/quest/qc /bin/qc
# Copy the game files # Copy the game files
COPY ./gamefiles/ . COPY ./gamefiles/ .
# Copy the auxiliary files
COPY ./docker/ .
# Compile the quests # Compile the quests
RUN cd /app/data/quest && python2 make.py RUN cd /app/data/quest && python2 make.py
@ -51,9 +48,3 @@ RUN ln -s ./conf/item_names_en.txt item_names.txt
RUN ln -s ./conf/item_proto.txt item_proto.txt RUN ln -s ./conf/item_proto.txt item_proto.txt
RUN ln -s ./conf/mob_names_en.txt mob_names.txt RUN ln -s ./conf/mob_names_en.txt mob_names.txt
RUN ln -s ./conf/mob_proto.txt mob_proto.txt RUN ln -s ./conf/mob_proto.txt mob_proto.txt
# Set up default environment variables
ENV PUBLIC_BIND_IP=0.0.0.0
ENV INTERNAL_BIND_IP=0.0.0.0
ENTRYPOINT ["/usr/bin/bash", "docker-entrypoint.sh"]

View File

@ -7,34 +7,14 @@ For-profit usage of this material is certainly illegal without the proper
licensing agreements and is hereby discouraged (not legal advice). Even so, the licensing agreements and is hereby discouraged (not legal advice). Even so, the
nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now. nature of this project is HIGHLY EXPERIMENTAL - bugs are to be expected for now.
## 1. Usage ## 1. Building and usage
### A. Use Docker to instantly bring up a server (recommended)
We aim to provide Docker images which _just work_ for your convenience. We aim to provide Docker images which _just work_ for your convenience.
A Docker Compose project is maintained in the [Deployment project](https://git.old-metin2.com/metin2/deploy). A Docker Compose project is maintained in the [Deployment project](https://git.old-metin2.com/metin2/deploy).
Please head over there for further instructions. Please head over there for further instructions.
## 2. Building ### B. Build the binaries yourself (for advanced users)
### A. Building Docker images
#### Building a Docker image from the repository
In order to build a local Docker image on your local architecture, just build the
provided Dockerfile in this project:
```shell
docker build -t metin2/server:test --provenance=false .
```
#### Publishing a multiplatform Docker image manually
This command is reserved only for repository maintainers in order to publish
new Docker images for public use with the Deployment project.
**WARNING:** Using WSL for building might lead to QEMU segmentation fault issues;
this can be worked around by using `binfmt` and `qemu-user-static` as described
[here](https://github.com/docker/buildx/issues/1170#issuecomment-1159350550).
```shell
docker build --push -t git.old-metin2.com/metin2/server:<IMAGE-TAG-HERE> --platform linux/amd64,linux/arm64 --provenance=false .
```
### B. Building the binaries yourself (for advanced users)
_Sadly, we're unable to provide hand-holding services. You should have some C++ development experience _Sadly, we're unable to provide hand-holding services. You should have some C++ development experience
going forward with this route._ going forward with this route._
@ -43,7 +23,6 @@ variety. This project is also compatible with WSL, even though WSL can be buggy
at times. FreeBSD/Windows compatibility is untested and unsupported for the at times. FreeBSD/Windows compatibility is untested and unsupported for the
time being - there are other projects out there if that's what you want. time being - there are other projects out there if that's what you want.
#### Setting up the requirements
On your Linux box, install the dependencies for `vcpkg` and the other libraries On your Linux box, install the dependencies for `vcpkg` and the other libraries
we're going to install. we're going to install.
```shell ```shell
@ -56,25 +35,22 @@ Also install DevIL (1.7.8) and the BSD compatibility library:
apt-get install -y libdevil-dev libbsd-dev apt-get install -y libdevil-dev libbsd-dev
``` ```
Install `vcpkg` according to the [latest instructions](https://vcpkg.io/en/getting-started.html). Install `vcpkg` according to the [lastest instructions](https://vcpkg.io/en/getting-started.html).
Build and install the required libraries: Build and install the required libraries:
```shell ```shell
vcpkg install cryptopp effolkronium-random libmariadb libevent lzo fmt spdlog argon2 vcpkg install boost-system cryptopp effolkronium-random libmysql libevent lzo fmt spdlog argon2
``` ```
#### Building the binaries Then, it's time to build your binaries. Your commands should look along the lines of:
Instead of building the binaries directly from the CLI, we recommend using an IDE, since
you're probably doing some kind of development anyway. See the "Development" section for more information on that.
If you decide do build from the command line, make sure to find the right path for `vcpkg.cmake` and run the following:
```shell ```shell
mkdir build/ mkdir build/
cd build && cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake .. cd build && cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/vcpkg/scripts/buildsystems/vcpkg.cmake ..
make -j $(nproc) make -j $(nproc)
``` ```
If everything goes right, you should now have compiled binaries in the `build/` directory. If everything goes right, you should now have compiled binaries you should just be able to use
as a drop-in replacement for your BSD binaries in your favourite serverfiles.
## 2. Development ## 2. Development
The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/), The preferred IDE in order to develop and debug the server is [CLion](https://www.jetbrains.com/clion/),
@ -92,21 +68,6 @@ in order to start them at once.
5. Of course, you'll need a MySQL 5.x database, Valgrind and any other development 5. Of course, you'll need a MySQL 5.x database, Valgrind and any other development
goodies you wish. Also, a lot of time. goodies you wish. Also, a lot of time.
### Creating a minimal test server (WIP)
In CLion, create a `test` directory containing the `auth`, `db`, and `game`
directories, and then symlink the following files in the `gamefiles` directory.
```shell
ln -s ../../gamefiles/conf/item_names_en.txt ./test/db/item_names.txt
ln -s ../../gamefiles/conf/item_proto.txt ./test/db/item_proto.txt
ln -s ../../gamefiles/conf/mob_names_en.txt ./test/db/mob_names.txt
ln -s ../../gamefiles/conf/mob_proto.txt ./test/db/mob_proto.txt
ln -s ../../gamefiles/data ./test/auth/data
ln -s ../../gamefiles/data ./test/game/data
```
## 3. Improvements ## 3. Improvements
### Major improvements ### Major improvements
- The binaries run on 64-bit Linux with the network stack being partially rewritten in Libevent. - The binaries run on 64-bit Linux with the network stack being partially rewritten in Libevent.
@ -118,7 +79,7 @@ ln -s ../../gamefiles/data ./test/game/data
- Removed unused functionalities (time bombs, activation servers, other Korean stuff) - Removed unused functionalities (time bombs, activation servers, other Korean stuff)
- Switched to the [effolkronium/random PRNG](https://github.com/effolkronium/random) instead of the standard C functions. - Switched to the [effolkronium/random PRNG](https://github.com/effolkronium/random) instead of the standard C functions.
- Refactored macros to modern C++ functions. - Refactored macros to modern C++ functions.
- Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `game.conf` file. (Might need further work) - Network settings are manually configurable through the `PUBLIC_IP`, `PUBLIC_BIND_IP`, `INTERNAL_IP`, `INTERNAL_BIND_IP` settings in the `CONFIG` file. (Might need further work)
- Refactored logging to use [spdlog](https://github.com/gabime/spdlog) for more consistent function calls. - Refactored logging to use [spdlog](https://github.com/gabime/spdlog) for more consistent function calls.
- Refactored login code to use Argon2ID. - Refactored login code to use Argon2ID.
@ -141,7 +102,8 @@ This is a very serious security risk and one of the reasons this project is stil
- Fixed buffer overruns and integer overflows in SQL queries. - Fixed buffer overruns and integer overflows in SQL queries.
## 5. Further plans ## 5. Further plans
- Migrate `db.conf` and `game.conf` to a modern dotenv-like format, which would enable pretty nice Docker images. - Migrate `conf.txt` and `CONFIG` to a modern dotenv-like format, which would enable pretty nice Docker images.
- Add a health check to the Docker image.
- Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting. - Use the [fmt](https://fmt.dev/latest/index.html) library for safe and modern string formatting.
- Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server. - Handle kernel signals (SIGTERM, SIGHUP etc.) for gracefully shutting down the game server.
- Improve memory safety. - Improve memory safety.

View File

@ -1,18 +0,0 @@
WELCOME_MSG = "DB Server has been started"
SQL_ACCOUNT = "${MYSQL_HOST} ${MYSQL_DB_ACCOUNT} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
SQL_COMMON = "${MYSQL_HOST} ${MYSQL_DB_COMMON} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
SQL_PLAYER = "${MYSQL_HOST} ${MYSQL_DB_PLAYER} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_PORT}"
TABLE_POSTFIX = ""
BIND_PORT = ${DB_PORT}
DB_SLEEP_MSEC = 10
CLIENT_HEART_FPS = 10
HASH_PLAYER_LIFE_SEC = 600
BACKUP_LIMIT_SEC = 3600
PLAYER_ID_START = 100
PLAYER_DELETE_LEVEL_LIMIT = 70
ITEM_ID_RANGE = 10000001 20000000
TEST_SERVER = ${TEST_SERVER}

View File

@ -1,42 +0,0 @@
HOSTNAME: ${GAME_HOSTNAME}
CHANNEL: ${GAME_CHANNEL}
PUBLIC_IP: ${PUBLIC_IP}
PUBLIC_BIND_IP: ${PUBLIC_BIND_IP}
INTERNAL_IP: ${INTERNAL_IP}
INTERNAL_BIND_IP: ${INTERNAL_BIND_IP}
PORT: ${GAME_PORT}
P2P_PORT: ${GAME_P2P_PORT}
DB_ADDR: ${DB_ADDR}
DB_PORT: ${DB_PORT}
COMMON_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_COMMON} ${MYSQL_PORT}
LOG_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_LOG} ${MYSQL_PORT}
PLAYER_SQL: ${MYSQL_HOST} ${MYSQL_USER} ${MYSQL_PASSWORD} ${MYSQL_DB_PLAYER} ${MYSQL_PORT}
TABLE_POSTFIX:
AUTH_SERVER: ${GAME_AUTH_SERVER}
MARK_SERVER: ${GAME_MARK_SERVER}
MAP_ALLOW: ${GAME_MAP_ALLOW}
MAX_LEVEL: ${GAME_MAX_LEVEL}
PK_PROTECT_LEVEL: 15
SPAM_BLOCK_MAX_LEVEL: 90
GOLD_DROP_LIMIT_TIME: 10
WEB_APP_URL: ${WEB_APP_URL}
WEB_APP_KEY: ${WEB_APP_KEY}
CHECK_MULTIHACK: 0
SPEEDHACK_LIMIT_COUNT: 300
SPEEDHACK_LIMIT_BONUS: 80
ADMINPAGE_IP: 127.0.0.1
ADMINPAGE_PASSWORD: metin2adminpass
PASSES_PER_SEC: 25
SAVE_EVENT_SECOND_CYCLE: 180
PING_EVENT_SECOND_CYCLE: 180
VIEW_RANGE: 8000
TEST_SERVER: ${TEST_SERVER}

View File

@ -1,9 +0,0 @@
#!/bin/sh
# docker-entrypoint.sh
# Generate configuration files based on environment variables
envsubst <"/app/conf/db.conf.tmpl" >"/app/db.conf"
envsubst <"/app/conf/game.conf.tmpl" >"/app/game.conf"
# Run the standard container command.
exec "$@"

View File

@ -0,0 +1,146 @@
#######################################
# Main Quests
# 0
0 main_quest_lv1
0 main_quest_lv2
0 main_quest_lv3
0 main_quest_lv6
0 main_quest_lv7
0 main_quest_lv9
0 main_quest_lv10
0 main_quest_lv12
0 main_quest_lv14
0 main_quest_lv15
0 main_quest_lv16
0 main_quest_lv27
0 main_quest_lv30
0 main_quest_lv32
0 main_quest_lv40
0 main_quest_lv47
0 main_quest_lv50
0 main_quest_lv55
0 main_quest_lv60
0 main_quest_lv66
0 main_quest_lv72
0 main_quest_lv78
0 main_quest_lv84
0 main_quest_lv90
0 main_quest_lv91
0 main_quest_lv92
0 main_quest_lv93
0 main_quest_lv94
0 main_quest_lv95
0 main_quest_lv96
0 main_quest_lv97
0 main_quest_lv98
0 main_quest_flame_lv99
0 main_quest_flame_lv100
0 main_quest_flame_lv101
0 main_quest_flame_lv102
0 main_quest_flame_lv103
0 main_quest_flame_lv104
0 main_quest_flame_lv105
#######################################
# Side Quests
# 1
1 new_quest_premium_lv4
1 subquest_1
1 subquest_2
1 subquest_3
1 subquest_4
1 subquest_5
1 subquest_6
1 subquest_7
1 subquest_8
1 subquest_9
1 subquest_10
1 subquest_11
1 subquest_12
1 subquest_13
1 subquest_15
1 subquest_16
1 subquest_17
1 subquest_18
1 subquest_19
1 subquest_20
1 subquest_21
1 subquest_22
1 subquest_23
1 subquest_24
1 subquest_25
1 subquest_26
1 subquest_27
1 subquest_30
1 subquest_31
1 subquest_32
1 subquest_33
1 subquest_34
1 subquest_36
1 subquest_37
1 subquest_38
1 subquest_39
1 subquest_40
1 subquest_41
1 subquest_42
1 subquest_44
1 subquest_45
1 subquest_46
1 subquest_47
1 subquest_48
1 subquest_49
1 new_quest_lv7
1 new_quest_lv17
1 new_quest_lv22
1 new_quest_lv26
1 new_quest_lv28
1 new_quest_lv29
1 new_quest_lv42
1 new_quest_lv43
1 new_quest_lv52
1 new_quest_lv54
1 new_quest_lv75
1 new_quest_lv80
#######################################
# Hunting Mission
# 2
#######################################
# Event Mission
# 3
#######################################
# Biologist Quests
# 4
4 make_herb_lv4
4 make_herb_lv7
4 make_herb_lv10
4 make_herb_lv15
4 make_herb_lv20
4 make_herb_lv25
4 collect_quest_lv30
4 collect_quest_lv40
4 collect_quest_lv50
4 collect_quest_lv60
4 collect_quest_lv70
4 collect_quest_lv80
4 collect_quest_lv85
4 collect_quest_lv90
4 collect_quest_lv92
4 collect_quest_lv94
#######################################
# Game Mission
# 5
5 find_brother_article
5 find_squareguard
5 find_senior_soldier
#######################################
# Mission Book Quests
# 6
#######################################
# Daily Quests
# 7

View File

@ -46,7 +46,7 @@ Mysql-Funktion der neuesten Generation.
--]] --]]
mysql_query = function(query) mysql_query = function(query)
if not pre then if not pre then
local rt = io.open('game.conf','r'):read('*all') local rt = io.open('CONFIG','r'):read('*all')
pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4') pre,_= string.gsub(rt,'.+PLAYER_SQL:%s(%S+)%s(%S+)%s(%S+)%s(%S+).+','-h%1 -u%2 -p%3 -D%4')
end end
math.randomseed(os.time()) math.randomseed(os.time())

View File

@ -3,4 +3,5 @@
//#define __AUCTION__ //#define __AUCTION__
#define __PET_SYSTEM__ #define __PET_SYSTEM__
#define __QUEST_RENEWAL__ // Quest Page Renewal by Owsap
#endif #endif

View File

@ -1,4 +1,5 @@
#pragma once #ifndef __INC_METIN_II_STL_H__
#define __INC_METIN_II_STL_H__
#include <vector> #include <vector>
#include <string> #include <string>
@ -18,15 +19,15 @@
inline void stl_lowers(std::string& rstRet) inline void stl_lowers(std::string& rstRet)
{ {
for (size_t i = 0; i < rstRet.length(); ++i) for (size_t i = 0; i < rstRet.length(); ++i)
rstRet[i] = (char) tolower(rstRet[i]); rstRet[i] = tolower(rstRet[i]);
} }
struct stringhash struct stringhash
{ {
size_t operator () (const std::string & str) const size_t operator () (const std::string & str) const
{ {
const auto * s = (const unsigned char*) str.c_str(); const unsigned char * s = (const unsigned char*) str.c_str();
const auto * end = s + str.size(); const unsigned char * end = s + str.size();
size_t h = 0; size_t h = 0;
while (s < end) while (s < end)
@ -38,3 +39,98 @@ struct stringhash
return h; return h;
} }
}; };
// code from tr1/functional_hash.h
template<typename T>
struct hash;
template<typename _Tp>
struct hash<_Tp*>
: public std::unary_function<_Tp*, std::size_t>
{
std::size_t
operator()(_Tp* __p) const
{ return reinterpret_cast<std::size_t>(__p); }
};
namespace std
{
template <class container, class Pred>
void erase_if (container & a, typename container::iterator first, typename container::iterator past, Pred pred)
{
while (first != past)
if (pred(*first))
a.erase(first++);
else
++first;
}
template <class container>
void wipe(container & a)
{
typename container::iterator first, past;
first = a.begin();
past = a.end();
while (first != past)
delete *(first++);
a.clear();
}
template <class container>
void wipe_second(container & a)
{
typename container::iterator first, past;
first = a.begin();
past = a.end();
while (first != past)
{
delete first->second;
++first;
}
a.clear();
}
template <class _Ty>
class void_mem_fun_t : public unary_function<_Ty *, void>
{
public:
explicit void_mem_fun_t(void (_Ty::*_Pm)()) : _Ptr(_Pm)
{
}
void operator()(_Ty* p) const
{
((p->*_Ptr)());
}
private:
void (_Ty::*_Ptr)();
};
template<class _Ty> inline
void_mem_fun_t<_Ty> void_mem_fun(void (_Ty::*_Pm)())
{ return (void_mem_fun_t<_Ty>(_Pm)); }
template<class _Ty>
class void_mem_fun_ref_t : public unary_function<_Ty, void>
{
public:
explicit void_mem_fun_ref_t(void (_Ty::*_Pm)()) : _Ptr(_Pm) {}
void operator()(_Ty& x) const
{ return ((x.*_Ptr)()); }
private:
void (_Ty::*_Ptr)();
};
template<class _Ty> inline
void_mem_fun_ref_t<_Ty> void_mem_fun_ref(void (_Ty::*_Pm)())
{ return (void_mem_fun_ref_t< _Ty>(_Pm)); }
};
#endif

View File

@ -735,11 +735,10 @@ typedef struct SEmpireSelectPacket
typedef struct SPacketGDSetup typedef struct SPacketGDSetup
{ {
BYTE bChannel; char szPublicIP[16]; // Public IP which listen to users
char szPublicIP[16]; // Public IP which clients connect to BYTE bChannel; // 채널
WORD wListenPort; // Port number which clients connect to WORD wListenPort; // 클라이언트가 접속하는 포트 번호
char szInternalIP[16]; // Internal IP which other servers connect to WORD wP2PPort; // 서버끼리 연결 시키는 P2P 포트 번호
WORD wP2PPort; // Port number which other servers connect to
LONG alMaps[MAP_ALLOW_MAX_LEN]; LONG alMaps[MAP_ALLOW_MAX_LEN];
DWORD dwLoginCount; DWORD dwLoginCount;
BYTE bAuthServer; BYTE bAuthServer;

View File

@ -20,19 +20,23 @@ endif()
# Treat char variables as signed, especially useful for ARM builds # Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char) target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
# Find and link dependencies # Find dependencies
# #
# vcpkg dependencies # vcpkg dependencies
# #
# Boost
find_package(Boost COMPONENTS system REQUIRED)
target_link_libraries (${PROJECT_NAME} PRIVATE Boost::boost Boost::system)
# Libevent # Libevent
find_package(Libevent CONFIG REQUIRED) find_package(Libevent CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} libevent::core libevent::extra libevent::pthreads) target_link_libraries(${PROJECT_NAME} PRIVATE libevent::core libevent::extra libevent::pthreads)
# effolkronium/random # effolkronium/random
find_package(effolkronium_random CONFIG REQUIRED) find_package(effolkronium_random CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} effolkronium_random) target_link_libraries(${PROJECT_NAME} PRIVATE effolkronium_random)
# #
# System-provided dependencies # System-provided dependencies
@ -41,9 +45,9 @@ target_link_libraries(${PROJECT_NAME} effolkronium_random)
# Pthreads # Pthreads
set(THREADS_PREFER_PTHREAD_FLAG ON) set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED) find_package(Threads REQUIRED)
target_link_libraries(${PROJECT_NAME} Threads::Threads) target_link_libraries(${PROJECT_NAME} PRIVATE Threads::Threads)
# LibBSD # LibBSD
target_link_libraries(${PROJECT_NAME} bsd) target_link_libraries(${PROJECT_NAME} PRIVATE bsd)
target_link_libraries(${PROJECT_NAME} libpoly libsql libthecore) target_link_libraries(${PROJECT_NAME} PRIVATE libpoly libsql libthecore)

View File

@ -1145,10 +1145,9 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
return; return;
} }
peer->SetChannel(p->bChannel);
peer->SetPublicIP(p->szPublicIP); peer->SetPublicIP(p->szPublicIP);
peer->SetChannel(p->bChannel);
peer->SetListenPort(p->wListenPort); peer->SetListenPort(p->wListenPort);
peer->SetInternalIP(p->szInternalIP);
peer->SetP2PPort(p->wP2PPort); peer->SetP2PPort(p->wP2PPort);
peer->SetMaps(p->alMaps); peer->SetMaps(p->alMaps);
@ -1265,9 +1264,9 @@ void CClientManager::QUERY_SETUP(CPeer * peer, DWORD dwHandle, const char * c_pD
SPDLOG_DEBUG("SETUP: channel {} listen {} p2p {} count {}", peer->GetChannel(), p->wListenPort, p->wP2PPort, bMapCount); SPDLOG_DEBUG("SETUP: channel {} listen {} p2p {} count {}", peer->GetChannel(), p->wListenPort, p->wP2PPort, bMapCount);
TPacketDGP2P p2pSetupPacket; TPacketDGP2P p2pSetupPacket;
p2pSetupPacket.wPort = peer->GetP2PPort();
p2pSetupPacket.bChannel = peer->GetChannel(); p2pSetupPacket.bChannel = peer->GetChannel();
strlcpy(p2pSetupPacket.szHost, peer->GetInternalIP(), sizeof(p2pSetupPacket.szHost)); strlcpy(p2pSetupPacket.szHost, peer->GetPublicIP(), sizeof(p2pSetupPacket.szHost));
p2pSetupPacket.wPort = peer->GetP2PPort();
for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end();++i) for (itertype(m_peerList) i = m_peerList.begin(); i != m_peerList.end();++i)
{ {

View File

@ -381,8 +381,8 @@ class CClientManager : public singleton<CClientManager>
private: private:
int m_looping; int m_looping;
event_base * m_base = nullptr; event_base * m_base;
evconnlistener * m_listener = nullptr; evconnlistener * m_listener;
TPeerList m_peerList; TPeerList m_peerList;
CPeer * m_pkAuthPeer; CPeer * m_pkAuthPeer;

View File

@ -16,12 +16,14 @@
#endif #endif
#include <signal.h> #include <signal.h>
void SetPlayerDBName(const char* c_pszPlayerDBName);
void SetTablePostfix(const char* c_pszTablePostfix); void SetTablePostfix(const char* c_pszTablePostfix);
int Start(); int Start();
std::string g_stTablePostfix; std::string g_stTablePostfix;
std::string g_stLocaleNameColumn = "name"; std::string g_stLocaleNameColumn = "name";
std::string g_stLocale = "euckr"; std::string g_stLocale = "euckr";
std::string g_stPlayerDBName = "";
BOOL g_test_server = false; BOOL g_test_server = false;
@ -93,7 +95,7 @@ int main()
DBManager.Quit(); DBManager.Quit();
int iCount; int iCount;
while (true) while (1)
{ {
iCount = 0; iCount = 0;
@ -124,9 +126,9 @@ void emptybeat(LPHEART heart, int pulse)
// //
int Start() int Start()
{ {
if (!CConfig::instance().LoadFile("db.conf")) if (!CConfig::instance().LoadFile("conf.txt"))
{ {
SPDLOG_ERROR("Loading db.conf failed."); SPDLOG_ERROR("Loading conf.txt failed.");
return false; return false;
} }
@ -217,56 +219,83 @@ int Start()
int iPort; int iPort;
char line[256+1]; char line[256+1];
if (CConfig::instance().GetValue("SQL_PLAYER", line, 256)) { if (CConfig::instance().GetValue("SQL_PLAYER", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
SPDLOG_DEBUG("Connecting to MySQL server (player)"); SPDLOG_DEBUG("Connecting to MySQL server (player)");
if (!CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword)) { int iRetry = 5;
SPDLOG_CRITICAL("Connection to MySQL server (player) failed!");
return false;
}
SPDLOG_INFO("Connected to MySQL server (player)"); do
} {
else { if (CDBManager::instance().Connect(SQL_PLAYER, szAddr, iPort, szDB, szUser, szPassword))
SPDLOG_CRITICAL("SQL_PLAYER not configured"); {
return false; SPDLOG_INFO("Connected to MySQL server (player)");
} break;
}
if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256)) { SPDLOG_ERROR("Connection to MySQL server (player) failed, retrying in 5 seconds");
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sleep(5);
SPDLOG_DEBUG("Connecting to MySQL server (account)"); } while (iRetry--);
SetPlayerDBName(szDB);
if (!CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword)) {
SPDLOG_CRITICAL("Connection to MySQL server (account) failed!");
return false;
}
SPDLOG_INFO("Connected to MySQL server (account)");
} }
else else
{ {
SPDLOG_CRITICAL("SQL_ACCOUNT not configured"); SPDLOG_ERROR("SQL_PLAYER not configured");
return false;
}
if (CConfig::instance().GetValue("SQL_ACCOUNT", line, 256))
{
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
SPDLOG_DEBUG("connecting to MySQL server (account)");
int iRetry = 5;
do
{
if (CDBManager::instance().Connect(SQL_ACCOUNT, szAddr, iPort, szDB, szUser, szPassword))
{
SPDLOG_DEBUG(" OK");
break;
}
SPDLOG_DEBUG(" failed, retrying in 5 seconds");
SPDLOG_ERROR(" failed, retrying in 5 seconds");
sleep(5);
} while (iRetry--);
SPDLOG_INFO("Success ACCOUNT");
}
else
{
SPDLOG_ERROR("SQL_ACCOUNT not configured");
return false; return false;
} }
if (CConfig::instance().GetValue("SQL_COMMON", line, 256)) if (CConfig::instance().GetValue("SQL_COMMON", line, 256))
{ {
sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort); sscanf(line, " %s %s %s %s %d ", szAddr, szDB, szUser, szPassword, &iPort);
SPDLOG_DEBUG("Connecting to MySQL server (common)"); SPDLOG_DEBUG("connecting to MySQL server (common)");
int iRetry = 5;
if (!CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword)) do
{ {
SPDLOG_CRITICAL("Connection to MySQL server (common) failed!"); if (CDBManager::instance().Connect(SQL_COMMON, szAddr, iPort, szDB, szUser, szPassword))
return false; {
} SPDLOG_DEBUG(" OK");
break;
}
SPDLOG_INFO("Connected to MySQL server (common)"); SPDLOG_DEBUG(" failed, retrying in 5 seconds");
SPDLOG_ERROR(" failed, retrying in 5 seconds");
sleep(5);
} while (iRetry--);
SPDLOG_INFO("Success COMMON");
} }
else else
{ {
SPDLOG_CRITICAL("SQL_COMMON not configured"); SPDLOG_ERROR("SQL_COMMON not configured");
return false; return false;
} }
@ -297,3 +326,20 @@ const char * GetTablePostfix()
{ {
return g_stTablePostfix.c_str(); return g_stTablePostfix.c_str();
} }
void SetPlayerDBName(const char* c_pszPlayerDBName)
{
if (! c_pszPlayerDBName || ! *c_pszPlayerDBName)
g_stPlayerDBName = "";
else
{
g_stPlayerDBName = c_pszPlayerDBName;
g_stPlayerDBName += ".";
}
}
const char * GetPlayerDBName()
{
return g_stPlayerDBName.c_str();
}

View File

@ -38,18 +38,15 @@ class CPeer : public CPeerBase
DWORD GetUserCount(); DWORD GetUserCount();
void SetUserCount(DWORD dwCount); void SetUserCount(DWORD dwCount);
void SetPublicIP(const char * ip) { m_stPublicIP = ip; }
const char * GetPublicIP() { return m_stPublicIP.c_str(); }
void SetChannel(BYTE bChannel) { m_bChannel = bChannel; } void SetChannel(BYTE bChannel) { m_bChannel = bChannel; }
BYTE GetChannel() { return m_bChannel; } BYTE GetChannel() { return m_bChannel; }
void SetPublicIP(const char * ip) { m_stPublicIP = ip; }
const char * GetPublicIP() { return m_stPublicIP.c_str(); }
void SetListenPort(WORD wPort) { m_wListenPort = wPort; } void SetListenPort(WORD wPort) { m_wListenPort = wPort; }
WORD GetListenPort() { return m_wListenPort; } WORD GetListenPort() { return m_wListenPort; }
void SetInternalIP(const char * ip) { m_stInternalIP = ip; }
const char * GetInternalIP() { return m_stInternalIP.c_str(); }
void SetP2PPort(WORD wPort); void SetP2PPort(WORD wPort);
WORD GetP2PPort() { return m_wP2PPort; } WORD GetP2PPort() { return m_wP2PPort; }
@ -75,7 +72,6 @@ class CPeer : public CPeerBase
TItemIDRangeTable m_itemSpareRange; TItemIDRangeTable m_itemSpareRange;
std::string m_stPublicIP; std::string m_stPublicIP;
std::string m_stInternalIP;
}; };
#endif #endif

View File

@ -20,15 +20,15 @@ endif()
# Treat char variables as signed, especially useful for ARM builds # Treat char variables as signed, especially useful for ARM builds
target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char) target_compile_options(${PROJECT_NAME} PUBLIC -fsigned-char)
# Find and link dependencies # Find dependencies
# #
# vcpkg dependencies # vcpkg dependencies
# #
# MariaDB # MySQL
find_package(unofficial-libmariadb REQUIRED) find_package(unofficial-libmysql REQUIRED)
target_link_libraries(${PROJECT_NAME} unofficial::libmariadb) target_link_libraries(${PROJECT_NAME} unofficial::libmysql::libmysql)
# Argon2 # Argon2
find_package(unofficial-argon2 CONFIG REQUIRED) find_package(unofficial-argon2 CONFIG REQUIRED)
@ -36,7 +36,11 @@ target_link_libraries(${PROJECT_NAME} unofficial::argon2::libargon2)
# Crypto++ # Crypto++
find_package(cryptopp CONFIG REQUIRED) find_package(cryptopp CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} cryptopp::cryptopp) target_link_libraries (${PROJECT_NAME} cryptopp::cryptopp)
# Boost
find_package(Boost REQUIRED)
target_link_libraries (${PROJECT_NAME} Boost::boost)
# Libevent # Libevent
find_package(Libevent CONFIG REQUIRED) find_package(Libevent CONFIG REQUIRED)

View File

@ -9,6 +9,7 @@
#include "dragon_soul_table.h" #include "dragon_soul_table.h"
#include "log.h" #include "log.h"
#include "DragonSoul.h" #include "DragonSoul.h"
#include <boost/lexical_cast.hpp>
typedef std::vector <std::string> TTokenVector; typedef std::vector <std::string> TTokenVector;
@ -388,7 +389,7 @@ bool DSManager::ExtractDragonHeart(LPCHARACTER ch, LPITEM pItem, LPITEM pExtract
pDH->SetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX, iCharge); pDH->SetSocket(ITEM_SOCKET_CHARGING_AMOUNT_IDX, iCharge);
ch->AutoGiveItem(pDH, true); ch->AutoGiveItem(pDH, true);
std::string s = std::to_string(iCharge); std::string s = boost::lexical_cast <std::string> (iCharge);
s += "%s"; s += "%s";
LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_SUCCESS", s.c_str()); LogManager::instance().ItemLog(ch, pItem, "DS_HEART_EXTRACT_SUCCESS", s.c_str());
ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone remaining duration has been extracted.")); ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Dragon Stone remaining duration has been extracted."));

View File

@ -1,6 +1,7 @@
#ifndef IFILEMONITOR_INCLUDED #ifndef IFILEMONITOR_INCLUDED
#define IFILEMONITOR_INCLUDED #define IFILEMONITOR_INCLUDED
//#include <boost/function.hpp>
#include <unordered_map> #include <unordered_map>
enum eFileUpdatedOptions enum eFileUpdatedOptions

View File

@ -1,13 +1,31 @@
#include "stdafx.h" #include "stdafx.h"
#ifndef DEBUG_ALLOC
#include <boost/pool/object_pool.hpp>
#endif
#include "affect.h" #include "affect.h"
#ifndef DEBUG_ALLOC
boost::object_pool<CAffect> affect_pool;
#endif
CAffect* CAffect::Acquire() CAffect* CAffect::Acquire()
{ {
#ifndef DEBUG_ALLOC
return affect_pool.malloc();
#else
return M2_NEW CAffect; return M2_NEW CAffect;
#endif
} }
void CAffect::Release(CAffect* p) void CAffect::Release(CAffect* p)
{ {
#ifndef DEBUG_ALLOC
affect_pool.free(p);
#else
M2_DELETE(p); M2_DELETE(p);
#endif
} }

View File

@ -10,6 +10,7 @@
#include "item_manager.h" #include "item_manager.h"
#include "log.h" #include "log.h"
#include "db.h" #include "db.h"
#include <boost/bind.hpp>
#include "item.h" #include "item.h"
#include "desc_client.h" #include "desc_client.h"
#include <common/tables.h> #include <common/tables.h>

View File

@ -4244,7 +4244,7 @@ bool CHARACTER::RequestToParty(LPCHARACTER leader)
void CHARACTER::DenyToParty(LPCHARACTER member) void CHARACTER::DenyToParty(LPCHARACTER member)
{ {
SPDLOG_DEBUG("DenyToParty {} member {} {}", GetName(), member->GetName(), (void*) member->m_pkPartyRequestEvent.get()); SPDLOG_DEBUG("DenyToParty {} member {} {}", GetName(), member->GetName(), (void*) get_pointer(member->m_pkPartyRequestEvent));
if (!member->m_pkPartyRequestEvent) if (!member->m_pkPartyRequestEvent)
return; return;
@ -4270,7 +4270,7 @@ void CHARACTER::DenyToParty(LPCHARACTER member)
void CHARACTER::AcceptToParty(LPCHARACTER member) void CHARACTER::AcceptToParty(LPCHARACTER member)
{ {
SPDLOG_DEBUG("AcceptToParty {} member {} {}", GetName(), member->GetName(), (void*) member->m_pkPartyRequestEvent.get()); SPDLOG_DEBUG("AcceptToParty {} member {} {}", GetName(), member->GetName(), (void*) get_pointer(member->m_pkPartyRequestEvent));
if (!member->m_pkPartyRequestEvent) if (!member->m_pkPartyRequestEvent)
return; return;

View File

@ -160,7 +160,7 @@ void CHARACTER::StartAffectEvent()
char_event_info* info = AllocEventInfo<char_event_info>(); char_event_info* info = AllocEventInfo<char_event_info>();
info->ch = this; info->ch = this;
m_pkAffectEvent = event_create(affect_event, info, passes_per_sec); m_pkAffectEvent = event_create(affect_event, info, passes_per_sec);
SPDLOG_DEBUG("StartAffectEvent {} {} {}", GetName(), (void*) this, (void*) m_pkAffectEvent.get()); SPDLOG_DEBUG("StartAffectEvent {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkAffectEvent));
} }
void CHARACTER::ClearAffect(bool bSave) void CHARACTER::ClearAffect(bool bSave)

View File

@ -1009,8 +1009,7 @@ void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller)
if (!vec_bSlots.empty()) if (!vec_bSlots.empty())
{ {
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); random_shuffle(vec_bSlots.begin(), vec_bSlots.end());
std::shuffle(vec_bSlots.begin(), vec_bSlots.end(), std::default_random_engine(seed));
int iQty = std::min<int>(vec_bSlots.size(), r.iInventoryQty); int iQty = std::min<int>(vec_bSlots.size(), r.iInventoryQty);
@ -1042,9 +1041,7 @@ void CHARACTER::ItemDropPenalty(LPCHARACTER pkKiller)
if (!vec_bSlots.empty()) if (!vec_bSlots.empty())
{ {
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count(); random_shuffle(vec_bSlots.begin(), vec_bSlots.end());
std::shuffle(vec_bSlots.begin(), vec_bSlots.end(), std::default_random_engine(seed));
int iQty; int iQty;
if (isDropAllEquipments) if (isDropAllEquipments)
@ -1423,7 +1420,7 @@ void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
{ {
if (m_pkDeadEvent) if (m_pkDeadEvent)
{ {
SPDLOG_DEBUG("DEAD_EVENT_CANCEL: {} {} {}", GetName(), (void*) this, (void*) m_pkDeadEvent.get()); SPDLOG_DEBUG("DEAD_EVENT_CANCEL: {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkDeadEvent));
event_cancel(&m_pkDeadEvent); event_cancel(&m_pkDeadEvent);
} }
@ -1459,7 +1456,7 @@ void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead)
} }
} }
SPDLOG_DEBUG("DEAD_EVENT_CREATE: {} {} {}", GetName(), (void*) this, (void*) m_pkDeadEvent.get()); SPDLOG_DEBUG("DEAD_EVENT_CREATE: {} {} {}", GetName(), (void*) this, (void*) get_pointer(m_pkDeadEvent));
} }
if (m_pkExchange != NULL) if (m_pkExchange != NULL)

View File

@ -16,6 +16,10 @@
#include "questlua.h" #include "questlua.h"
#include "locale_service.h" #include "locale_service.h"
#ifndef __GNUC__
#include <boost/bind.hpp>
#endif
CHARACTER_MANAGER::CHARACTER_MANAGER() : CHARACTER_MANAGER::CHARACTER_MANAGER() :
m_iVIDCount(0), m_iVIDCount(0),
m_pkChrSelectedStone(NULL), m_pkChrSelectedStone(NULL),
@ -642,7 +646,9 @@ struct FuncUpdateAndResetChatCounter
void CHARACTER_MANAGER::Update(int iPulse) void CHARACTER_MANAGER::Update(int iPulse)
{ {
using namespace std; using namespace std;
#ifdef __GNUC__
using namespace __gnu_cxx; using namespace __gnu_cxx;
#endif
BeginPendingDestroy(); BeginPendingDestroy();
@ -653,7 +659,11 @@ void CHARACTER_MANAGER::Update(int iPulse)
// 컨테이너 복사 // 컨테이너 복사
CHARACTER_VECTOR v; CHARACTER_VECTOR v;
v.reserve(m_map_pkPCChr.size()); v.reserve(m_map_pkPCChr.size());
#ifdef __GNUC__
transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), select2nd<NAME_MAP::value_type>()); transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), select2nd<NAME_MAP::value_type>());
#else
transform(m_map_pkPCChr.begin(), m_map_pkPCChr.end(), back_inserter(v), boost::bind(&NAME_MAP::value_type::second, _1));
#endif
if (0 == (iPulse % PASSES_PER_SEC(5))) if (0 == (iPulse % PASSES_PER_SEC(5)))
{ {
@ -663,7 +673,7 @@ void CHARACTER_MANAGER::Update(int iPulse)
else else
{ {
//for_each(v.begin(), v.end(), mem_fun(&CFSM::Update)); //for_each(v.begin(), v.end(), mem_fun(&CFSM::Update));
for (auto& ch : v) ch->UpdateCharacter(iPulse); for_each(v.begin(), v.end(), bind2nd(mem_fun(&CHARACTER::UpdateCharacter), iPulse));
} }
} }
@ -676,9 +686,12 @@ void CHARACTER_MANAGER::Update(int iPulse)
{ {
CHARACTER_VECTOR v; CHARACTER_VECTOR v;
v.reserve(m_set_pkChrState.size()); v.reserve(m_set_pkChrState.size());
#ifdef __GNUC__
transform(m_set_pkChrState.begin(), m_set_pkChrState.end(), back_inserter(v), identity<CHARACTER_SET::value_type>()); transform(m_set_pkChrState.begin(), m_set_pkChrState.end(), back_inserter(v), identity<CHARACTER_SET::value_type>());
#else
for (auto& ch : v) ch->UpdateStateMachine(iPulse); v.insert(v.end(), m_set_pkChrState.begin(), m_set_pkChrState.end());
#endif
for_each(v.begin(), v.end(), bind2nd(mem_fun(&CHARACTER::UpdateStateMachine), iPulse));
} }
} }
@ -688,7 +701,8 @@ void CHARACTER_MANAGER::Update(int iPulse)
if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(xmas::MOB_SANTA_VNUM, i)) if (CHARACTER_MANAGER::instance().GetCharactersByRaceNum(xmas::MOB_SANTA_VNUM, i))
{ {
for (auto& ch : i) ch->UpdateStateMachine(iPulse); for_each(i.begin(), i.end(),
bind2nd(mem_fun(&CHARACTER::UpdateStateMachine), iPulse));
} }
} }
@ -1015,10 +1029,16 @@ void CHARACTER_MANAGER::FlushPendingDestroy()
CharacterVectorInteractor::CharacterVectorInteractor(const CHARACTER_SET & r) CharacterVectorInteractor::CharacterVectorInteractor(const CHARACTER_SET & r)
{ {
using namespace std; using namespace std;
#ifdef __GNUC__
using namespace __gnu_cxx; using namespace __gnu_cxx;
#endif
reserve(r.size()); reserve(r.size());
#ifdef __GNUC__
transform(r.begin(), r.end(), back_inserter(*this), identity<CHARACTER_SET::value_type>()); transform(r.begin(), r.end(), back_inserter(*this), identity<CHARACTER_SET::value_type>());
#else
insert(end(), r.begin(), r.end());
#endif
if (CHARACTER_MANAGER::instance().BeginPendingDestroy()) if (CHARACTER_MANAGER::instance().BeginPendingDestroy())
m_bMyBegin = true; m_bMyBegin = true;

View File

@ -28,11 +28,6 @@
#include "threeway_war.h" #include "threeway_war.h"
#include "log.h" #include "log.h"
#include <common/VnumHelper.h> #include <common/VnumHelper.h>
#include <cryptopp/cryptlib.h>
#include <cryptopp/hmac.h>
#include <cryptopp/sha.h>
#include <cryptopp/hex.h>
#include <cryptopp/filters.h>
#ifdef __AUCTION__ #ifdef __AUCTION__
#include "auction_manager.h" #include "auction_manager.h"
#endif #endif
@ -2236,32 +2231,13 @@ ACMD(do_cube)
ACMD(do_in_game_mall) ACMD(do_in_game_mall)
{ {
// Build the URL char country_code[3];
const auto expire_time = std::chrono::system_clock::now() + std::chrono::minutes(1); country_code[0] = 'd'; country_code[1] = 'e'; country_code[2] = '\0';
const auto expire_timestamp = std::chrono::duration_cast<std::chrono::seconds>(expire_time.time_since_epoch()).count();
std::string url = fmt::format("{}/mall/auth?pid={}&sid={}&expires={}", g_strWebAppURL, ch->GetPlayerID(), g_server_id, expire_timestamp);
// Compute hex-encoded SHA-256 URL signature
std::string mac, encoded;
try {
CryptoPP::HMAC<CryptoPP::SHA256> hmac((CryptoPP::byte*) g_strWebAppKey.c_str(), g_strWebAppKey.size());
CryptoPP::StringSource ss(url, true, new CryptoPP::HashFilter(hmac, new CryptoPP::StringSink(mac)));
encoded.clear();
CryptoPP::StringSource(mac, true, new CryptoPP::HexEncoder(new CryptoPP::StringSink(encoded), false));
}
catch (const CryptoPP::Exception& e) {
SPDLOG_ERROR("Failed to create HMAC signature: {}", e.what());
return;
}
// Add the signature to the URL
url += fmt::format("&signature={}", encoded);
// Send the command to the player
char buf[512+1]; char buf[512+1];
snprintf(buf, sizeof(buf), "mall %s", url.c_str());
snprintf(buf, sizeof(buf), "mall http://%s/ishop?pid=%u&c=%s&sid=%d",
g_strWebMallURL.c_str(), ch->GetPlayerID(), country_code, g_server_id);
ch->ChatPacket(CHAT_TYPE_COMMAND, buf); ch->ChatPacket(CHAT_TYPE_COMMAND, buf);
} }

View File

@ -21,12 +21,12 @@
using std::string; using std::string;
// Networking // Networking
string g_szPublicBindIP = "0.0.0.0"; char g_szPublicBindIP[16] = "0.0.0.0";
string g_szPublicIP; char g_szPublicIP[16] = "0";
WORD mother_port = 50080; WORD mother_port = 50080;
string g_szInternalBindIP = "0.0.0.0"; char g_szInternalBindIP[16] = "0.0.0.0";
string g_szInternalIP; char g_szInternalIP[16] = "0";
WORD p2p_port = 50900; WORD p2p_port = 50900;
char db_addr[ADDRESS_MAX_LEN + 1]; char db_addr[ADDRESS_MAX_LEN + 1];
@ -104,8 +104,7 @@ int VIEW_RANGE = 5000;
int VIEW_BONUS_RANGE = 500; int VIEW_BONUS_RANGE = 500;
int g_server_id = 0; int g_server_id = 0;
string g_strWebAppURL = ""; string g_strWebMallURL = "www.metin2.de";
string g_strWebAppKey = "";
unsigned int g_uiSpamBlockDuration = 60 * 15; // 기본 15분 unsigned int g_uiSpamBlockDuration = 60 * 15; // 기본 15분
unsigned int g_uiSpamBlockScore = 100; // 기본 100점 unsigned int g_uiSpamBlockScore = 100; // 기본 100점
@ -263,16 +262,16 @@ bool GetIPInfo()
sai->sin_addr.s_addr == 16777343) // ignore if address is 127.0.0.1 sai->sin_addr.s_addr == 16777343) // ignore if address is 127.0.0.1
continue; continue;
if (IsPrivateIP(sai->sin_addr) && g_szInternalIP.empty()) if (IsPrivateIP(sai->sin_addr) && g_szInternalIP[0] == '0')
{ {
char * ip = inet_ntoa(sai->sin_addr); char * ip = inet_ntoa(sai->sin_addr);
g_szInternalIP = string(ip); strlcpy(g_szInternalIP, ip, sizeof(g_szInternalIP));
SPDLOG_WARN("Internal IP automatically configured: {} interface {}", ip, ifap->ifa_name); SPDLOG_WARN("Internal IP automatically configured: {} interface {}", ip, ifap->ifa_name);
} }
else if (g_szPublicIP.empty()) else if (g_szPublicIP[0] == '0')
{ {
char * ip = inet_ntoa(sai->sin_addr); char * ip = inet_ntoa(sai->sin_addr);
g_szPublicIP = string(ip); strlcpy(g_szPublicIP, ip, sizeof(g_szPublicIP));
SPDLOG_WARN("Public IP automatically configured: {} interface {}", ip, ifap->ifa_name); SPDLOG_WARN("Public IP automatically configured: {} interface {}", ip, ifap->ifa_name);
} }
} }
@ -293,7 +292,7 @@ void config_init(const string& st_localeServiceName)
string st_configFileName; string st_configFileName;
st_configFileName.reserve(32); st_configFileName.reserve(32);
st_configFileName = "game.conf"; st_configFileName = "CONFIG";
if (!st_localeServiceName.empty()) if (!st_localeServiceName.empty())
{ {
@ -355,10 +354,6 @@ void config_init(const string& st_localeServiceName)
{ {
parse_token(buf, token_string, value_string); parse_token(buf, token_string, value_string);
// If the configuration string is empty, ignore this line
if (strcmp(value_string, "") == 0)
continue;
TOKEN("BLOCK_LOGIN") TOKEN("BLOCK_LOGIN")
{ {
g_stBlockDate = value_string; g_stBlockDate = value_string;
@ -666,10 +661,6 @@ void config_init(const string& st_localeServiceName)
{ {
parse_token(buf, token_string, value_string); parse_token(buf, token_string, value_string);
// If the configuration string is empty, ignore this line
if (strcmp(value_string, "") == 0)
continue;
TOKEN("empire_whisper") TOKEN("empire_whisper")
{ {
bool b_value = 0; bool b_value = 0;
@ -707,14 +698,13 @@ void config_init(const string& st_localeServiceName)
TOKEN("public_ip") TOKEN("public_ip")
{ {
g_szPublicIP = string(value_string); strlcpy(g_szPublicIP, value_string, sizeof(g_szPublicIP));
SPDLOG_INFO("Setting public IP address to '{}'...", g_szPublicIP);
continue; continue;
} }
TOKEN("public_bind_ip") TOKEN("public_bind_ip")
{ {
g_szPublicBindIP = string(value_string); strlcpy(g_szPublicBindIP, value_string, sizeof(g_szPublicBindIP));
continue; continue;
} }
@ -726,14 +716,13 @@ void config_init(const string& st_localeServiceName)
TOKEN("internal_ip") TOKEN("internal_ip")
{ {
g_szInternalIP = string(value_string); strlcpy(g_szInternalIP, value_string, sizeof(g_szInternalIP));
SPDLOG_INFO("Setting internal IP address to '{}'...", g_szInternalIP);
continue; continue;
} }
TOKEN("internal_bind_ip") TOKEN("internal_bind_ip")
{ {
g_szInternalBindIP = string(value_string); strlcpy(g_szInternalBindIP, value_string, sizeof(g_szInternalBindIP));
continue; continue;
} }
@ -786,27 +775,19 @@ void config_init(const string& st_localeServiceName)
TOKEN("test_server") TOKEN("test_server")
{ {
printf("-----------------------------------------------\n");
printf("TEST_SERVER\n");
printf("-----------------------------------------------\n");
str_to_number(test_server, value_string); str_to_number(test_server, value_string);
if (test_server) {
printf("-----------------------------------------------\n");
printf("TEST_SERVER\n");
printf("-----------------------------------------------\n");
}
continue; continue;
} }
TOKEN("speed_server") TOKEN("speed_server")
{ {
printf("-----------------------------------------------\n");
printf("SPEED_SERVER\n");
printf("-----------------------------------------------\n");
str_to_number(speed_server, value_string); str_to_number(speed_server, value_string);
if (speed_server) {
printf("-----------------------------------------------\n");
printf("SPEED_SERVER\n");
printf("-----------------------------------------------\n");
}
continue; continue;
} }
#ifdef __AUCTION__ #ifdef __AUCTION__
@ -906,11 +887,7 @@ void config_init(const string& st_localeServiceName)
two_arguments(value_string, szIP, sizeof(szIP), szPort, sizeof(szPort)); two_arguments(value_string, szIP, sizeof(szIP), szPort, sizeof(szPort));
// Skip if arguments are empty if (!*szIP || (!*szPort && strcasecmp(szIP, "master")))
if (!*szIP)
continue;
if (!*szPort && strcasecmp(szIP, "master"))
{ {
SPDLOG_CRITICAL("AUTH_SERVER: syntax error: <ip|master> <port>"); SPDLOG_CRITICAL("AUTH_SERVER: syntax error: <ip|master> <port>");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
@ -972,14 +949,9 @@ void config_init(const string& st_localeServiceName)
str_to_number(g_server_id, value_string); str_to_number(g_server_id, value_string);
} }
TOKEN("web_app_url") TOKEN("mall_url")
{ {
g_strWebAppURL = value_string; g_strWebMallURL = value_string;
}
TOKEN("web_app_key")
{
g_strWebAppKey = value_string;
} }
TOKEN("view_range") TOKEN("view_range")
@ -1073,19 +1045,6 @@ void config_init(const string& st_localeServiceName)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
// Validate web app configuration
if (g_strWebAppURL.empty())
{
SPDLOG_CRITICAL("WEB_APP_URL must be configured.");
exit(EXIT_FAILURE);
}
if (g_strWebAppKey.empty())
{
SPDLOG_CRITICAL("WEB_APP_KEY must be configured.");
exit(EXIT_FAILURE);
}
// LOCALE_SERVICE // LOCALE_SERVICE
LocaleService_LoadLocaleStringFile(); LocaleService_LoadLocaleStringFile();
LocaleService_TransferDefaultSetting(); LocaleService_TransferDefaultSetting();

View File

@ -9,12 +9,12 @@ enum
void config_init(const std::string& st_localeServiceName); // default "" is CONFIG void config_init(const std::string& st_localeServiceName); // default "" is CONFIG
extern std::string g_szPublicBindIP; extern char g_szPublicBindIP[16];
extern std::string g_szPublicIP; extern char g_szPublicIP[16];
extern WORD mother_port; extern WORD mother_port;
extern std::string g_szInternalBindIP; extern char g_szInternalBindIP[16];
extern std::string g_szInternalIP; extern char g_szInternalIP[16];
extern WORD p2p_port; extern WORD p2p_port;
extern char db_addr[ADDRESS_MAX_LEN + 1]; extern char db_addr[ADDRESS_MAX_LEN + 1];
@ -90,8 +90,7 @@ extern int SPEEDHACK_LIMIT_BONUS;
extern int g_iSyncHackLimitCount; extern int g_iSyncHackLimitCount;
extern int g_server_id; extern int g_server_id;
extern std::string g_strWebAppURL; extern std::string g_strWebMallURL;
extern std::string g_strWebAppKey;
extern int VIEW_RANGE; extern int VIEW_RANGE;
extern int VIEW_BONUS_RANGE; extern int VIEW_BONUS_RANGE;

View File

@ -158,7 +158,7 @@ void CLIENT_DESC::SetPhase(int iPhase)
TPacketGDBoot p; TPacketGDBoot p;
p.dwItemIDRange[0] = 0; p.dwItemIDRange[0] = 0;
p.dwItemIDRange[1] = 0; p.dwItemIDRange[1] = 0;
memcpy(p.szIP, g_szPublicIP.c_str(), 16); memcpy(p.szIP, g_szPublicIP, 16);
DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p)); DBPacket(HEADER_GD_BOOT, 0, &p, sizeof(p));
} }
} }
@ -168,8 +168,7 @@ void CLIENT_DESC::SetPhase(int iPhase)
TPacketGDSetup p; TPacketGDSetup p;
memset(&p, 0, sizeof(p)); memset(&p, 0, sizeof(p));
strlcpy(p.szPublicIP, g_szPublicIP.c_str(), sizeof(p.szPublicIP)); strlcpy(p.szPublicIP, g_szPublicIP, sizeof(p.szPublicIP));
strlcpy(p.szInternalIP, g_szInternalIP.c_str(), sizeof(p.szInternalIP));
if (!g_bAuthServer) if (!g_bAuthServer)
{ {

View File

@ -3,7 +3,7 @@
#include "group_text_parse_tree.h" #include "group_text_parse_tree.h"
#include "dragon_soul_table.h" #include "dragon_soul_table.h"
#include "item_manager.h" #include "item_manager.h"
#include <boost/lexical_cast.hpp>
const std::string g_astGradeName[] = const std::string g_astGradeName[] =
{ {
"grade_normal", "grade_normal",
@ -789,7 +789,7 @@ bool DragonSoulTable::GetRefineStrengthValues(BYTE ds_type, BYTE material_type,
stDragonSoulName.c_str(), g_astMaterialName[material_type].c_str()); stDragonSoulName.c_str(), g_astMaterialName[material_type].c_str());
return false; return false;
} }
std::string stStrengthIdx = std::to_string((int)strength_idx); std::string stStrengthIdx = boost::lexical_cast <std::string> ((int)strength_idx);
if (!m_pRefineStrengthTableNode->GetGroupValue(stDragonSoulName, g_astMaterialName[material_type], stStrengthIdx, prob)) if (!m_pRefineStrengthTableNode->GetGroupValue(stDragonSoulName, g_astMaterialName[material_type], stStrengthIdx, prob))
{ {

View File

@ -30,7 +30,7 @@ LPEVENT event_create_ex(TEVENTFUNC func, event_info_data* info, int when)
#ifdef M2_USE_POOL #ifdef M2_USE_POOL
new_event = event_pool.Construct(); new_event = event_pool.Construct();
#else #else
new_event = std::make_shared<event>(); new_event = M2_NEW event;
#endif #endif
assert(NULL != new_event); assert(NULL != new_event);
@ -136,7 +136,7 @@ int event_process(int pulse)
} }
else else
{ {
new_time = (the_event->func) (the_event, processing_time); new_time = (the_event->func) (get_pointer(the_event), processing_time);
if (new_time <= 0 || the_event->is_force_to_end) if (new_time <= 0 || the_event->is_force_to_end)
{ {
@ -201,3 +201,17 @@ int event_count()
{ {
return cxx_q.Size(); return cxx_q.Size();
} }
void intrusive_ptr_add_ref(EVENT* p) {
++(p->ref_count);
}
void intrusive_ptr_release(EVENT* p) {
if ( --(p->ref_count) == 0 ) {
#ifdef M2_USE_POOL
event_pool.Destroy(p);
#else
M2_DELETE(p);
#endif
}
}

View File

@ -4,9 +4,10 @@
* *
* Author: (aka. , Cronan), (aka. myevan, ) * Author: (aka. , Cronan), (aka. myevan, )
*/ */
#pragma once #ifndef __INC_LIBTHECORE_EVENT_H__
#define __INC_LIBTHECORE_EVENT_H__
#include <memory> #include <boost/intrusive_ptr.hpp>
#ifdef M2_USE_POOL #ifdef M2_USE_POOL
#include "pool.h" #include "pool.h"
@ -33,7 +34,7 @@ private:
}; };
typedef struct event EVENT; typedef struct event EVENT;
typedef std::shared_ptr<EVENT> LPEVENT; typedef boost::intrusive_ptr<EVENT> LPEVENT;
typedef int (*TEVENTFUNC) (LPEVENT event, int processing_time); typedef int (*TEVENTFUNC) (LPEVENT event, int processing_time);
#define EVENTFUNC(name) int (name) (LPEVENT event, int processing_time) #define EVENTFUNC(name) int (name) (LPEVENT event, int processing_time)
@ -62,6 +63,9 @@ struct event
size_t ref_count; size_t ref_count;
}; };
extern void intrusive_ptr_add_ref(EVENT* p);
extern void intrusive_ptr_release(EVENT* p);
template<class T> // T should be a subclass of event_info_data template<class T> // T should be a subclass of event_info_data
T* AllocEventInfo() { T* AllocEventInfo() {
#ifdef M2_USE_POOL #ifdef M2_USE_POOL
@ -85,3 +89,5 @@ extern void event_set_verbose(int level);
extern event_info_data* FindEventInfo(DWORD dwID); extern event_info_data* FindEventInfo(DWORD dwID);
extern event_info_data* event_info(LPEVENT event); extern event_info_data* event_info(LPEVENT event);
#endif

View File

@ -0,0 +1,82 @@
#ifndef _FIFO_ALLOCATOR_H_
#define _FIFO_ALLOCATOR_H_
#include <deque>
#ifdef __GNUC__
#include <tr1/unordered_map>
#define std std::tr1
#else
#include <unordered_map>
#define std boost
#endif
// Allocator implementation detail with simple FIFO grow-only pool.
// It relies on default CRT malloc/free.
class FifoAllocator {
public:
FifoAllocator() {}
~FifoAllocator() {}
void SetUp() {}
void TearDown() {
CleanUp(); // deallocate pooled blocks
}
void* Alloc(size_t size) {
void* p = NULL;
PoolType& pool = pool_map_[size];
if (pool.size() < kWatermark) {
p = ::malloc(size);
} else {
p = pool.front();
pool.pop_front();
}
if (p != NULL) {
alloc_map_[p] = size;
}
return p;
}
void Free(void* p) {
if (p == NULL) {
return;
}
AllocMapType::iterator it = alloc_map_.find(p);
if (it == alloc_map_.end()) {
return;
}
size_t size = it->second;
alloc_map_.erase(it);
PoolMapType::iterator it2 = pool_map_.find(size);
if (it2 == pool_map_.end()) {
return;
}
PoolType& pool = it2->second;
pool.push_back(p);
}
private:
void CleanUp() {
PoolMapType::iterator it = pool_map_.begin(), end = pool_map_.end();
for ( ; it != end; ++it) {
PoolType& pool = it->second;
PoolType::iterator it2 = pool.begin(), end2 = pool.end();
for ( ; it2 != end2; ++it2) {
::free(*it2);
}
pool.clear();
}
pool_map_.clear();
}
typedef std::deque<void*> PoolType;
typedef std::unordered_map<size_t, PoolType> PoolMapType;
typedef std::unordered_map<void*, size_t> AllocMapType;
static const size_t kWatermark = 4; // FIFO enforcement level
PoolMapType pool_map_;
AllocMapType alloc_map_;
};
#endif // _FIFO_ALLOCATOR_H_

View File

@ -618,15 +618,15 @@ void CGuild::Load(DWORD guild_id)
m_data.guild_id = guild_id; m_data.guild_id = guild_id;
DBManager::instance().FuncQuery([this](auto const& msg) { LoadGuildData(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&CGuild::LoadGuildData), this),
"SELECT master, level, exp, name, skill_point, skill, sp, ladder_point, win, draw, loss, gold FROM guild%s WHERE id = %u", get_table_postfix(), m_data.guild_id); "SELECT master, level, exp, name, skill_point, skill, sp, ladder_point, win, draw, loss, gold FROM guild%s WHERE id = %u", get_table_postfix(), m_data.guild_id);
SPDLOG_DEBUG("GUILD: loading guild id {:>12} {}", m_data.name, guild_id); SPDLOG_DEBUG("GUILD: loading guild id {:>12} {}", m_data.name, guild_id);
DBManager::instance().FuncQuery([this](auto const& msg) { LoadGuildGradeData(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&CGuild::LoadGuildGradeData), this),
"SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u", get_table_postfix(), m_data.guild_id); "SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u", get_table_postfix(), m_data.guild_id);
DBManager::instance().FuncQuery([this](auto const& msg) { LoadGuildMemberData(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&CGuild::LoadGuildMemberData), this),
"SELECT pid, grade, is_general, offer, level, job, name FROM guild_member%s, player%s WHERE guild_id = %u and pid = id", get_table_postfix(), get_table_postfix(), guild_id); "SELECT pid, grade, is_general, offer, level, job, name FROM guild_member%s, player%s WHERE guild_id = %u and pid = id", get_table_postfix(), get_table_postfix(), guild_id);
} }
@ -756,7 +756,7 @@ void CGuild::__P2PUpdateGrade(SQLMsg* pmsg)
void CGuild::P2PChangeGrade(BYTE grade) void CGuild::P2PChangeGrade(BYTE grade)
{ {
DBManager::instance().FuncQuery([this](auto const& msg) { __P2PUpdateGrade(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&CGuild::__P2PUpdateGrade),this),
"SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u and grade = %d", get_table_postfix(), m_data.guild_id, grade); "SELECT grade, name, auth+0 FROM guild_grade%s WHERE guild_id = %u and grade = %d", get_table_postfix(), m_data.guild_id, grade);
} }
@ -1011,7 +1011,7 @@ void CGuild::AddComment(LPCHARACTER ch, const std::string& str)
char text[GUILD_COMMENT_MAX_LEN * 2 + 1]; char text[GUILD_COMMENT_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length()); DBManager::instance().EscapeString(text, sizeof(text), str.c_str(), str.length());
DBManager::instance().FuncAfterQuery([this, ch]() { this->RefreshCommentForce(ch->GetPlayerID()); }, DBManager::instance().FuncAfterQuery(void_bind(std::bind1st(std::mem_fun(&CGuild::RefreshCommentForce),this),ch->GetPlayerID()),
"INSERT INTO guild_comment%s(guild_id, name, notice, content, time) VALUES(%u, '%s', %d, '%s', NOW())", "INSERT INTO guild_comment%s(guild_id, name, notice, content, time) VALUES(%u, '%s', %d, '%s', NOW())",
get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text); get_table_postfix(), m_data.guild_id, ch->GetName(), (str[0] == '!') ? 1 : 0, text);
} }
@ -1223,7 +1223,7 @@ void CGuild::SkillLevelUp(DWORD dwVnum)
break; break;
}*/ }*/
for (auto& ch : m_memberOnline) SendSkillInfoPacket(ch); for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind1st(std::mem_fun_ref(&CGuild::SendSkillInfoPacket),*this));
SPDLOG_DEBUG("Guild SkillUp: {} {} level {} type {}", GetName(), pkSk->dwVnum, m_data.abySkill[dwRealVnum], pkSk->dwType); SPDLOG_DEBUG("Guild SkillUp: {} {} level {} type {}", GetName(), pkSk->dwVnum, m_data.abySkill[dwRealVnum], pkSk->dwType);
} }
@ -1482,7 +1482,7 @@ void CGuild::GuildPointChange(BYTE type, int amount, bool save)
SaveSkill(); SaveSkill();
} }
for (auto& ch : m_memberOnline) SendSkillInfoPacket(ch); for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind1st(std::mem_fun_ref(&CGuild::SendSkillInfoPacket),*this));
break; break;
case POINT_EXP: case POINT_EXP:
@ -1513,7 +1513,7 @@ void CGuild::GuildPointChange(BYTE type, int amount, bool save)
ChangeLadderPoint(GUILD_LADDER_POINT_PER_LEVEL); ChangeLadderPoint(GUILD_LADDER_POINT_PER_LEVEL);
// NOTIFY_GUILD_EXP_CHANGE // NOTIFY_GUILD_EXP_CHANGE
for (auto& ch : m_memberOnline) SendGuildInfoPacket(ch); for_each(m_memberOnline.begin(), m_memberOnline.end(), std::bind1st(std::mem_fun(&CGuild::SendGuildInfoPacket), this));
// END_OF_NOTIFY_GUILD_EXP_CHANGE // END_OF_NOTIFY_GUILD_EXP_CHANGE
} }

View File

@ -284,7 +284,7 @@ int CGuildManager::GetRank(CGuild* g)
return rank; return rank;
} }
struct FGuildCompare struct FGuildCompare : public std::binary_function<CGuild*, CGuild*, bool>
{ {
bool operator () (CGuild* g1, CGuild* g2) const bool operator () (CGuild* g1, CGuild* g2) const
{ {
@ -942,13 +942,16 @@ std::vector<CGuildWarReserveForGame *> & CGuildManager::GetReserveWarRef()
void CGuildManager::ChangeMaster(DWORD dwGID) void CGuildManager::ChangeMaster(DWORD dwGID)
{ {
auto iter = m_mapGuild.find(dwGID); TGuildMap::iterator iter = m_mapGuild.find(dwGID);
if (iter != m_mapGuild.end()) if ( iter != m_mapGuild.end() )
{
iter->second->Load(dwGID); iter->second->Load(dwGID);
}
// 업데이트된 정보 보내주기 // 업데이트된 정보 보내주기
DBManager::instance().FuncQuery([iter](auto const& msg) { iter->second->SendGuildDataUpdateToAllMember(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&CGuild::SendGuildDataUpdateToAllMember), iter->second),
"SELECT 1"); "SELECT 1");
} }

View File

@ -247,7 +247,7 @@ EVENTFUNC(horse_stamina_consume_event)
} }
hr->CheckHorseHealthDropTime(); hr->CheckHorseHealthDropTime();
SPDLOG_DEBUG("HORSE STAMINA - {}", (void*) event.get()); SPDLOG_DEBUG("HORSE STAMINA - {}", (void*) get_pointer(event));
return delta; return delta;
} }
@ -278,7 +278,7 @@ EVENTFUNC(horse_stamina_regen_event)
} }
hr->CheckHorseHealthDropTime(); hr->CheckHorseHealthDropTime();
SPDLOG_DEBUG("HORSE STAMINA + {}", (void*) event.get()); SPDLOG_DEBUG("HORSE STAMINA + {}", (void*) get_pointer(event));
return delta; return delta;
@ -292,7 +292,7 @@ void CHorseRider::StartStaminaConsumeEvent()
if (GetHorseHealth() <= 0) if (GetHorseHealth() <= 0)
return; return;
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CANCEL {}", (void*) m_eventStaminaRegen.get()); SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CANCEL {}", (void*) get_pointer(m_eventStaminaRegen));
event_cancel(&m_eventStaminaRegen); event_cancel(&m_eventStaminaRegen);
if (m_eventStaminaConsume) if (m_eventStaminaConsume)
@ -302,7 +302,7 @@ void CHorseRider::StartStaminaConsumeEvent()
info->hr = this; info->hr = this;
m_eventStaminaConsume = event_create(horse_stamina_consume_event, info, PASSES_PER_SEC(HORSE_STAMINA_CONSUME_INTERVAL)); m_eventStaminaConsume = event_create(horse_stamina_consume_event, info, PASSES_PER_SEC(HORSE_STAMINA_CONSUME_INTERVAL));
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CREATE {}", (void*) m_eventStaminaConsume.get()); SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CREATE {}", (void*) get_pointer(m_eventStaminaConsume));
} }
void CHorseRider::StartStaminaRegenEvent() void CHorseRider::StartStaminaRegenEvent()
@ -313,7 +313,7 @@ void CHorseRider::StartStaminaRegenEvent()
if (GetHorseHealth() <= 0) if (GetHorseHealth() <= 0)
return; return;
SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CANCEL {}", (void*) m_eventStaminaConsume.get()); SPDLOG_DEBUG("HORSE STAMINA CONSUME EVENT CANCEL {}", (void*) get_pointer(m_eventStaminaConsume));
event_cancel(&m_eventStaminaConsume); event_cancel(&m_eventStaminaConsume);
if (m_eventStaminaRegen) if (m_eventStaminaRegen)
@ -323,7 +323,7 @@ void CHorseRider::StartStaminaRegenEvent()
info->hr = this; info->hr = this;
m_eventStaminaRegen = event_create(horse_stamina_regen_event, info, PASSES_PER_SEC(HORSE_STAMINA_REGEN_INTERVAL)); m_eventStaminaRegen = event_create(horse_stamina_regen_event, info, PASSES_PER_SEC(HORSE_STAMINA_REGEN_INTERVAL));
SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CREATE {}", (void*) m_eventStaminaRegen.get()); SPDLOG_DEBUG("HORSE STAMINA REGEN EVENT CREATE {}", (void*) get_pointer(m_eventStaminaRegen));
} }
// Health // Health
@ -358,7 +358,7 @@ void CHorseRider::UpdateHorseHealth(int iHealth, bool bSend)
void CHorseRider::HorseDie() void CHorseRider::HorseDie()
{ {
SPDLOG_DEBUG("HORSE DIE {} {}", (void*) m_eventStaminaRegen.get(), (void*) m_eventStaminaConsume.get()); SPDLOG_DEBUG("HORSE DIE {} {}", (void*) get_pointer(m_eventStaminaRegen), (void*) get_pointer(m_eventStaminaConsume));
UpdateHorseStamina(-m_Horse.sStamina); UpdateHorseStamina(-m_Horse.sStamina);
event_cancel(&m_eventStaminaRegen); event_cancel(&m_eventStaminaRegen);
event_cancel(&m_eventStaminaConsume); event_cancel(&m_eventStaminaConsume);

View File

@ -1304,13 +1304,13 @@ void CInputDB::P2P(const char * c_pData)
extern event_base* ev_base; extern event_base* ev_base;
extern evdns_base* dns_base; extern evdns_base* dns_base;
auto * p = (TPacketDGP2P *) c_pData; TPacketDGP2P * p = (TPacketDGP2P *) c_pData;
P2P_MANAGER& mgr = P2P_MANAGER::instance(); P2P_MANAGER& mgr = P2P_MANAGER::instance();
if (!DESC_MANAGER::instance().IsP2PDescExist(p->szHost, p->wPort)) if (false == DESC_MANAGER::instance().IsP2PDescExist(p->szHost, p->wPort))
{ {
LPCLIENT_DESC pkDesc = nullptr; LPCLIENT_DESC pkDesc = NULL;
SPDLOG_DEBUG("InputDB:P2P {}:{}", p->szHost, p->wPort); SPDLOG_DEBUG("InputDB:P2P {}:{}", p->szHost, p->wPort);
pkDesc = DESC_MANAGER::instance().CreateConnectionDesc(ev_base, dns_base, p->szHost, p->wPort, PHASE_P2P, false); pkDesc = DESC_MANAGER::instance().CreateConnectionDesc(ev_base, dns_base, p->szHost, p->wPort, PHASE_P2P, false);
mgr.RegisterConnector(pkDesc); mgr.RegisterConnector(pkDesc);
@ -1682,7 +1682,7 @@ void CInputDB::ReloadProto(const char * c_pData)
CMotionManager::instance().Build(); CMotionManager::instance().Build();
CHARACTER_MANAGER::instance().for_each_pc([](auto& pc) { pc->ComputePoints(); }); CHARACTER_MANAGER::instance().for_each_pc(std::mem_fun(&CHARACTER::ComputePoints));
} }
void CInputDB::GuildSkillUsableChange(const char* c_pData) void CInputDB::GuildSkillUsableChange(const char* c_pData)

View File

@ -49,7 +49,7 @@ void LogManager::ItemLog(DWORD dwPID, DWORD x, DWORD y, DWORD dwItemID, const ch
{ {
m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), c_pszHint, strlen(c_pszHint)); m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), c_pszHint, strlen(c_pszHint));
Query("INSERT INTO log%s (type, time, who, x, y, what, how, hint, ip, vnum) VALUES('ITEM', NOW(), %u, %u, %u, %u, '%s', '%s', '%s', %u)", Query("INSERT DELAYED INTO log%s (type, time, who, x, y, what, how, hint, ip, vnum) VALUES('ITEM', NOW(), %u, %u, %u, %u, '%s', '%s', '%s', %u)",
get_table_postfix(), dwPID, x, y, dwItemID, c_pszText, __escape_hint, c_pszIP, dwVnum); get_table_postfix(), dwPID, x, y, dwItemID, c_pszText, __escape_hint, c_pszIP, dwVnum);
} }
@ -76,7 +76,7 @@ void LogManager::CharLog(DWORD dwPID, DWORD x, DWORD y, DWORD dwValue, const cha
{ {
m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), c_pszHint, strlen(c_pszHint)); m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), c_pszHint, strlen(c_pszHint));
Query("INSERT INTO log%s (type, time, who, x, y, what, how, hint, ip) VALUES('CHARACTER', NOW(), %u, %u, %u, %u, '%s', '%s', '%s')", Query("INSERT DELAYED INTO log%s (type, time, who, x, y, what, how, hint, ip) VALUES('CHARACTER', NOW(), %u, %u, %u, %u, '%s', '%s', '%s')",
get_table_postfix(), dwPID, x, y, dwValue, c_pszText, __escape_hint, c_pszIP); get_table_postfix(), dwPID, x, y, dwValue, c_pszText, __escape_hint, c_pszIP);
} }
@ -90,7 +90,7 @@ void LogManager::CharLog(LPCHARACTER ch, DWORD dw, const char * c_pszText, const
void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime) void LogManager::LoginLog(bool isLogin, DWORD dwAccountID, DWORD dwPID, BYTE bLevel, BYTE bJob, DWORD dwPlayTime)
{ {
Query("INSERT INTO loginlog%s (type, time, channel, account_id, pid, level, job, playtime) VALUES (%s, NOW(), %d, %u, %u, %d, %d, %u)", Query("INSERT DELAYED INTO loginlog%s (type, time, channel, account_id, pid, level, job, playtime) VALUES (%s, NOW(), %d, %u, %u, %d, %d, %u)",
get_table_postfix(), isLogin ? "'LOGIN'" : "'LOGOUT'", g_bChannel, dwAccountID, dwPID, bLevel, bJob, dwPlayTime); get_table_postfix(), isLogin ? "'LOGIN'" : "'LOGOUT'", g_bChannel, dwAccountID, dwPID, bLevel, bJob, dwPlayTime);
} }
@ -102,7 +102,7 @@ void LogManager::MoneyLog(BYTE type, DWORD vnum, int gold)
return; return;
} }
Query("INSERT INTO money_log%s VALUES (NOW(), %d, %d, %d)", get_table_postfix(), type, vnum, gold); Query("INSERT DELAYED INTO money_log%s VALUES (NOW(), %d, %d, %d)", get_table_postfix(), type, vnum, gold);
} }
void LogManager::HackLog(const char * c_pszHackName, const char * c_pszLogin, const char * c_pszName, const char * c_pszIP) void LogManager::HackLog(const char * c_pszHackName, const char * c_pszLogin, const char * c_pszName, const char * c_pszIP)
@ -167,13 +167,13 @@ void LogManager::GoldBarLog(DWORD dwPID, DWORD dwItemID, GOLDBAR_HOW eHow, const
break; break;
} }
Query("INSERT INTO goldlog%s (date, time, pid, what, how, hint) VALUES(CURDATE(), CURTIME(), %u, %u, %s, '%s')", Query("INSERT DELAYED INTO goldlog%s (date, time, pid, what, how, hint) VALUES(CURDATE(), CURTIME(), %u, %u, %s, '%s')",
get_table_postfix(), dwPID, dwItemID, szHow, c_pszHint); get_table_postfix(), dwPID, dwItemID, szHow, c_pszHint);
} }
void LogManager::CubeLog(DWORD dwPID, DWORD x, DWORD y, DWORD item_vnum, DWORD item_uid, int item_count, bool success) void LogManager::CubeLog(DWORD dwPID, DWORD x, DWORD y, DWORD item_vnum, DWORD item_uid, int item_count, bool success)
{ {
Query("INSERT INTO cube%s (pid, time, x, y, item_vnum, item_uid, item_count, success) " Query("INSERT DELAYED INTO cube%s (pid, time, x, y, item_vnum, item_uid, item_count, success) "
"VALUES(%u, NOW(), %u, %u, %u, %u, %d, %d)", "VALUES(%u, NOW(), %u, %u, %u, %u, %d, %d)",
get_table_postfix(), dwPID, x, y, item_vnum, item_uid, item_count, success?1:0); get_table_postfix(), dwPID, x, y, item_vnum, item_uid, item_count, success?1:0);
} }
@ -187,7 +187,7 @@ void LogManager::SpeedHackLog(DWORD pid, DWORD x, DWORD y, int hack_count)
void LogManager::ChangeNameLog(DWORD pid, const char *old_name, const char *new_name, const char *ip) void LogManager::ChangeNameLog(DWORD pid, const char *old_name, const char *new_name, const char *ip)
{ {
Query("INSERT INTO change_name%s (pid, old_name, new_name, time, ip) " Query("INSERT DELAYED INTO change_name%s (pid, old_name, new_name, time, ip) "
"VALUES(%u, '%s', '%s', NOW(), '%s') ", "VALUES(%u, '%s', '%s', NOW(), '%s') ",
get_table_postfix(), pid, old_name, new_name, ip); get_table_postfix(), pid, old_name, new_name, ip);
} }
@ -196,7 +196,7 @@ void LogManager::GMCommandLog(DWORD dwPID, const char* szName, const char* szIP,
{ {
m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), szCommand, strlen(szCommand)); m_sql.EscapeString(__escape_hint, sizeof(__escape_hint), szCommand, strlen(szCommand));
Query("INSERT INTO command_log%s (userid, server, ip, port, username, command, date ) " Query("INSERT DELAYED INTO command_log%s (userid, server, ip, port, username, command, date ) "
"VALUES(%u, 999, '%s', %u, '%s', '%s', NOW()) ", "VALUES(%u, 999, '%s', %u, '%s', '%s', NOW()) ",
get_table_postfix(), dwPID, szIP, byChannel, szName, __escape_hint); get_table_postfix(), dwPID, szIP, byChannel, szName, __escape_hint);
} }

View File

@ -513,9 +513,9 @@ int start(int argc, char **argv)
switch (ch) switch (ch)
{ {
case 'I': // IP case 'I': // IP
g_szPublicIP = std::string(optarg); strlcpy(g_szPublicIP, optarg, sizeof(g_szPublicIP));
printf("IP %s\n", g_szPublicIP.c_str()); printf("IP %s\n", g_szPublicIP);
break; break;
@ -596,11 +596,11 @@ int start(int argc, char **argv)
// Initialize the network stack // Initialize the network stack
// Check if the public and internal IP addresses were configured // Check if the public and internal IP addresses were configured
if (g_szInternalIP.empty()) { if (g_szInternalIP[0] == '0') {
SPDLOG_CRITICAL("Internal IP address could not be automatically detected. Manually set the IP and try again."); SPDLOG_CRITICAL("Public IP address could not be automatically detected. Manually set the IP and try again.");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if (g_szPublicIP.empty()) { if (g_szPublicIP[0] == '0') {
SPDLOG_CRITICAL("Public IP address could not be automatically detected. Manually set the IP and try again."); SPDLOG_CRITICAL("Public IP address could not be automatically detected. Manually set the IP and try again.");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
@ -622,7 +622,7 @@ int start(int argc, char **argv)
// Main TCP listener // Main TCP listener
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(g_szPublicBindIP.c_str()); sin.sin_addr.s_addr = inet_addr(g_szPublicBindIP);
sin.sin_port = htons(mother_port); sin.sin_port = htons(mother_port);
tcp_listener = evconnlistener_new_bind( tcp_listener = evconnlistener_new_bind(
@ -640,7 +640,7 @@ int start(int argc, char **argv)
// Game P2P listener // Game P2P listener
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(g_szInternalBindIP.c_str()); sin.sin_addr.s_addr = inet_addr(g_szInternalBindIP);
sin.sin_port = htons(p2p_port); sin.sin_port = htons(p2p_port);
p2p_listener = evconnlistener_new_bind( p2p_listener = evconnlistener_new_bind(
@ -711,12 +711,12 @@ void destroy()
if (p2p_listener) { if (p2p_listener) {
evconnlistener_free(p2p_listener); evconnlistener_free(p2p_listener);
p2p_listener = nullptr; tcp_listener = nullptr;
} }
if (dns_base) { if (dns_base) {
evdns_base_free(dns_base, 0); evdns_base_free(dns_base, 0);
dns_base = nullptr; ev_base = nullptr;
} }
if (ev_base) { if (ev_base) {

View File

@ -43,7 +43,7 @@ void MessengerManager::Login(MessengerManager::keyA account)
if (m_set_loginAccount.find(account) != m_set_loginAccount.end()) if (m_set_loginAccount.find(account) != m_set_loginAccount.end())
return; return;
DBManager::instance().FuncQuery([this](auto const& msg) { LoadList(msg); }, DBManager::instance().FuncQuery(std::bind1st(std::mem_fun(&MessengerManager::LoadList), this),
"SELECT account, companion FROM messenger_list%s WHERE account='%s'", get_table_postfix(), account.c_str()); "SELECT account, companion FROM messenger_list%s WHERE account='%s'", get_table_postfix(), account.c_str());
m_set_loginAccount.insert(account); m_set_loginAccount.insert(account);

View File

@ -109,7 +109,7 @@ bool CMobManager::Initialize(TMobTable * pTable, int iSize)
// END_OF_LOCALE_SERVICE // END_OF_LOCALE_SERVICE
//exit(EXIT_FAILURE); //exit(EXIT_FAILURE);
CHARACTER_MANAGER::instance().for_each_pc([this](auto& pc) { RebindMobProto(pc); }); CHARACTER_MANAGER::instance().for_each_pc(std::bind1st(std::mem_fun(&CMobManager::RebindMobProto),this));
return true; return true;
} }

View File

@ -1415,6 +1415,10 @@ struct packet_quest_info
WORD size; WORD size;
WORD index; WORD index;
BYTE flag; BYTE flag;
#if defined(__QUEST_RENEWAL__)
BYTE type;
bool is_confirmed;
#endif
}; };
enum enum

View File

@ -199,9 +199,44 @@ namespace quest
CloseState(*pPC->GetRunningQuestState()); CloseState(*pPC->GetRunningQuestState());
pPC->EndRunning(); pPC->EndRunning();
} }
} }
#if defined(__QUEST_RENEWAL__)
int CQuestManager::ReadQuestCategoryFile(WORD quest_index)
{
// ¹ÞÀº quest_index¸¦ quest_name·Î º¯È¯ ÈÄ ºñ±³
int quest_type = 0;
string quest_name = CQuestManager::instance().GetQuestNameByIndex(quest_index);
ifstream file((g_stQuestDir + "/questcategory.txt").c_str());
if (file)
{
std::string line;
while (getline(file, line))
{
line.erase(remove(line.begin(), line.end(), ' '), line.end()); // remove all white spaces
if (line.empty() || line.front() == '#')
continue; // Skip empty lines or lines starting with #
int type = stoi(line.substr(0, line.find('\t')));
string name = line.substr(line.find('\t') + 1);
if (test_server)
SPDLOG_DEBUG("QUEST reading script of %s(%d)", name.c_str(), type);
if (quest_name == name)
{
quest_type = type;
break;
}
}
}
else
SPDLOG_ERROR("QUEST Cannot open 'questcategory.txt'");
return quest_type;
}
#endif
void CQuestManager::Input(unsigned int pc, const char* msg) void CQuestManager::Input(unsigned int pc, const char* msg)
{ {
PC* pPC = GetPC(pc); PC* pPC = GetPC(pc);
@ -1676,7 +1711,7 @@ namespace quest
void CQuestManager::AddServerTimer(const std::string& name, DWORD arg, LPEVENT event) void CQuestManager::AddServerTimer(const std::string& name, DWORD arg, LPEVENT event)
{ {
SPDLOG_DEBUG("XXX AddServerTimer {} {} {}", name, arg, (void*) event.get()); SPDLOG_DEBUG("XXX AddServerTimer {} {} {}", name, arg, (void*) get_pointer(event));
if (m_mapServerTimer.find(make_pair(name, arg)) != m_mapServerTimer.end()) if (m_mapServerTimer.find(make_pair(name, arg)) != m_mapServerTimer.end())
{ {
SPDLOG_ERROR("already registered server timer name:{} arg:{}", name, arg); SPDLOG_ERROR("already registered server timer name:{} arg:{}", name, arg);

View File

@ -181,6 +181,10 @@ namespace quest
#endif #endif
void RegisterNPCVnum(DWORD dwVnum); void RegisterNPCVnum(DWORD dwVnum);
#if defined(__QUEST_RENEWAL__)
// Quest Category
int ReadQuestCategoryFile(WORD quest_index);
#endif
private: private:
LPDUNGEON m_pSelectedDungeon; LPDUNGEON m_pSelectedDungeon;

View File

@ -778,6 +778,20 @@ namespace quest
return false; return false;
} }
#if defined(__QUEST_RENEWAL__)
CQuestManager& rkQmgr = CQuestManager::instance();
const LPCHARACTER c_lpCh = rkQmgr.GetCurrentCharacterPtr();
if (c_lpCh != NULL)
{
char szBuf[255]{};
snprintf(szBuf, sizeof(szBuf), "%s.%s", questName, "is_confirmed");
c_lpCh->SetQuestFlag(string(questName) + ".is_confirmed", 1);
if (test_server)
SPDLOG_DEBUG("NPC::OnInfo: pc (name) %s has confirmed the quest %s", c_lpCh->GetName(), questName);
}
#endif
CQuestManager::ExecuteQuestScript(pc, quest_index, itPCQuest->second.st, itQuestScript->second.GetCode(), itQuestScript->second.GetSize()); CQuestManager::ExecuteQuestScript(pc, quest_index, itPCQuest->second.st, itQuestScript->second.GetCode(), itQuestScript->second.GetSize());
return true; return true;
} }

View File

@ -165,7 +165,7 @@ namespace quest
{ {
RemoveTimer(name); RemoveTimer(name);
m_TimerMap.insert(make_pair(name, pEvent)); m_TimerMap.insert(make_pair(name, pEvent));
SPDLOG_DEBUG("QUEST add timer {} {}", (void*) pEvent.get(), m_TimerMap.size()); SPDLOG_DEBUG("QUEST add timer {} {}", (void*) get_pointer(pEvent), m_TimerMap.size());
} }
void PC::RemoveTimerNotCancel(const string & name) void PC::RemoveTimerNotCancel(const string & name)
@ -174,7 +174,7 @@ namespace quest
if (it != m_TimerMap.end()) if (it != m_TimerMap.end())
{ {
SPDLOG_DEBUG("QUEST remove with no cancel {}", (void*) it->second.get()); SPDLOG_DEBUG("QUEST remove with no cancel {}", (void*) get_pointer(it->second));
m_TimerMap.erase(it); m_TimerMap.erase(it);
} }
@ -187,7 +187,7 @@ namespace quest
if (it != m_TimerMap.end()) if (it != m_TimerMap.end())
{ {
SPDLOG_DEBUG("QUEST remove timer {}", (void*) it->second.get()); SPDLOG_DEBUG("QUEST remove timer {}", (void*) get_pointer(it->second));
CancelTimerEvent(&it->second); CancelTimerEvent(&it->second);
m_TimerMap.erase(it); m_TimerMap.erase(it);
} }
@ -236,6 +236,14 @@ namespace quest
qi.size = sizeof(struct packet_quest_info); qi.size = sizeof(struct packet_quest_info);
qi.index = m_RunningQuestState->iIndex; qi.index = m_RunningQuestState->iIndex;
qi.flag = m_iSendToClient; qi.flag = m_iSendToClient;
#if defined(__QUEST_RENEWAL__)
qi.type = CQuestManager::instance().ReadQuestCategoryFile(qi.index);
qi.is_confirmed = false;
const LPCHARACTER c_lpCh = CQuestManager::instance().GetCurrentCharacterPtr();
if (c_lpCh != NULL)
qi.is_confirmed = static_cast<bool>(c_lpCh->GetQuestFlag(m_stCurQuest + ".is_confirmed"));
#endif
TEMP_BUFFER buf; TEMP_BUFFER buf;
buf.write(&qi, sizeof(qi)); buf.write(&qi, sizeof(qi));

View File

@ -43,6 +43,34 @@ namespace quest
QUEST_SEND_ICON_FILE = (1 << 6), // 24자 까지 QUEST_SEND_ICON_FILE = (1 << 6), // 24자 까지
}; };
#if defined(__QUEST_RENEWAL__)
enum EQuestType
{
QUEST_TYPE_MAIN,
QUEST_TYPE_SUB,
QUEST_TYPE_LEVELUP,
QUEST_TYPE_EVENT,
QUEST_TYPE_COLLECTION,
QUEST_TYPE_SYSTEM,
QUEST_TYPE_SCROLL,
QUEST_TYPE_DAILY,
QUEST_TYPE_UNEXPOSED,
QUEST_TYPE_MAX
};
enum EQuestSkin
{
QUEST_SKIN_NOWINDOW,
QUEST_SKIN_NORMAL,
QUEST_SKIN_UNKOWN1,
QUEST_SKIN_UNKOWN2,
QUEST_SKIN_SCROLL,
QUEST_SKIN_CINEMATIC,
QUEST_SKIN_COUNT,
QUEST_SKIN_MAX
};
#endif
typedef map<unsigned int, QuestState> QuestInfo; typedef map<unsigned int, QuestState> QuestInfo;
typedef QuestInfo::iterator QuestInfoIterator; typedef QuestInfo::iterator QuestInfoIterator;

View File

@ -2,23 +2,29 @@
#include "../../libgame/include/grid.h" #include "../../libgame/include/grid.h"
#include "constants.h" #include "constants.h"
#include "utils.h" #include "utils.h"
#include "config.h"
#include "shop.h" #include "shop.h"
#include "desc.h" #include "desc.h"
#include "desc_manager.h"
#include "char.h" #include "char.h"
#include "char_manager.h" #include "char_manager.h"
#include "item.h" #include "item.h"
#include "item_manager.h" #include "item_manager.h"
#include "buffer_manager.h"
#include "packet.h" #include "packet.h"
#include "log.h"
#include "db.h" #include "db.h"
#include "questmanager.h" #include "questmanager.h"
#include "monarch.h" #include "monarch.h"
#include "mob_manager.h" #include "mob_manager.h"
#include "locale_service.h" #include "locale_service.h"
#include "desc_client.h"
#include "shop_manager.h" #include "shop_manager.h"
#include "group_text_parse_tree.h" #include "group_text_parse_tree.h"
#include "shopEx.h" #include "shopEx.h"
#include <boost/algorithm/string/predicate.hpp>
#include "shop_manager.h"
#include <cctype> #include <cctype>
#include <algorithm>
CShopManager::CShopManager() CShopManager::CShopManager()
{ {
@ -382,11 +388,11 @@ bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
stCoinType = "Gold"; stCoinType = "Gold";
} }
if (iequals(stCoinType, "Gold")) if (boost::iequals(stCoinType, "Gold"))
{ {
shopTable.coinType = SHOP_COIN_TYPE_GOLD; shopTable.coinType = SHOP_COIN_TYPE_GOLD;
} }
else if (iequals(stCoinType, "SecondaryCoin")) else if (boost::iequals(stCoinType, "SecondaryCoin"))
{ {
shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN; shopTable.coinType = SHOP_COIN_TYPE_SECONDARY_COIN;
} }
@ -436,11 +442,11 @@ bool ConvertToShopItemTable(IN CGroupNode* pNode, OUT TShopTableEx& shopTable)
stSort = "None"; stSort = "None";
} }
if (iequals(stSort, "Asc")) if (boost::iequals(stSort, "Asc"))
{ {
std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName); std::sort(shopItems.begin(), shopItems.end(), CompareShopItemName);
} }
else if (iequals(stSort, "Desc")) else if(boost::iequals(stSort, "Desc"))
{ {
std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName); std::sort(shopItems.rbegin(), shopItems.rend(), CompareShopItemName);
} }

View File

@ -230,12 +230,3 @@ bool WildCaseCmp(const char *w, const char *s)
return false; return false;
} }
bool ichar_equals(char a, char b)
{
return std::tolower(static_cast<unsigned char>(a)) == std::tolower(static_cast<unsigned char>(b));
}
bool iequals(const std::string& a, const std::string& b)
{
return std::equal(a.begin(), a.end(), b.begin(), b.end(), ichar_equals);
}

View File

@ -1,6 +1,8 @@
#pragma once
#include <cmath> #ifndef __INC_METIN_II_UTILS_H__
#define __INC_METIN_II_UTILS_H__
#include <math.h>
#define IS_SET(flag, bit) ((flag) & (bit)) #define IS_SET(flag, bit) ((flag) & (bit))
#define SET_BIT(var, bit) ((var) |= (bit)) #define SET_BIT(var, bit) ((var) |= (bit))
@ -62,5 +64,5 @@ extern int parse_time_str(const char* str);
extern bool WildCaseCmp(const char *w, const char *s); extern bool WildCaseCmp(const char *w, const char *s);
extern bool ichar_equals(char a, char b); #endif /* __INC_METIN_II_UTILS_H__ */
extern bool iequals(const std::string& a, const std::string& b);

View File

@ -68,7 +68,7 @@ namespace marriage
{ {
if (m_pEndEvent) if (m_pEndEvent)
{ {
SPDLOG_ERROR("WeddingMap::SetEnded - ALREADY EndEvent(m_pEndEvent={})", (void*) m_pEndEvent.get()); SPDLOG_ERROR("WeddingMap::SetEnded - ALREADY EndEvent(m_pEndEvent={})", (void*) get_pointer(m_pEndEvent));
return; return;
} }

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 2.8)
project(libgame CXX) project(libgame CXX)
@ -11,11 +11,12 @@ file(GLOB SOURCES
# Include header files # Include header files
include_directories("include") include_directories("include")
find_package(Boost REQUIRED)
# Create shared library # Create shared library
add_library(${PROJECT_NAME} STATIC ${SOURCES}) add_library(${PROJECT_NAME} STATIC ${SOURCES})
# Find and link dependencies if (Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
# spdlog target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
find_package(spdlog CONFIG REQUIRED) endif (Boost_FOUND)
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 3.0)
project(liblua CXX) project(liblua CXX)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 2.8)
project(libpoly CXX) project(libpoly CXX)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 2.8)
project(libsql CXX) project(libsql CXX)
@ -14,12 +14,10 @@ include_directories("include")
# Create shared library # Create shared library
add_library(${PROJECT_NAME} STATIC ${SOURCES}) add_library(${PROJECT_NAME} STATIC ${SOURCES})
# Find and link dependencies # Find dependencies
find_package(unofficial-libmysql REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE unofficial::libmysql::libmysql)
# MariaDB find_package(Boost REQUIRED)
find_package(unofficial-libmariadb REQUIRED) include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PUBLIC unofficial::libmariadb) target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})
# spdlog
find_package(spdlog CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE spdlog::spdlog)

View File

@ -132,14 +132,6 @@ bool CAsyncSQL::Connect()
} }
} }
// Disable MYSQL_OPT_SSL_VERIFY_SERVER_CERT (enabled by default in libmariadb >=3.4)
bool verifyServerCert = false;
if (mysql_options(&m_hDB, MYSQL_OPT_SSL_VERIFY_SERVER_CERT, &verifyServerCert) != 0)
{
SPDLOG_ERROR("Disabling MYSQL_OPT_SSL_VERIFY_SERVER_CERT failed: {}", mysql_error(&m_hDB));
return false;
}
if (!mysql_real_connect(&m_hDB, m_stHost.c_str(), m_stUser.c_str(), m_stPassword.c_str(), m_stDB.c_str(), m_iPort, NULL, CLIENT_MULTI_STATEMENTS)) if (!mysql_real_connect(&m_hDB, m_stHost.c_str(), m_stUser.c_str(), m_stPassword.c_str(), m_stDB.c_str(), m_iPort, NULL, CLIENT_MULTI_STATEMENTS))
{ {
SPDLOG_ERROR("MySQL connection failed: {}", mysql_error(&m_hDB)); SPDLOG_ERROR("MySQL connection failed: {}", mysql_error(&m_hDB));
@ -151,7 +143,7 @@ bool CAsyncSQL::Connect()
if (0 != mysql_options(&m_hDB, MYSQL_OPT_RECONNECT, &reconnect)) if (0 != mysql_options(&m_hDB, MYSQL_OPT_RECONNECT, &reconnect))
SPDLOG_ERROR("Setting MYSQL_OPT_RECONNECT via mysql_options failed: {}", mysql_error(&m_hDB)); SPDLOG_ERROR("Setting MYSQL_OPT_RECONNECT via mysql_options failed: {}", mysql_error(&m_hDB));
SPDLOG_INFO("AsyncSQL: connected to {}", m_stHost); SPDLOG_INFO("AsyncSQL: connected to {} (reconnect {})", m_stHost, m_hDB.reconnect);
// db cache는 common db의 LOCALE 테이블에서 locale을 알아오고, 이후 character set을 수정한다. // db cache는 common db의 LOCALE 테이블에서 locale을 알아오고, 이후 character set을 수정한다.
// 따라서 최초 Connection을 맺을 때에는 locale을 모르기 때문에 character set을 정할 수가 없음에도 불구하고, // 따라서 최초 Connection을 맺을 때에는 locale을 모르기 때문에 character set을 정할 수가 없음에도 불구하고,

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 2.8)
project(libthecore CXX) project(libthecore CXX)
@ -14,7 +14,14 @@ include_directories("include")
# Create shared library # Create shared library
add_library(${PROJECT_NAME} STATIC ${SOURCES}) add_library(${PROJECT_NAME} STATIC ${SOURCES})
# Find and link dependencies #
# vcpkg dependencies
#
# Boost
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})
# fmt # fmt
find_package(fmt CONFIG REQUIRED) find_package(fmt CONFIG REQUIRED)

View File

@ -1,4 +1,4 @@
cmake_minimum_required(VERSION 3.8) cmake_minimum_required(VERSION 2.8)
project(quest CXX) project(quest CXX)
@ -7,13 +7,19 @@ file(GLOB_RECURSE sources
src/*.c src/*.c
) )
# Add the src directory to the include path
include_directories(src) include_directories(src)
# Find dependencies
find_package(Boost REQUIRED)
add_executable(${PROJECT_NAME} ${sources}) add_executable(${PROJECT_NAME} ${sources})
set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qc") set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME "qc")
# Find and link dependencies # Link dependencies if found
if (Boost_FOUND)
include_directories(${Boost_INCLUDE_DIRS})
target_link_libraries (${PROJECT_NAME} ${Boost_LIBRARIES})
endif (Boost_FOUND)
# liblua
target_link_libraries(${PROJECT_NAME} liblua) target_link_libraries(${PROJECT_NAME} liblua)
target_include_directories(${PROJECT_NAME} PUBLIC . ../liblua)

View File

@ -20,9 +20,18 @@ extern "C" {
#include <sstream> #include <sstream>
#include <utility> #include <utility>
#include <vector> #include <vector>
#ifndef __WIN32__
#include <unistd.h> #include <unistd.h>
#else
#include <boost/typeof/typeof.hpp>
#define typeof(t) BOOST_TYPEOF(t)
#include <direct.h>
#define mkdir(path, mode) _mkdir(path)
#endif
#include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <cerrno> #include <errno.h>
#include "crc32.h" #include "crc32.h"