diff --git a/others/MMOCore/.classpath b/others/MMOCore/.classpath new file mode 100644 index 0000000000..afb1b1e867 --- /dev/null +++ b/others/MMOCore/.classpath @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/others/MMOCore/.project b/others/MMOCore/.project new file mode 100644 index 0000000000..117c63d86e --- /dev/null +++ b/others/MMOCore/.project @@ -0,0 +1,17 @@ + + + MMOCore + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + \ No newline at end of file diff --git a/others/MMOCore/.settings/org.eclipse.core.resources.prefs b/others/MMOCore/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000000..4824b80263 --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/others/MMOCore/.settings/org.eclipse.core.runtime.prefs b/others/MMOCore/.settings/org.eclipse.core.runtime.prefs new file mode 100644 index 0000000000..f8a67de1d4 --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.core.runtime.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +line.separator=\r\n diff --git a/others/MMOCore/.settings/org.eclipse.jdt.core.prefs b/others/MMOCore/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000..28d8dc089d --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,409 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.codeComplete.argumentPrefixes= +org.eclipse.jdt.core.codeComplete.argumentSuffixes= +org.eclipse.jdt.core.codeComplete.fieldPrefixes= +org.eclipse.jdt.core.codeComplete.fieldSuffixes= +org.eclipse.jdt.core.codeComplete.localPrefixes= +org.eclipse.jdt.core.codeComplete.localSuffixes= +org.eclipse.jdt.core.codeComplete.staticFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFieldSuffixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes= +org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes= +org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled +org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore +org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.jdt.annotation.NonNull +org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.jdt.annotation.NonNullByDefault +org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.jdt.annotation.Nullable +org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.doc.comment.support=enabled +org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.autoboxing=ignore +org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning +org.eclipse.jdt.core.compiler.problem.deadCode=warning +org.eclipse.jdt.core.compiler.problem.deprecation=warning +org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled +org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled +org.eclipse.jdt.core.compiler.problem.discouragedReference=warning +org.eclipse.jdt.core.compiler.problem.emptyStatement=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore +org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore +org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled +org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore +org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning +org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning +org.eclipse.jdt.core.compiler.problem.forbiddenReference=error +org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning +org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled +org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning +org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore +org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadoc=warning +org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=enabled +org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private +org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore +org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning +org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore +org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled +org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled +org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=no_tag +org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsMethodTypeParameters=enabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=enabled +org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=private +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning +org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled +org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning +org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore +org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning +org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning +org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore +org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning +org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=error +org.eclipse.jdt.core.compiler.problem.nullReference=warning +org.eclipse.jdt.core.compiler.problem.nullSpecViolation=error +org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning +org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning +org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore +org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning +org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning +org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore +org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning +org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning +org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning +org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning +org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning +org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore +org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore +org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled +org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning +org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled +org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled +org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled +org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=warning +org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning +org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled +org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning +org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning +org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore +org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning +org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning +org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=disabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=disabled +org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=enabled +org.eclipse.jdt.core.compiler.problem.unusedImport=warning +org.eclipse.jdt.core.compiler.problem.unusedLabel=warning +org.eclipse.jdt.core.compiler.problem.unusedLocal=warning +org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled +org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled +org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning +org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore +org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning +org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning +org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=48 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=0 +org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_assignment=4 +org.eclipse.jdt.core.formatter.alignment_for_binary_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_compact_if=0 +org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=0 +org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49 +org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=49 +org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=81 +org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=0 +org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=48 +org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=0 +org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16 +org.eclipse.jdt.core.formatter.blank_lines_after_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_after_package=1 +org.eclipse.jdt.core.formatter.blank_lines_before_field=0 +org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0 +org.eclipse.jdt.core.formatter.blank_lines_before_imports=1 +org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1 +org.eclipse.jdt.core.formatter.blank_lines_before_method=1 +org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1 +org.eclipse.jdt.core.formatter.blank_lines_before_package=0 +org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1 +org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1 +org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block=next_line +org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=next_line +org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=next_line +org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line +org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=next_line +org.eclipse.jdt.core.formatter.brace_position_for_switch=next_line +org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=next_line +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=true +org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=true +org.eclipse.jdt.core.formatter.comment.format_block_comments=true +org.eclipse.jdt.core.formatter.comment.format_header=false +org.eclipse.jdt.core.formatter.comment.format_html=true +org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true +org.eclipse.jdt.core.formatter.comment.format_line_comments=true +org.eclipse.jdt.core.formatter.comment.format_source_code=true +org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true +org.eclipse.jdt.core.formatter.comment.indent_root_tags=true +org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=do not insert +org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert +org.eclipse.jdt.core.formatter.comment.line_length=300 +org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true +org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true +org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false +org.eclipse.jdt.core.formatter.compact_else_if=true +org.eclipse.jdt.core.formatter.continuation_indentation=1 +org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=1 +org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off +org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on +org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false +org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true +org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true +org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_empty_lines=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true +org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true +org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true +org.eclipse.jdt.core.formatter.indentation.size=4 +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_label=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert +org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert +org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert +org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert +org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert +org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert +org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert +org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert +org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert +org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert +org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert +org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert +org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert +org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert +org.eclipse.jdt.core.formatter.join_lines_in_comments=true +org.eclipse.jdt.core.formatter.join_wrapped_lines=true +org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false +org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=true +org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false +org.eclipse.jdt.core.formatter.lineSplit=300 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false +org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 +org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 +org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false +org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.size=4 +org.eclipse.jdt.core.formatter.use_on_off_tags=true +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true +org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true +org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true diff --git a/others/MMOCore/.settings/org.eclipse.jdt.ui.prefs b/others/MMOCore/.settings/org.eclipse.jdt.ui.prefs new file mode 100644 index 0000000000..03260a7751 --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.jdt.ui.prefs @@ -0,0 +1,72 @@ +cleanup.add_default_serial_version_id=true +cleanup.add_generated_serial_version_id=false +cleanup.add_missing_annotations=true +cleanup.add_missing_deprecated_annotations=true +cleanup.add_missing_methods=true +cleanup.add_missing_nls_tags=false +cleanup.add_missing_override_annotations=true +cleanup.add_missing_override_annotations_interface_methods=true +cleanup.add_serial_version_id=true +cleanup.always_use_blocks=true +cleanup.always_use_parentheses_in_expressions=true +cleanup.always_use_this_for_non_static_field_access=false +cleanup.always_use_this_for_non_static_method_access=false +cleanup.convert_functional_interfaces=true +cleanup.convert_to_enhanced_for_loop=true +cleanup.correct_indentation=true +cleanup.format_source_code=true +cleanup.format_source_code_changes_only=false +cleanup.insert_inferred_type_arguments=false +cleanup.make_local_variable_final=false +cleanup.make_parameters_final=false +cleanup.make_private_fields_final=true +cleanup.make_type_abstract_if_missing_method=false +cleanup.make_variable_declarations_final=true +cleanup.never_use_blocks=false +cleanup.never_use_parentheses_in_expressions=false +cleanup.organize_imports=true +cleanup.qualify_static_field_accesses_with_declaring_class=false +cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true +cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true +cleanup.qualify_static_member_accesses_with_declaring_class=true +cleanup.qualify_static_method_accesses_with_declaring_class=false +cleanup.remove_private_constructors=true +cleanup.remove_redundant_type_arguments=true +cleanup.remove_trailing_whitespaces=true +cleanup.remove_trailing_whitespaces_all=false +cleanup.remove_trailing_whitespaces_ignore_empty=true +cleanup.remove_unnecessary_casts=true +cleanup.remove_unnecessary_nls_tags=true +cleanup.remove_unused_imports=true +cleanup.remove_unused_local_variables=true +cleanup.remove_unused_private_fields=true +cleanup.remove_unused_private_members=true +cleanup.remove_unused_private_methods=true +cleanup.remove_unused_private_types=true +cleanup.sort_members=false +cleanup.sort_members_all=false +cleanup.use_anonymous_class_creation=false +cleanup.use_blocks=true +cleanup.use_blocks_only_for_return_and_throw=false +cleanup.use_lambda=true +cleanup.use_parentheses_in_expressions=true +cleanup.use_this_for_non_static_field_access=true +cleanup.use_this_for_non_static_field_access_only_if_necessary=true +cleanup.use_this_for_non_static_method_access=true +cleanup.use_this_for_non_static_method_access_only_if_necessary=true +cleanup.use_type_arguments=false +cleanup_profile=_L2J Mobius v0.2 +cleanup_settings_version=2 +eclipse.preferences.version=1 +formatter_profile=_L2J Mobius v0.3 +formatter_settings_version=12 +org.eclipse.jdt.ui.exception.name=e +org.eclipse.jdt.ui.gettersetter.use.is=true +org.eclipse.jdt.ui.ignorelowercasenames=true +org.eclipse.jdt.ui.importorder=java;javax;org;com; +org.eclipse.jdt.ui.javadoc=true +org.eclipse.jdt.ui.keywordthis=false +org.eclipse.jdt.ui.ondemandthreshold=99 +org.eclipse.jdt.ui.overrideannotation=true +org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates= diff --git a/others/MMOCore/.settings/org.eclipse.wst.sse.core.prefs b/others/MMOCore/.settings/org.eclipse.wst.sse.core.prefs new file mode 100644 index 0000000000..a640cfdb22 --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.wst.sse.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +task-tags/enabled=true +task-tags/use-project-settings=true diff --git a/others/MMOCore/.settings/org.eclipse.wst.validation.prefs b/others/MMOCore/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000000..63a18689fb --- /dev/null +++ b/others/MMOCore/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,12 @@ +DELEGATES_PREFERENCE=delegateValidatorList +USER_BUILD_PREFERENCE=enabledBuildValidatorList +USER_MANUAL_PREFERENCE=enabledManualValidatorList +USER_PREFERENCE=overrideGlobalPreferencestruedisableAllValidationfalseversion1.2.400.v201204260100 +eclipse.preferences.version=1 +override=true +suspend=false +vals/org.eclipse.wst.dtd.core.dtdDTDValidator/global=FF01 +vals/org.eclipse.wst.html.core.HTMLValidator/global=FF01 +vals/org.eclipse.wst.html.ui.HTMLValidator/global=TF01 +vals/org.eclipse.wst.xml.core.xml/groups=0107include05111contentType128org.eclipse.core.runtime.xmlT111contentType134org.eclipse.wst.xml.core.xmlsourceT111contentType134org.eclipse.wst.xml.core.xslsourceT111contentType134org.eclipse.jst.jsp.core.tldsourceT07fileext03xmlF0107exclude08113projectNature134org.eclipse.jst.j2ee.ejb.EJBNature113projectNature130org.eclipse.jst.j2ee.EARNature04file08.projectT0104file110.classpathT0104file110.settings/T0204file03binF0204file05buildF0204file09build.xmlF01 +vf.version=3 diff --git a/others/MMOCore/build.xml b/others/MMOCore/build.xml new file mode 100644 index 0000000000..0d6fc13a6d --- /dev/null +++ b/others/MMOCore/build.xml @@ -0,0 +1,71 @@ + + + + This script will build the MMOCore lib. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. + + http://www.gnu.org/copyleft/gpl.html + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${l2j.changelog} + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/others/MMOCore/src/org/mmocore/network/AbstractPacket.java b/others/MMOCore/src/org/mmocore/network/AbstractPacket.java new file mode 100644 index 0000000000..262615f479 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/AbstractPacket.java @@ -0,0 +1,36 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.ByteBuffer; + +/** + * @author KenM + * @param + */ +public abstract class AbstractPacket> +{ + protected ByteBuffer _buf; + + protected T _client; + + public final T getClient() + { + return _client; + } +} diff --git a/others/MMOCore/src/org/mmocore/network/IAcceptFilter.java b/others/MMOCore/src/org/mmocore/network/IAcceptFilter.java new file mode 100644 index 0000000000..b6bfd00816 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/IAcceptFilter.java @@ -0,0 +1,28 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.channels.SocketChannel; + +/** + * @author KenM + */ +public interface IAcceptFilter +{ + public boolean accept(SocketChannel sc); +} diff --git a/others/MMOCore/src/org/mmocore/network/IClientFactory.java b/others/MMOCore/src/org/mmocore/network/IClientFactory.java new file mode 100644 index 0000000000..a3db1c6f5c --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/IClientFactory.java @@ -0,0 +1,27 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +/** + * @author KenM + * @param + */ +public interface IClientFactory> +{ + public T create(final MMOConnection con); +} diff --git a/others/MMOCore/src/org/mmocore/network/IMMOExecutor.java b/others/MMOCore/src/org/mmocore/network/IMMOExecutor.java new file mode 100644 index 0000000000..e85fe079b0 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/IMMOExecutor.java @@ -0,0 +1,27 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +/** + * @author KenM + * @param + */ +public interface IMMOExecutor> +{ + public void execute(ReceivablePacket packet); +} diff --git a/others/MMOCore/src/org/mmocore/network/IPacketHandler.java b/others/MMOCore/src/org/mmocore/network/IPacketHandler.java new file mode 100644 index 0000000000..35756a1d95 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/IPacketHandler.java @@ -0,0 +1,29 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.ByteBuffer; + +/** + * @author KenM + * @param + */ +public interface IPacketHandler> +{ + public ReceivablePacket handlePacket(ByteBuffer buf, T client); +} diff --git a/others/MMOCore/src/org/mmocore/network/MMOClient.java b/others/MMOCore/src/org/mmocore/network/MMOClient.java new file mode 100644 index 0000000000..2bf3060408 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/MMOClient.java @@ -0,0 +1,47 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.ByteBuffer; + +/** + * @author KenM + * @param + */ +public abstract class MMOClient> +{ + private final T _con; + + public MMOClient(final T con) + { + _con = con; + } + + public T getConnection() + { + return _con; + } + + public abstract boolean decrypt(final ByteBuffer buf, final int size); + + public abstract boolean encrypt(final ByteBuffer buf, final int size); + + protected abstract void onDisconnection(); + + protected abstract void onForcedDisconnection(); +} diff --git a/others/MMOCore/src/org/mmocore/network/MMOConnection.java b/others/MMOCore/src/org/mmocore/network/MMOConnection.java new file mode 100644 index 0000000000..72fced52e6 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/MMOConnection.java @@ -0,0 +1,288 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.Socket; +import java.net.SocketException; +import java.nio.ByteBuffer; +import java.nio.channels.CancelledKeyException; +import java.nio.channels.ReadableByteChannel; +import java.nio.channels.SelectionKey; +import java.nio.channels.WritableByteChannel; + +/** + * @author KenM + * @param + */ +public class MMOConnection> +{ + private final SelectorThread _selectorThread; + + private final Socket _socket; + + private final InetAddress _address; + + private final ReadableByteChannel _readableByteChannel; + + private final WritableByteChannel _writableByteChannel; + + private final int _port; + + private final NioNetStackList> _sendQueue; + + private final SelectionKey _selectionKey; + + // private SendablePacket _closePacket; + + private ByteBuffer _readBuffer; + + private ByteBuffer _primaryWriteBuffer; + + private ByteBuffer _secondaryWriteBuffer; + + private volatile boolean _pendingClose; + + private T _client; + + public MMOConnection(final SelectorThread selectorThread, final Socket socket, final SelectionKey key, boolean tcpNoDelay) + { + _selectorThread = selectorThread; + _socket = socket; + _address = socket.getInetAddress(); + _readableByteChannel = socket.getChannel(); + _writableByteChannel = socket.getChannel(); + _port = socket.getPort(); + _selectionKey = key; + + _sendQueue = new NioNetStackList<>(); + + try + { + _socket.setTcpNoDelay(tcpNoDelay); + } + catch (SocketException e) + { + e.printStackTrace(); + } + } + + final void setClient(final T client) + { + _client = client; + } + + public final T getClient() + { + return _client; + } + + public final void sendPacket(final SendablePacket sp) + { + sp._client = _client; + + if (_pendingClose) + { + return; + } + + synchronized (getSendQueue()) + { + _sendQueue.addLast(sp); + } + + if (!_sendQueue.isEmpty()) + { + try + { + _selectionKey.interestOps(_selectionKey.interestOps() | SelectionKey.OP_WRITE); + } + catch (CancelledKeyException e) + { + // ignore + } + } + } + + final SelectionKey getSelectionKey() + { + return _selectionKey; + } + + public final InetAddress getInetAddress() + { + return _address; + } + + public final int getPort() + { + return _port; + } + + final void close() throws IOException + { + _socket.close(); + } + + final int read(final ByteBuffer buf) throws IOException + { + return _readableByteChannel.read(buf); + } + + final int write(final ByteBuffer buf) throws IOException + { + return _writableByteChannel.write(buf); + } + + final void createWriteBuffer(final ByteBuffer buf) + { + if (_primaryWriteBuffer == null) + { + _primaryWriteBuffer = _selectorThread.getPooledBuffer(); + _primaryWriteBuffer.put(buf); + } + else + { + final ByteBuffer temp = _selectorThread.getPooledBuffer(); + temp.put(buf); + + final int remaining = temp.remaining(); + _primaryWriteBuffer.flip(); + final int limit = _primaryWriteBuffer.limit(); + + if (remaining >= _primaryWriteBuffer.remaining()) + { + temp.put(_primaryWriteBuffer); + _selectorThread.recycleBuffer(_primaryWriteBuffer); + _primaryWriteBuffer = temp; + } + else + { + _primaryWriteBuffer.limit(remaining); + temp.put(_primaryWriteBuffer); + _primaryWriteBuffer.limit(limit); + _primaryWriteBuffer.compact(); + _secondaryWriteBuffer = _primaryWriteBuffer; + _primaryWriteBuffer = temp; + } + } + } + + final boolean hasPendingWriteBuffer() + { + return _primaryWriteBuffer != null; + } + + final void movePendingWriteBufferTo(final ByteBuffer dest) + { + _primaryWriteBuffer.flip(); + dest.put(_primaryWriteBuffer); + _selectorThread.recycleBuffer(_primaryWriteBuffer); + _primaryWriteBuffer = _secondaryWriteBuffer; + _secondaryWriteBuffer = null; + } + + final void setReadBuffer(final ByteBuffer buf) + { + _readBuffer = buf; + } + + final ByteBuffer getReadBuffer() + { + return _readBuffer; + } + + public final boolean isClosed() + { + return _pendingClose; + } + + final NioNetStackList> getSendQueue() + { + return _sendQueue; + } + + /* + * final SendablePacket getClosePacket() { return _closePacket; } + */ + + @SuppressWarnings("unchecked") + public final void close(final SendablePacket sp) + { + + close(new SendablePacket[] + { + sp + }); + } + + public final void close(final SendablePacket[] closeList) + { + if (_pendingClose) + { + return; + } + + synchronized (getSendQueue()) + { + if (!_pendingClose) + { + _pendingClose = true; + _sendQueue.clear(); + for (SendablePacket sp : closeList) + { + _sendQueue.addLast(sp); + } + } + } + + try + { + _selectionKey.interestOps(_selectionKey.interestOps() & ~SelectionKey.OP_WRITE); + } + catch (CancelledKeyException e) + { + // ignore + } + + // _closePacket = sp; + _selectorThread.closeConnection(this); + } + + final void releaseBuffers() + { + if (_primaryWriteBuffer != null) + { + _selectorThread.recycleBuffer(_primaryWriteBuffer); + _primaryWriteBuffer = null; + + if (_secondaryWriteBuffer != null) + { + _selectorThread.recycleBuffer(_secondaryWriteBuffer); + _secondaryWriteBuffer = null; + } + } + + if (_readBuffer != null) + { + _selectorThread.recycleBuffer(_readBuffer); + _readBuffer = null; + } + } +} diff --git a/others/MMOCore/src/org/mmocore/network/NioNetStackList.java b/others/MMOCore/src/org/mmocore/network/NioNetStackList.java new file mode 100644 index 0000000000..9559dd6027 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/NioNetStackList.java @@ -0,0 +1,102 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +/** + * @author Forsaiken + * @param + */ +public final class NioNetStackList +{ + private final NioNetStackNode _start = new NioNetStackNode(); + + private final NioNetStackNodeBuf _buf = new NioNetStackNodeBuf(); + + private NioNetStackNode _end = new NioNetStackNode(); + + public NioNetStackList() + { + clear(); + } + + public final void addLast(final E elem) + { + final NioNetStackNode newEndNode = _buf.removeFirst(); + _end._value = elem; + _end._next = newEndNode; + _end = newEndNode; + } + + public final E removeFirst() + { + final NioNetStackNode old = _start._next; + final E value = old._value; + _start._next = old._next; + _buf.addLast(old); + return value; + } + + public final boolean isEmpty() + { + return _start._next == _end; + } + + public final void clear() + { + _start._next = _end; + } + + protected final class NioNetStackNode + { + protected NioNetStackNode _next; + + protected E _value; + } + + private final class NioNetStackNodeBuf + { + private final NioNetStackNode _start = new NioNetStackNode(); + + private NioNetStackNode _end = new NioNetStackNode(); + + NioNetStackNodeBuf() + { + _start._next = _end; + } + + final void addLast(final NioNetStackNode node) + { + node._next = null; + node._value = null; + _end._next = node; + _end = node; + } + + final NioNetStackNode removeFirst() + { + if (_start._next == _end) + { + return new NioNetStackNode(); + } + + final NioNetStackNode old = _start._next; + _start._next = old._next; + return old; + } + } +} diff --git a/others/MMOCore/src/org/mmocore/network/NioNetStringBuffer.java b/others/MMOCore/src/org/mmocore/network/NioNetStringBuffer.java new file mode 100644 index 0000000000..b3fae768ee --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/NioNetStringBuffer.java @@ -0,0 +1,62 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.BufferOverflowException; + +/** + * @author Forsaiken + */ +public final class NioNetStringBuffer +{ + private final char[] _buf; + + private final int _size; + + private int _len; + + public NioNetStringBuffer(final int size) + { + _buf = new char[size]; + _size = size; + _len = 0; + } + + public final void clear() + { + _len = 0; + } + + public final void append(final char c) + { + if (_len < _size) + { + _buf[_len++] = c; + } + else + { + throw new BufferOverflowException(); + } + } + + @Override + public final String toString() + { + return new String(_buf, 0, _len); + } +} diff --git a/others/MMOCore/src/org/mmocore/network/ReceivablePacket.java b/others/MMOCore/src/org/mmocore/network/ReceivablePacket.java new file mode 100644 index 0000000000..f64989f626 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/ReceivablePacket.java @@ -0,0 +1,141 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.nio.ByteBuffer; + +/** + * @author KenM + * @param + */ +public abstract class ReceivablePacket> extends AbstractPacket implements Runnable +{ + NioNetStringBuffer _sbuf; + + protected ReceivablePacket() + { + + } + + protected abstract boolean read(); + + @Override + public abstract void run(); + + /** + * Reads byte[] from the buffer.
+ * Reads as many bytes as the length of the array. + * @param dst : the byte array which will be filled with the data. + */ + protected final void readB(final byte[] dst) + { + _buf.get(dst); + } + + /** + * Reads byte[] from the buffer.
+ * Reads as many bytes as the given length (len). Starts to fill the byte array from the given offset to offset + len. + * @param dst : the byte array which will be filled with the data. + * @param offset : starts to fill the byte array from the given offset. + * @param len : the given length of bytes to be read. + */ + protected final void readB(final byte[] dst, final int offset, final int len) + { + _buf.get(dst, offset, len); + } + + /** + * Reads byte from the buffer.
+ * 8bit integer (00) + * @return + */ + protected final int readC() + { + return _buf.get() & 0xFF; + } + + /** + * Reads short from the buffer.
+ * 16bit integer (00 00) + * @return + */ + protected final int readH() + { + return _buf.getShort() & 0xFFFF; + } + + /** + * Reads int from the buffer.
+ * 32bit integer (00 00 00 00) + * @return + */ + protected final int readD() + { + return _buf.getInt(); + } + + /** + * Reads long from the buffer.
+ * 64bit integer (00 00 00 00 00 00 00 00) + * @return + */ + protected final long readQ() + { + return _buf.getLong(); + } + + /** + * Reads double from the buffer.
+ * 64bit double precision float (00 00 00 00 00 00 00 00) + * @return + */ + protected final double readF() + { + return _buf.getDouble(); + } + + /** + * Reads String from the buffer. + * @return + */ + protected final String readS() + { + _sbuf.clear(); + + char ch; + while ((ch = _buf.getChar()) != 0) + { + _sbuf.append(ch); + } + + return _sbuf.toString(); + } + + /** + * packet forge purpose + * @param data + * @param client + * @param sBuffer + */ + public void setBuffers(ByteBuffer data, T client, NioNetStringBuffer sBuffer) + { + _buf = data; + _client = client; + _sbuf = sBuffer; + } +} diff --git a/others/MMOCore/src/org/mmocore/network/SelectorConfig.java b/others/MMOCore/src/org/mmocore/network/SelectorConfig.java new file mode 100644 index 0000000000..d9e39ffa08 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/SelectorConfig.java @@ -0,0 +1,64 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +/** + * @author KenM + */ +public final class SelectorConfig +{ + public int READ_BUFFER_SIZE = 64 * 1024; + + public int WRITE_BUFFER_SIZE = 64 * 1024; + + public int HELPER_BUFFER_COUNT = 20; + + public int HELPER_BUFFER_SIZE = 64 * 1024; + + /** + * Server will try to send MAX_SEND_PER_PASS packets per socket write call
+ * however it may send less if the write buffer was filled before achieving this value. + */ + public int MAX_SEND_PER_PASS = 10; + + /** + * Server will try to read MAX_READ_PER_PASS packets per socket read call
+ * however it may read less if the read buffer was empty before achieving this value. + */ + public int MAX_READ_PER_PASS = 10; + + /** + * Defines how much time (in milis) should the selector sleep, an higher value increases throughput but also increases latency(to a max of the sleep value itself).
+ * Also an extremely high value(usually > 100) will decrease throughput due to the server not doing enough sends per second (depends on max sends per pass).
+ *
+ * Recommended values:
+ * 1 for minimal latency.
+ * 10-30 for an latency/troughput trade-off based on your needs.
+ */ + public int SLEEP_TIME = 10; + + /** + * Used to enable/disable TCP_NODELAY which disable/enable Nagle's algorithm.
+ *
+ * Nagle's algorithm try to conserve bandwidth by minimizing the number of segments that are sent. When applications wish to decrease network latency and increase performance, they can disable Nagle's algorithm (that is enable TCP_NODELAY). Data will be sent earlier, at the cost of an increase + * in bandwidth consumption. The Nagle's algorithm is described in RFC 896.
+ *
+ * Summary, data will be sent earlier, thus lowering the ping, at the cost of a small increase in bandwidth consumption. + */ + public boolean TCP_NODELAY = false; +} diff --git a/others/MMOCore/src/org/mmocore/network/SelectorThread.java b/others/MMOCore/src/org/mmocore/network/SelectorThread.java new file mode 100644 index 0000000000..a010d46ae5 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/SelectorThread.java @@ -0,0 +1,703 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.LinkedList; + +/** + * @author KenM
+ * Parts of design based on networkcore from WoodenGil + * @param + */ +public final class SelectorThread> extends Thread +{ + // default BYTE_ORDER + private static final ByteOrder BYTE_ORDER = ByteOrder.LITTLE_ENDIAN; + // default HEADER_SIZE + private static final int HEADER_SIZE = 2; + // Selector + private final Selector _selector; + // Implementations + private final IPacketHandler _packetHandler; + private final IMMOExecutor _executor; + private final IClientFactory _clientFactory; + private final IAcceptFilter _acceptFilter; + // Configurations + private final int HELPER_BUFFER_SIZE; + private final int HELPER_BUFFER_COUNT; + private final int MAX_SEND_PER_PASS; + private final int MAX_READ_PER_PASS; + private final long SLEEP_TIME; + public boolean TCP_NODELAY; + // Main Buffers + private final ByteBuffer DIRECT_WRITE_BUFFER; + private final ByteBuffer WRITE_BUFFER; + private final ByteBuffer READ_BUFFER; + // String Buffer + private final NioNetStringBuffer STRING_BUFFER; + // ByteBuffers General Purpose Pool + private final LinkedList _bufferPool; + // Pending Close + private final NioNetStackList> _pendingClose; + + private boolean _shutdown; + + public SelectorThread(final SelectorConfig sc, final IMMOExecutor executor, final IPacketHandler packetHandler, final IClientFactory clientFactory, final IAcceptFilter acceptFilter) throws IOException + { + super.setName("SelectorThread-" + super.getId()); + + HELPER_BUFFER_SIZE = sc.HELPER_BUFFER_SIZE; + HELPER_BUFFER_COUNT = sc.HELPER_BUFFER_COUNT; + MAX_SEND_PER_PASS = sc.MAX_SEND_PER_PASS; + MAX_READ_PER_PASS = sc.MAX_READ_PER_PASS; + SLEEP_TIME = sc.SLEEP_TIME; + TCP_NODELAY = sc.TCP_NODELAY; + + DIRECT_WRITE_BUFFER = ByteBuffer.allocateDirect(sc.WRITE_BUFFER_SIZE).order(BYTE_ORDER); + WRITE_BUFFER = ByteBuffer.wrap(new byte[sc.WRITE_BUFFER_SIZE]).order(BYTE_ORDER); + READ_BUFFER = ByteBuffer.wrap(new byte[sc.READ_BUFFER_SIZE]).order(BYTE_ORDER); + + STRING_BUFFER = new NioNetStringBuffer(64 * 1024); + + _pendingClose = new NioNetStackList<>(); + _bufferPool = new LinkedList<>(); + + for (int i = 0; i < HELPER_BUFFER_COUNT; i++) + { + _bufferPool.addLast(ByteBuffer.wrap(new byte[HELPER_BUFFER_SIZE]).order(BYTE_ORDER)); + } + + _acceptFilter = acceptFilter; + _packetHandler = packetHandler; + _clientFactory = clientFactory; + _executor = executor; + _selector = Selector.open(); + } + + public final void openServerSocket(InetAddress address, int tcpPort) throws IOException + { + ServerSocketChannel selectable = ServerSocketChannel.open(); + selectable.configureBlocking(false); + + ServerSocket ss = selectable.socket(); + + if (address == null) + { + ss.bind(new InetSocketAddress(tcpPort)); + } + else + { + ss.bind(new InetSocketAddress(address, tcpPort)); + } + + selectable.register(_selector, SelectionKey.OP_ACCEPT); + } + + final ByteBuffer getPooledBuffer() + { + if (_bufferPool.isEmpty()) + { + return ByteBuffer.wrap(new byte[HELPER_BUFFER_SIZE]).order(BYTE_ORDER); + } + + return _bufferPool.removeFirst(); + } + + final void recycleBuffer(final ByteBuffer buf) + { + if (_bufferPool.size() < HELPER_BUFFER_COUNT) + { + buf.clear(); + _bufferPool.addLast(buf); + } + } + + @SuppressWarnings("unchecked") + @Override + public final void run() + { + int selectedKeysCount = 0; + + SelectionKey key; + MMOConnection con; + + Iterator selectedKeys; + + while (!_shutdown) + { + try + { + selectedKeysCount = _selector.selectNow(); + } + catch (IOException e) + { + e.printStackTrace(); + } + + if (selectedKeysCount > 0) + { + selectedKeys = _selector.selectedKeys().iterator(); + + while (selectedKeys.hasNext()) + { + key = selectedKeys.next(); + selectedKeys.remove(); + + con = (MMOConnection) key.attachment(); + + switch (key.readyOps()) + { + case SelectionKey.OP_CONNECT: + finishConnection(key, con); + break; + case SelectionKey.OP_ACCEPT: + acceptConnection(key, con); + break; + case SelectionKey.OP_READ: + readPacket(key, con); + break; + case SelectionKey.OP_WRITE: + writePacket(key, con); + break; + case SelectionKey.OP_READ | SelectionKey.OP_WRITE: + writePacket(key, con); + if (key.isValid()) + { + readPacket(key, con); + } + break; + } + } + } + + synchronized (_pendingClose) + { + while (!_pendingClose.isEmpty()) + { + try + { + con = _pendingClose.removeFirst(); + writeClosePacket(con); + closeConnectionImpl(con.getSelectionKey(), con); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + } + + try + { + Thread.sleep(SLEEP_TIME); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + closeSelectorThread(); + } + + private final void finishConnection(final SelectionKey key, final MMOConnection con) + { + try + { + ((SocketChannel) key.channel()).finishConnect(); + } + catch (IOException e) + { + con.getClient().onForcedDisconnection(); + closeConnectionImpl(key, con); + } + + // key might have been invalidated on finishConnect() + if (key.isValid()) + { + key.interestOps(key.interestOps() | SelectionKey.OP_READ); + key.interestOps(key.interestOps() & ~SelectionKey.OP_CONNECT); + } + } + + private final void acceptConnection(final SelectionKey key, MMOConnection con) + { + ServerSocketChannel ssc = (ServerSocketChannel) key.channel(); + SocketChannel sc; + + try + { + while ((sc = ssc.accept()) != null) + { + if ((_acceptFilter == null) || _acceptFilter.accept(sc)) + { + sc.configureBlocking(false); + SelectionKey clientKey = sc.register(_selector, SelectionKey.OP_READ); + con = new MMOConnection<>(this, sc.socket(), clientKey, TCP_NODELAY); + con.setClient(_clientFactory.create(con)); + clientKey.attach(con); + } + else + { + sc.socket().close(); + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + private final void readPacket(final SelectionKey key, final MMOConnection con) + { + if (!con.isClosed()) + { + ByteBuffer buf; + if ((buf = con.getReadBuffer()) == null) + { + buf = READ_BUFFER; + } + + // if we try to to do a read with no space in the buffer it will + // read 0 bytes + // going into infinite loop + if (buf.position() == buf.limit()) + { + System.exit(0); + } + + int result = -2; + + try + { + result = con.read(buf); + } + catch (IOException e) + { + // error handling goes bellow + } + + if (result > 0) + { + buf.flip(); + + final T client = con.getClient(); + + for (int i = 0; i < MAX_READ_PER_PASS; i++) + { + if (!tryReadPacket(key, client, buf, con)) + { + return; + } + } + + // only reachable if MAX_READ_PER_PASS has been reached + // check if there are some more bytes in buffer + // and allocate/compact to prevent content lose. + if (buf.remaining() > 0) + { + // did we use the READ_BUFFER ? + if (buf == READ_BUFFER) + { + // move the pending byte to the connections READ_BUFFER + allocateReadBuffer(con); + } + else + { + // move the first byte to the beginning :) + buf.compact(); + } + } + } + else + { + switch (result) + { + case 0: + case -1: + closeConnectionImpl(key, con); + break; + case -2: + con.getClient().onForcedDisconnection(); + closeConnectionImpl(key, con); + break; + } + } + } + } + + private final boolean tryReadPacket(final SelectionKey key, final T client, final ByteBuffer buf, final MMOConnection con) + { + switch (buf.remaining()) + { + case 0: + // buffer is full + // nothing to read + return false; + case 1: + // we don`t have enough data for header so we need to read + key.interestOps(key.interestOps() | SelectionKey.OP_READ); + + // did we use the READ_BUFFER ? + if (buf == READ_BUFFER) + { + // move the pending byte to the connections READ_BUFFER + allocateReadBuffer(con); + } + else + { + // move the first byte to the beginning :) + buf.compact(); + } + return false; + default: + // data size excluding header size :> + final int dataPending = (buf.getShort() & 0xFFFF) - HEADER_SIZE; + + // do we got enough bytes for the packet? + if (dataPending <= buf.remaining()) + { + // avoid parsing dummy packets (packets without body) + if (dataPending > 0) + { + final int pos = buf.position(); + parseClientPacket(pos, buf, dataPending, client); + buf.position(pos + dataPending); + } + + // if we are done with this buffer + if (!buf.hasRemaining()) + { + if (buf != READ_BUFFER) + { + con.setReadBuffer(null); + recycleBuffer(buf); + } + else + { + READ_BUFFER.clear(); + } + return false; + } + return true; + } + + // we don`t have enough bytes for the dataPacket so we need + // to read + key.interestOps(key.interestOps() | SelectionKey.OP_READ); + + // did we use the READ_BUFFER ? + if (buf == READ_BUFFER) + { + // move it`s position + buf.position(buf.position() - HEADER_SIZE); + // move the pending byte to the connections READ_BUFFER + allocateReadBuffer(con); + } + else + { + buf.position(buf.position() - HEADER_SIZE); + buf.compact(); + } + return false; + } + } + + private final void allocateReadBuffer(final MMOConnection con) + { + con.setReadBuffer(getPooledBuffer().put(READ_BUFFER)); + READ_BUFFER.clear(); + } + + private final void parseClientPacket(final int pos, final ByteBuffer buf, final int dataSize, final T client) + { + final boolean ret = client.decrypt(buf, dataSize); + + if (ret && buf.hasRemaining()) + { + // apply limit + final int limit = buf.limit(); + buf.limit(pos + dataSize); + final ReceivablePacket cp = _packetHandler.handlePacket(buf, client); + + if (cp != null) + { + cp._buf = buf; + cp._sbuf = STRING_BUFFER; + cp._client = client; + + if (cp.read()) + { + _executor.execute(cp); + } + + cp._buf = null; + cp._sbuf = null; + } + buf.limit(limit); + } + } + + private final void writeClosePacket(final MMOConnection con) + { + SendablePacket sp; + synchronized (con.getSendQueue()) + { + if (con.getSendQueue().isEmpty()) + { + return; + } + + while ((sp = con.getSendQueue().removeFirst()) != null) + { + WRITE_BUFFER.clear(); + + putPacketIntoWriteBuffer(con.getClient(), sp); + + WRITE_BUFFER.flip(); + + try + { + con.write(WRITE_BUFFER); + } + catch (IOException e) + { + // error handling goes on the if bellow + } + } + } + } + + protected final void writePacket(final SelectionKey key, final MMOConnection con) + { + if (!prepareWriteBuffer(con)) + { + key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); + return; + } + + DIRECT_WRITE_BUFFER.flip(); + + final int size = DIRECT_WRITE_BUFFER.remaining(); + + int result = -1; + + try + { + result = con.write(DIRECT_WRITE_BUFFER); + } + catch (IOException e) + { + // error handling goes on the if bellow + } + + // check if no error happened + if (result >= 0) + { + // check if we written everything + if (result == size) + { + // complete write + synchronized (con.getSendQueue()) + { + if (con.getSendQueue().isEmpty() && !con.hasPendingWriteBuffer()) + { + key.interestOps(key.interestOps() & ~SelectionKey.OP_WRITE); + } + } + } + else + { + // incomplete write + con.createWriteBuffer(DIRECT_WRITE_BUFFER); + } + } + else + { + con.getClient().onForcedDisconnection(); + closeConnectionImpl(key, con); + } + } + + private final boolean prepareWriteBuffer(final MMOConnection con) + { + boolean hasPending = false; + DIRECT_WRITE_BUFFER.clear(); + + // if there is pending content add it + if (con.hasPendingWriteBuffer()) + { + con.movePendingWriteBufferTo(DIRECT_WRITE_BUFFER); + hasPending = true; + } + + if ((DIRECT_WRITE_BUFFER.remaining() > 1) && !con.hasPendingWriteBuffer()) + { + final NioNetStackList> sendQueue = con.getSendQueue(); + final T client = con.getClient(); + SendablePacket sp; + + for (int i = 0; i < MAX_SEND_PER_PASS; i++) + { + synchronized (con.getSendQueue()) + { + if (sendQueue.isEmpty()) + { + sp = null; + } + else + { + sp = sendQueue.removeFirst(); + } + } + + if (sp == null) + { + break; + } + + hasPending = true; + + // put into WriteBuffer + putPacketIntoWriteBuffer(client, sp); + + WRITE_BUFFER.flip(); + + if (DIRECT_WRITE_BUFFER.remaining() >= WRITE_BUFFER.limit()) + { + DIRECT_WRITE_BUFFER.put(WRITE_BUFFER); + } + else + { + con.createWriteBuffer(WRITE_BUFFER); + break; + } + } + } + return hasPending; + } + + private final void putPacketIntoWriteBuffer(final T client, final SendablePacket sp) + { + WRITE_BUFFER.clear(); + + // reserve space for the size + final int headerPos = WRITE_BUFFER.position(); + final int dataPos = headerPos + HEADER_SIZE; + WRITE_BUFFER.position(dataPos); + + // set the write buffer + sp._buf = WRITE_BUFFER; + // set the client. + sp._client = client; + // write content to buffer + sp.write(); + // delete the write buffer + sp._buf = null; + + // size (inclusive header) + int dataSize = WRITE_BUFFER.position() - dataPos; + WRITE_BUFFER.position(dataPos); + client.encrypt(WRITE_BUFFER, dataSize); + + // recalculate size after encryption + dataSize = WRITE_BUFFER.position() - dataPos; + + WRITE_BUFFER.position(headerPos); + // write header + WRITE_BUFFER.putShort((short) (dataSize + HEADER_SIZE)); + WRITE_BUFFER.position(dataPos + dataSize); + } + + final void closeConnection(final MMOConnection con) + { + synchronized (_pendingClose) + { + _pendingClose.addLast(con); + } + } + + private final void closeConnectionImpl(final SelectionKey key, final MMOConnection con) + { + try + { + // notify connection + con.getClient().onDisconnection(); + } + finally + { + try + { + // close socket and the SocketChannel + con.close(); + } + catch (IOException e) + { + // ignore, we are closing anyway + } + finally + { + con.releaseBuffers(); + // clear attachment + key.attach(null); + // cancel key + key.cancel(); + } + } + } + + public final void shutdown() + { + _shutdown = true; + } + + protected void closeSelectorThread() + { + for (final SelectionKey key : _selector.keys()) + { + try + { + key.channel().close(); + } + catch (IOException e) + { + // ignore + } + } + + try + { + _selector.close(); + } + catch (IOException e) + { + // Ignore + } + } +} diff --git a/others/MMOCore/src/org/mmocore/network/SendablePacket.java b/others/MMOCore/src/org/mmocore/network/SendablePacket.java new file mode 100644 index 0000000000..1fb8e7d732 --- /dev/null +++ b/others/MMOCore/src/org/mmocore/network/SendablePacket.java @@ -0,0 +1,120 @@ +/* This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * http://www.gnu.org/copyleft/gpl.html + */ +package org.mmocore.network; + +/** + * @author KenM + * @param + */ +public abstract class SendablePacket> extends AbstractPacket +{ + protected final void putInt(final int value) + { + _buf.putInt(value); + } + + protected final void putDouble(final double value) + { + _buf.putDouble(value); + } + + protected final void putFloat(final float value) + { + _buf.putFloat(value); + } + + /** + * Write byte to the buffer.
+ * 8bit integer (00) + * @param data + */ + protected final void writeC(final int data) + { + _buf.put((byte) data); + } + + /** + * Write double to the buffer.
+ * 64bit double precision float (00 00 00 00 00 00 00 00) + * @param value + */ + protected final void writeF(final double value) + { + _buf.putDouble(value); + } + + /** + * Write short to the buffer.
+ * 16bit integer (00 00) + * @param value + */ + protected final void writeH(final int value) + { + _buf.putShort((short) value); + } + + /** + * Write int to the buffer.
+ * 32bit integer (00 00 00 00) + * @param value + */ + protected final void writeD(final int value) + { + _buf.putInt(value); + } + + /** + * Write long to the buffer.
+ * 64bit integer (00 00 00 00 00 00 00 00) + * @param value + */ + protected final void writeQ(final long value) + { + _buf.putLong(value); + } + + /** + * Write byte[] to the buffer.
+ * 8bit integer array (00 ...) + * @param data + */ + protected final void writeB(final byte[] data) + { + _buf.put(data); + } + + /** + * Write String to the buffer. + * @param text + */ + protected final void writeS(final String text) + { + if (text != null) + { + final int len = text.length(); + for (int i = 0; i < len; i++) + { + _buf.putChar(text.charAt(i)); + } + } + + _buf.putChar('\000'); + } + + protected abstract void write(); +} diff --git a/trunk/dist/libs/mmocore.jar b/trunk/dist/libs/mmocore.jar index 98f7c27b2d..f6a1f89f29 100644 Binary files a/trunk/dist/libs/mmocore.jar and b/trunk/dist/libs/mmocore.jar differ