Compare commits

..

No commits in common. "master" and "nightly" have entirely different histories.

62 changed files with 662 additions and 1127 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
@ -19,7 +15,4 @@ gamefiles/data/quest/pre_qc/
gamefiles/data/quest/qc gamefiles/data/quest/qc
# Test folder # Test folder
test/ test/
# Built files
build/

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
@ -9,7 +9,7 @@ RUN echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https:
# Update the system and install various dependencies # Update the system and install various dependencies
RUN apt-get update && \ RUN apt-get update && \
apt-get install -y git cmake ninja-build build-essential tar curl zip unzip pkg-config autoconf python3 \ apt-get install -y git cmake ninja-build build-essential tar curl zip unzip pkg-config autoconf python3 \
libdevil-dev libncurses5-dev libbsd-dev libdevil-dev libncurses5-dev libbsd-dev
# Arm specific # Arm specific
ENV VCPKG_FORCE_SYSTEM_BINARIES=1 ENV VCPKG_FORCE_SYSTEM_BINARIES=1
@ -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
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
``` ```
#### 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,9 +79,8 @@ 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.
## 4. Bugfixes ## 4. Bugfixes
**WARNING: This project is based on the "kraizy" leak. That was over 10 years ago. **WARNING: This project is based on the "kraizy" leak. That was over 10 years ago.
@ -141,7 +101,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

@ -46,13 +46,13 @@ 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())
local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{} local fi,t,out = 'mysql_data_'..math.random(10^9)+math.random(2^4,2^10),{},{}
--os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) -- f<EFBFBD>r MySQL51 --os.execute('mysql '..pre..' --e='..string.format('%q',query)..' > '..fi) -- für MySQL51
os.execute('mysql '..pre..' -e'..string.format('%q',query)..' > '..fi) -- f<EFBFBD>r MySQL55 os.execute('mysql '..pre..' -e'..string.format('%q',query)..' > '..fi) -- für MySQL55
for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi); for av in io.open(fi,'r'):lines() do table.insert(t,split(av,'\t')) end; os.remove(fi);
for i = 2, table.getn(t) do table.foreach(t[i],function(a,b) for i = 2, table.getn(t) do table.foreach(t[i],function(a,b)
out[i-1] = out[i-1] or {} out[i-1] = out[i-1] or {}
@ -100,7 +100,7 @@ function mysql_query_old(query,user,pass,db,ip)
os.remove(path) os.remove(path)
if type(q.l[1]) ~= "table" then if type(q.l[1]) ~= "table" then
return "ERROR" return "ERROR"
--error("Fehler bei der MySQL Verbindung oder bei der R<EFBFBD>ckgabe! Abbruch!") --error("Fehler bei der MySQL Verbindung oder bei der Rückgabe! Abbruch!")
end end
local ix = 0 local ix = 0
table.foreachi(q.l,function(i,l) table.foreachi(q.l,function(i,l)
@ -115,7 +115,7 @@ function mysql_query_old(query,user,pass,db,ip)
end) end end) end
end) end)
-- ENDE der eigentlichen MySQL-Funktion -- ENDE der eigentlichen MySQL-Funktion
-- START Zusatz: Hanashi-Kompatibilit<EFBFBD>t & Fehlerbehandlung -- START Zusatz: Hanashi-Kompatibilität & Fehlerbehandlung
q.out.__data = q.l[1] q.out.__data = q.l[1]
setmetatable(q.out, { __index = function(a,b) setmetatable(q.out, { __index = function(a,b)
if type(b) == "number" then if type(b) == "number" then
@ -132,7 +132,7 @@ end
@name define @name define
@author Mijago @author Mijago
@descr @descr
Gibt die M<EFBFBD>glichkeit, globale Variablen zu definieren. Es k<EFBFBD>nnen auch Funktionen genutzt werden! Diese werden dann AUSGEF<EFBFBD>HRT zur<EFBFBD>ckgegeben! Gibt die Möglichkeit, globale Variablen zu definieren. Es können auch Funktionen genutzt werden! Diese werden dann AUSGEFÜHRT zurückgegeben!
--]] --]]
_G.__data = {} _G.__data = {}
local meta = getmetatable(_G) or {} local meta = getmetatable(_G) or {}
@ -155,7 +155,7 @@ end
@name duration @name duration
@author Mijago @author Mijago
@descr @descr
Gibt die verbleibende Zeit als String zur<EFBFBD>ck. Gibt die verbleibende Zeit als String zurück.
--]] --]]
function duration(ipe) function duration(ipe)
local ipe,dat= ipe or 0,'' local ipe,dat= ipe or 0,''
@ -183,7 +183,7 @@ end
@name is_number @name is_number
@author Mijago @author Mijago
@descr @descr
Pr<EFBFBD>ft, ob eine Variable eine Zahl ist. Prüft, ob eine Variable eine Zahl ist.
--]] --]]
function is_number(var) function is_number(var)
return (type(var) == "number") return (type(var) == "number")
@ -194,7 +194,7 @@ end
@name is_string @name is_string
@author Mijago @author Mijago
@descr @descr
Pr<EFBFBD>ft, ob eine Variable ein String ist. Prüft, ob eine Variable ein String ist.
--]] --]]
function is_string(var) function is_string(var)
return (type(var) == "string") return (type(var) == "string")
@ -205,7 +205,7 @@ end
@name is_table @name is_table
@author Mijago @author Mijago
@descr @descr
Pr<EFBFBD>ft, ob eine Variable eine Tabelle ist. Prüft, ob eine Variable eine Tabelle ist.
--]] --]]
function is_table(var) function is_table(var)
return (type(var) == "table") return (type(var) == "table")
@ -216,7 +216,7 @@ end
@name in_table @name in_table
@author Mijago @author Mijago
@descr @descr
Pr<EFBFBD>ft, ob eine Variablei in einer Tabelle ist. Prüft, ob eine Variablei in einer Tabelle ist.
Aufruf: in_table(var,table) Aufruf: in_table(var,table)
--]] --]]
function in_table ( e, t ) function in_table ( e, t )
@ -292,7 +292,7 @@ end
@name math.minmax @name math.minmax
@author Mijago @author Mijago
@descr @descr
Erm<EFBFBD>glicht die Angabe von min und max auf einmal Ermöglicht die Angabe von min und max auf einmal
--]] --]]
math.minmax = function(min,num,max) math.minmax = function(min,num,max)
return math.min(math.max(num,min),max) return math.min(math.max(num,min),max)
@ -304,8 +304,8 @@ end
@name n_input @name n_input
@author Mijago @author Mijago
@descr @descr
F<EFBFBD>r Inputs nur f<EFBFBD>r Zahlen. Für Inputs nur r Zahlen.
Die Zahl ist IMMER positiv. Wenn sie nicht g<EFBFBD>ltig ist, ist sie 0. Die Zahl ist IMMER positiv. Wenn sie nicht gültig ist, ist sie 0.
--]] --]]
function n_input() function n_input()
return math.abs(tonumber(input()) or 0) return math.abs(tonumber(input()) or 0)
@ -316,7 +316,7 @@ end
@name long_input @name long_input
@author Mijago @author Mijago
@descr @descr
Erm<EFBFBD>glicht es, l<EFBFBD>ngere Inputs zu nutzen. Ermöglicht es, ngere Inputs zu nutzen.
--]] --]]
function long_input() function long_input()
local str,t = "",input() local str,t = "",input()
@ -358,7 +358,7 @@ function select2(tab,...)
outputstr=outputstr..'sel = select("'..l..'"' outputstr=outputstr..'sel = select("'..l..'"'
elseif outputcount == max and tablen > outputcount+incit then elseif outputcount == max and tablen > outputcount+incit then
if tablen ~= outputcount+incit+1 then if tablen ~= outputcount+incit+1 then
outputstr=outputstr..',"'..l..'","N<EFBFBD>chste Seite") + '..incit..' ' outputstr=outputstr..',"'..l..'","Nächste Seite") + '..incit..' '
if nextc > 0 then if nextc > 0 then
outputstr = outputstr..'end ' outputstr = outputstr..'end '
end end
@ -392,7 +392,7 @@ end
@descr @descr
Wie Select2: Wie Select2:
Eine Tabelle oder eine Stringliste wird auf Seiten aufgeteilt. Eine Tabelle oder eine Stringliste wird auf Seiten aufgeteilt.
Weiter, Zur<EFBFBD>ck und Abbrechen (-1) Buttons. Weiter, Zurück und Abbrechen (-1) Buttons.
--]] --]]
function select3(...) function select3(...)
arg.n = nil arg.n = nil
@ -438,7 +438,7 @@ function select3(...)
pe[i] = copy_tab(px[i]) pe[i] = copy_tab(px[i])
local next,back,exit = 0,0,0 local next,back,exit = 0,0,0
if i < table.getn(pe) and table.getn(pe) ~=1 then table.insert(pe[i],table.getn(pe[i])+1,'Weiter zu Seite '..(i+1)); next = table.getn(pe[i]) end if i < table.getn(pe) and table.getn(pe) ~=1 then table.insert(pe[i],table.getn(pe[i])+1,'Weiter zu Seite '..(i+1)); next = table.getn(pe[i]) end
if i > 1 then table.insert(pe[i],table.getn(pe[i])+1,'Zur<EFBFBD>ck zu Seite '..(i-1)); back = table.getn(pe[i]) end if i > 1 then table.insert(pe[i],table.getn(pe[i])+1,'Zurück zu Seite '..(i-1)); back = table.getn(pe[i]) end
table.insert(pe[i],table.getn(pe[i])+1,'Abbruch'); exit = table.getn(pe[i]) table.insert(pe[i],table.getn(pe[i])+1,'Abbruch'); exit = table.getn(pe[i])
if table.getn(pe) > 1 then if table.getn(pe) > 1 then
say('Seite '..i..' von '..table.getn(pe)) say('Seite '..i..' von '..table.getn(pe))
@ -564,7 +564,7 @@ zt.s_ms = function(s)
@name Autoumbruch in Say @name Autoumbruch in Say
@author Mijago @author Mijago
@descr @descr
F<EFBFBD>gt die Funktion say2 an. Fügt die Funktion say2 an.
Mit ihr werden Texte automatisch umgebrochen. Mit ihr werden Texte automatisch umgebrochen.
--]] --]]
function say2(str,dx) function say2(str,dx)
@ -616,14 +616,13 @@ end
@author Mijago; Idee von Benhero @author Mijago; Idee von Benhero
@needs mysql_query @needs mysql_query
@descr @descr
Funktion zum <EFBFBD>ndern des Nutzerpasswortes. Funktion zum Ändern des Nutzerpasswortes.
Angabe des Accounts kann weggelassen werden, als Accountname oder als Account ID angegeben werden. Angabe des Accounts kann weggelassen werden, als Accountname oder als Account ID angegeben werden.
--]] --]]
account = account or {} account = account or {}
function account.set_pw(pw,ac) function account.set_pw(pw,ac)
if pw == nil then error("Fehler... Passwort muss gesetzt werden!") end if pw == nil then error("Fehler... Passwort muss gesetzt werden!") end
local ac = ac or pc.get_account_id() local ac = ac or pc.get_account_id()
-- This is weird behaviour and might need to be changed if ever used.
if type(ac) == "string" then if type(ac) == "string" then
mysql_query("UPDATE player.player,account.account SET account.password = password("..string.format('%q',pw)..") WHERE account.id = player.account_id and player.name = '"..ac.."' LIMIT 1") mysql_query("UPDATE player.player,account.account SET account.password = password("..string.format('%q',pw)..") WHERE account.id = player.account_id and player.name = '"..ac.."' LIMIT 1")
elseif type(ac) == "number" then elseif type(ac) == "number" then
@ -636,7 +635,7 @@ end
@name pc.check_inventory_place @name pc.check_inventory_place
@author Mijago @author Mijago
@descr @descr
Checkt auf Freie Inventarpl<EFBFBD>tze f<EFBFBD>r Items der gr<EFBFBD><EFBFBD>e X (H<EFBFBD>he). Checkt auf Freie Inventarplätze für Items der größe X (he).
--]] --]]
function pc.check_inventory_place(size) function pc.check_inventory_place(size)
if size <= 0 or size > 3 then if size <= 0 or size > 3 then
@ -664,7 +663,7 @@ end
@name do_for_other @name do_for_other
@author Mijago @author Mijago
@descr @descr
F<EFBFBD>hrt einen String als Luabefehle bei einem anderem User aus. Führt einen String als Luabefehle bei einem anderem User aus.
--]] --]]
function do_for_other(name,ding) function do_for_other(name,ding)
local t = pc.select(find_pc_by_name(name)) local t = pc.select(find_pc_by_name(name))
@ -679,7 +678,7 @@ end
@descr @descr
Setzt die Questflag eines anderen Spielers. Setzt die Questflag eines anderen Spielers.
--]] --]]
function local_pc_setqf(name, qf,wert) -- F<EFBFBD>r die aktuelle Quest function local_pc_setqf(name, qf,wert) -- Für die aktuelle Quest
local target = find_pc_by_name(name) local target = find_pc_by_name(name)
local t = pc.select(target) local t = pc.select(target)
pc.setqf(qf,wert) pc.setqf(qf,wert)
@ -754,7 +753,7 @@ end
@name download @name download
@author Mijago @author Mijago
@descr @descr
L<EFBFBD>dt eine Datei in den Data-Ordner. Lädt eine Datei in den Data-Ordner.
--]] --]]
function download(url) os.execute("cd data && fetch "..url.." && cd ..") end function download(url) os.execute("cd data && fetch "..url.." && cd ..") end
@ -763,7 +762,7 @@ function download(url) os.execute("cd data && fetch "..url.." && cd ..") end
@name dot @name dot
@author Mijago @author Mijago
@descr @descr
F<EFBFBD>hrt alles Zwischen $ und $ im String aus. Führt alles Zwischen $ und $ im String aus.
--]] --]]
function dot(x) function dot(x)
return string.gsub(x, "%$(.-)%$", function (s) return loadstring(s)() end) return string.gsub(x, "%$(.-)%$", function (s) return loadstring(s)() end)
@ -774,7 +773,7 @@ end
@name dostr @name dostr
@author Mijago @author Mijago
@descr @descr
F<EFBFBD>hrt einen String als Lua-Befehl aus. Führt einen String als Lua-Befehl aus.
--]] --]]
function dostr(str) function dostr(str)
assert(loadstring(str))() assert(loadstring(str))()
@ -786,7 +785,7 @@ end
@author Mijago @author Mijago
@needs mysql_query @needs mysql_query
@descr @descr
Versetzt alle Accounts (au<EFBFBD>er GM-Accounts) in einen "Wartungsmodus" und wieder zur<EFBFBD>ck. Versetzt alle Accounts (außer GM-Accounts) in einen "Wartungsmodus" und wieder zurück.
--]] --]]
function wartungsmodus(v) function wartungsmodus(v)
if v == 1 or v == true then if v == 1 or v == true then
@ -816,7 +815,7 @@ end
@name INI-Parser @name INI-Parser
@author Mijago @author Mijago
@descr @descr
Ein NEUER Parser f<EFBFBD>r INI-Dateien. Ein NEUER Parser für INI-Dateien.
--]] --]]
ini = { ini = {
open = function(path) open = function(path)
@ -841,7 +840,7 @@ ini = {
else else
r = r.."\n["..section.."]\n"..key.."="..value r = r.."\n["..section.."]\n"..key.."="..value
end end
-- <EFBFBD>berfl<EFBFBD>ssige leerzeichen l<>schen -- überflüssige leerzeichen löschen
r=string.gsub(string.gsub(string.gsub(r,"^(\n)",""),"(\n)$",""),"\n\n","\n") r=string.gsub(string.gsub(string.gsub(r,"^(\n)",""),"(\n)$",""),"\n\n","\n")
local d = io.open(self.path,"w") local d = io.open(self.path,"w")
d:write(r) d:write(r)
@ -896,7 +895,7 @@ ini = {
@needs split @needs split
@descr @descr
-- OUTDATED -- -- OUTDATED --
Ein Parser f<EFBFBD>r Ini-Dateien. Ein Parser für Ini-Dateien.
Besitzt eine Eigene Beschreibung der einzelnen Funktionen im Code. Besitzt eine Eigene Beschreibung der einzelnen Funktionen im Code.
--]] --]]
do do
@ -907,9 +906,9 @@ do
-- var:write_int(sub,name,wert) -- var:write_int(sub,name,wert)
-- var:write_bool(sub,name,boolean) -- var:write_bool(sub,name,boolean)
-- var:clear() -- var:clear()
-- var:read_str(sub,name,norm) -- Gibt einen String zur<EFBFBD>ck. -| -- var:read_str(sub,name,norm) -- Gibt einen String zurück. -|
-- var:read_int(sub,name,norm) -- Gibt eine Zahl zur<EFBFBD>ck -| norm wird zur<75>ckgegeben, wenn sub[name] nicht existiert. -- var:read_int(sub,name,norm) -- Gibt eine Zahl zurück -| norm wird zurückgegeben, wenn sub[name] nicht existiert.
-- var:read_bool(sub,name,norm) -- Gibt true / False zur<EFBFBD>ck -| -- var:read_bool(sub,name,norm) -- Gibt true / False zurück -|
-- var:delete_key(sub,nm) -- var:delete_key(sub,nm)
-- var:delete_section(sub) -- var:delete_section(sub)
local ini_f = {} local ini_f = {}
@ -998,7 +997,7 @@ do
if self.sub[sub] == nil then return norm end if self.sub[sub] == nil then return norm end
if self.sub[sub][nm] == nil then return norm else return tonumber(self.sub[sub][nm]) end if self.sub[sub][nm] == nil then return norm else return tonumber(self.sub[sub][nm]) end
end end
function ini_f:read_bool(sub,nm,norm) -- Norm wird zur<EFBFBD>ckgegeben, wenn der Key nm nicht existiert function ini_f:read_bool(sub,nm,norm) -- Norm wird zurückgegeben, wenn der Key nm nicht existiert
if sub == '' or nm == '' or sub == nil or nm == nil then return end if sub == '' or nm == '' or sub == nil or nm == nil then return end
self:parse() self:parse()
if self.sub[sub] == nil then return norm end if self.sub[sub] == nil then return norm end
@ -1033,7 +1032,7 @@ end
Wie die alten col-Befehle, sendet aber selbst. Wie die alten col-Befehle, sendet aber selbst.
Also kein say(col.red('bla')) Also kein say(col.red('bla'))
sondern sondern
csay.red('bla') reicht v<EFBFBD>llig aus. csay.red('bla') reicht völlig aus.
--]] --]]
csay = setmetatable({__d = { csay = setmetatable({__d = {
["aliceblue"] = {240, 248, 255}, ["antiquewhite"] = {250, 235, 215}, ["aqua"] = {0, 255, 255}, ["aquamarine"] = {127, 255, 212}, ["aliceblue"] = {240, 248, 255}, ["antiquewhite"] = {250, 235, 215}, ["aqua"] = {0, 255, 255}, ["aquamarine"] = {127, 255, 212},
@ -1083,7 +1082,7 @@ csay = setmetatable({__d = {
@name Farbcodes @name Farbcodes
@author Mijago @author Mijago
@descr @descr
Farbcodes f<EFBFBD>r Say Farbcodes für Say
--]] --]]
col = col or {} col = col or {}
col.list= { col.list= {

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,23 +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
# #
# 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
find_package(unofficial-argon2 CONFIG REQUIRED)
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

@ -1,19 +1,21 @@
#include "stdafx.h" #include "stdafx.h"
#include <sstream> #include <sstream>
#include <common/length.h> #include <common/length.h>
#include <argon2.h>
#include "db.h" #include "db.h"
#include "config.h" #include "config.h"
#include "desc_client.h" #include "desc_client.h"
#include "desc_manager.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 "p2p.h" #include "p2p.h"
#include "matrix_card.h" #include "matrix_card.h"
#include "log.h" #include "log.h"
#include "login_data.h" #include "login_data.h"
#include "locale_service.h"
#include "spam.h" #include "spam.h"
extern std::string g_stBlockDate; extern std::string g_stBlockDate;
@ -273,8 +275,8 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
if (pMsg->Get()->uiNumRows == 0) if (pMsg->Get()->uiNumRows == 0)
{ {
SPDLOG_DEBUG(" WRONGCRD"); SPDLOG_DEBUG(" NOID");
LoginFailure(d, "WRONGCRD"); LoginFailure(d, "NOID");
M2_DELETE(pinfo); M2_DELETE(pinfo);
} }
else else
@ -282,21 +284,31 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult); MYSQL_ROW row = mysql_fetch_row(pMsg->Get()->pSQLResult);
int col = 0; int col = 0;
// password, securitycode, social_id, id, status // PASSWORD('%s'), password, securitycode, social_id, id, status
char szHashedPassword[128 + 1]; char szEncrytPassword[45 + 1];
char szPassword[45 + 1];
char szMatrixCode[MATRIX_CODE_MAX_LEN + 1]; char szMatrixCode[MATRIX_CODE_MAX_LEN + 1];
char szSocialID[SOCIAL_ID_MAX_LEN + 1]; char szSocialID[SOCIAL_ID_MAX_LEN + 1];
char szStatus[ACCOUNT_STATUS_MAX_LEN + 1]; char szStatus[ACCOUNT_STATUS_MAX_LEN + 1];
DWORD dwID = 0; DWORD dwID = 0;
if (!row[col]) if (!row[col])
{ {
SPDLOG_ERROR("error column {}", col); SPDLOG_ERROR("error column {}", col);
M2_DELETE(pinfo); M2_DELETE(pinfo);
break; break;
} }
strlcpy(szEncrytPassword, row[col++], sizeof(szEncrytPassword));
strlcpy(szHashedPassword, row[col++], sizeof(szHashedPassword)); if (!row[col])
{
SPDLOG_ERROR("error column {}", col);
M2_DELETE(pinfo);
break;
}
strlcpy(szPassword, row[col++], sizeof(szPassword));
if (!row[col]) if (!row[col])
{ {
@ -309,29 +321,29 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
} }
if (!row[col]) if (!row[col])
{ {
SPDLOG_ERROR("error column {}", col); SPDLOG_ERROR("error column {}", col);
M2_DELETE(pinfo); M2_DELETE(pinfo);
break; break;
} }
strlcpy(szSocialID, row[col++], sizeof(szSocialID)); strlcpy(szSocialID, row[col++], sizeof(szSocialID));
if (!row[col]) if (!row[col])
{ {
SPDLOG_ERROR("error column {}", col); SPDLOG_ERROR("error column {}", col);
M2_DELETE(pinfo); M2_DELETE(pinfo);
break; break;
} }
str_to_number(dwID, row[col++]); str_to_number(dwID, row[col++]);
if (!row[col]) if (!row[col])
{ {
SPDLOG_ERROR("error column {}", col); SPDLOG_ERROR("error column {}", col);
M2_DELETE(pinfo); M2_DELETE(pinfo);
break; break;
} }
strlcpy(szStatus, row[col++], sizeof(szStatus)); strlcpy(szStatus, row[col++], sizeof(szStatus));
@ -362,12 +374,12 @@ void DBManager::AnalyzeReturnQuery(SQLMsg * pMsg)
SPDLOG_DEBUG("Create_Time {} {}", retValue, szCreateDate); SPDLOG_DEBUG("Create_Time {} {}", retValue, szCreateDate);
SPDLOG_DEBUG("Block Time {} ", strncmp(szCreateDate, g_stBlockDate.c_str(), 8)); SPDLOG_DEBUG("Block Time {} ", strncmp(szCreateDate, g_stBlockDate.c_str(), 8));
bool loginStatus = argon2id_verify(szHashedPassword, pinfo->passwd, strlen(pinfo->passwd)) == ARGON2_OK; int nPasswordDiff = strcmp(szEncrytPassword, szPassword);
if (!loginStatus) if (nPasswordDiff)
{ {
LoginFailure(d, "WRONGCRD"); LoginFailure(d, "WRONGPWD");
SPDLOG_DEBUG(" WRONGCRD"); SPDLOG_DEBUG(" WRONGPWD");
M2_DELETE(pinfo); M2_DELETE(pinfo);
} }
else if (bNotAvail) else if (bNotAvail)

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

@ -4,6 +4,9 @@
#include "input.h" #include "input.h"
#include "desc_client.h" #include "desc_client.h"
#include "desc_manager.h" #include "desc_manager.h"
#include "protocol.h"
#include "matrix_card.h"
#include "locale_service.h"
#include "db.h" #include "db.h"
extern time_t get_global_time(); extern time_t get_global_time();
@ -30,6 +33,13 @@ bool FN_IS_VALID_LOGIN_STRING(const char *str)
return true; return true;
} }
bool Login_IsInChannelService(const char* c_login)
{
if (c_login[0] == '[')
return true;
return false;
}
CInputAuth::CInputAuth() CInputAuth::CInputAuth()
{ {
} }
@ -45,7 +55,7 @@ void CInputAuth::Login(LPDESC d, const char * c_pData)
return; return;
} }
// Copy for string integrity // string 무결성을 위해 복사
char login[LOGIN_MAX_LEN + 1]; char login[LOGIN_MAX_LEN + 1];
trim_and_lower(pinfo->login, login, sizeof(login)); trim_and_lower(pinfo->login, login, sizeof(login));
@ -60,7 +70,7 @@ void CInputAuth::Login(LPDESC d, const char * c_pData)
{ {
SPDLOG_DEBUG("InputAuth::Login : IS_NOT_VALID_LOGIN_STRING({}) desc {}", SPDLOG_DEBUG("InputAuth::Login : IS_NOT_VALID_LOGIN_STRING({}) desc {}",
login, (void*) get_pointer(d)); login, (void*) get_pointer(d));
LoginFailure(d, "WRONGCRD"); LoginFailure(d, "NOID");
return; return;
} }
@ -90,21 +100,47 @@ void CInputAuth::Login(LPDESC d, const char * c_pData)
TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3; TPacketCGLogin3 * p = M2_NEW TPacketCGLogin3;
memcpy(p, pinfo, sizeof(TPacketCGLogin3)); memcpy(p, pinfo, sizeof(TPacketCGLogin3));
char szPasswd[PASSWD_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(szPasswd, sizeof(szPasswd), passwd, strlen(passwd));
char szLogin[LOGIN_MAX_LEN * 2 + 1]; char szLogin[LOGIN_MAX_LEN * 2 + 1];
DBManager::instance().EscapeString(szLogin, sizeof(szLogin), login, strlen(login)); DBManager::instance().EscapeString(szLogin, sizeof(szLogin), login, strlen(login));
DBManager::instance().ReturnQuery(QID_AUTH_LOGIN, dwKey, p, // CHANNEL_SERVICE_LOGIN
"SELECT password,securitycode,social_id,id,status,availDt - NOW() > 0," if (Login_IsInChannelService(szLogin))
"UNIX_TIMESTAMP(silver_expire)," {
"UNIX_TIMESTAMP(gold_expire)," SPDLOG_DEBUG("ChannelServiceLogin [{}]", szLogin);
"UNIX_TIMESTAMP(safebox_expire),"
"UNIX_TIMESTAMP(autoloot_expire)," DBManager::instance().ReturnQuery(QID_AUTH_LOGIN, dwKey, p,
"UNIX_TIMESTAMP(fish_mind_expire)," "SELECT '%s',password,securitycode,social_id,id,status,availDt - NOW() > 0,"
"UNIX_TIMESTAMP(marriage_fast_expire)," "UNIX_TIMESTAMP(silver_expire),"
"UNIX_TIMESTAMP(money_drop_rate_expire)," "UNIX_TIMESTAMP(gold_expire),"
"UNIX_TIMESTAMP(create_time)" "UNIX_TIMESTAMP(safebox_expire),"
" FROM account WHERE login='%s'", "UNIX_TIMESTAMP(autoloot_expire),"
szLogin); "UNIX_TIMESTAMP(fish_mind_expire),"
"UNIX_TIMESTAMP(marriage_fast_expire),"
"UNIX_TIMESTAMP(money_drop_rate_expire),"
"UNIX_TIMESTAMP(create_time)"
" FROM account WHERE login='%s'",
szPasswd, szLogin);
}
// END_OF_CHANNEL_SERVICE_LOGIN
else
{
DBManager::instance().ReturnQuery(QID_AUTH_LOGIN, dwKey, p,
"SELECT PASSWORD('%s'),password,securitycode,social_id,id,status,availDt - NOW() > 0,"
"UNIX_TIMESTAMP(silver_expire),"
"UNIX_TIMESTAMP(gold_expire),"
"UNIX_TIMESTAMP(safebox_expire),"
"UNIX_TIMESTAMP(autoloot_expire),"
"UNIX_TIMESTAMP(fish_mind_expire),"
"UNIX_TIMESTAMP(marriage_fast_expire),"
"UNIX_TIMESTAMP(money_drop_rate_expire),"
"UNIX_TIMESTAMP(create_time)"
" FROM account WHERE login='%s'",
szPasswd, szLogin);
}
} }
int CInputAuth::Analyze(LPDESC d, BYTE bHeader, const char * c_pData) int CInputAuth::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)

View File

@ -26,9 +26,11 @@
#include "building.h" #include "building.h"
#include "login_sim.h" #include "login_sim.h"
#include "wedding.h" #include "wedding.h"
#include "login_data.h"
#include "unique_item.h" #include "unique_item.h"
#include "monarch.h" #include "monarch.h"
#include "affect.h"
#include "castle.h" #include "castle.h"
#include "motion.h" #include "motion.h"
@ -1304,13 +1306,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 +1684,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)
@ -1954,11 +1956,11 @@ int CInputDB::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
break; break;
case HEADER_DG_LOGIN_NOT_EXIST: case HEADER_DG_LOGIN_NOT_EXIST:
LoginFailure(DESC_MANAGER::instance().FindByHandle(m_dwHandle), "WRONGCRD"); LoginFailure(DESC_MANAGER::instance().FindByHandle(m_dwHandle), "NOID");
break; break;
case HEADER_DG_LOGIN_WRONG_PASSWD: case HEADER_DG_LOGIN_WRONG_PASSWD:
LoginFailure(DESC_MANAGER::instance().FindByHandle(m_dwHandle), "WRONGCRD"); LoginFailure(DESC_MANAGER::instance().FindByHandle(m_dwHandle), "WRONGPWD");
break; break;
case HEADER_DG_LOGIN_ALREADY: case HEADER_DG_LOGIN_ALREADY:

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

@ -1676,7 +1676,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

@ -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);
} }

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"