A one size fits all plugin for vanilla servers running Minecraft Beta 1.7.3

feat: implement initial version of BetaProtect (#2)

* work

* finish block transactions

* clean imports

* fix: temporarily remove permission from betaprotect

authored by Willem Dinkelspiel and committed by GitHub d5354cd5 1caea1f6

-15
.idea/artifacts/GoldenAge_jar4.xml
··· 1 - <component name="ArtifactManager"> 2 - <artifact type="jar" name="GoldenAge:jar4"> 3 - <output-path>$USER_HOME$/Coding/b173server/plugins</output-path> 4 - <root id="archive" name="GoldenAge.jar"> 5 - <element id="module-output" name="GoldenAge" /> 6 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.18.3/jackson-annotations-2.18.3.jar" path-in-jar="/" /> 7 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.49.1.0/sqlite-jdbc-3.49.1.0.jar" path-in-jar="/" /> 8 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.18.3/jackson-dataformat-yaml-2.18.3.jar" path-in-jar="/" /> 9 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.18.3/jackson-databind-2.18.3.jar" path-in-jar="/" /> 10 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.18.3/jackson-core-2.18.3.jar" path-in-jar="/" /> 11 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/yaml/snakeyaml/2.3/snakeyaml-2.3.jar" path-in-jar="/" /> 12 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/Moresteck/uberbukkit/2.0.2-241217-1442-3a5552b/uberbukkit-2.0.2-241217-1442-3a5552b.jar" path-in-jar="/" /> 13 - </root> 14 - </artifact> 15 - </component>
+14 -14
.idea/artifacts/GoldenAge_jar5.xml .idea/artifacts/GoldenAge_jar_wsl.xml
··· 1 - <component name="ArtifactManager"> 2 - <artifact type="jar" name="GoldenAge:jar5"> 3 - <output-path>$PROJECT_DIR$/../b173server/plugins</output-path> 4 - <root id="archive" name="GoldenAge.jar"> 5 - <element id="module-output" name="GoldenAge" /> 6 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.18.3/jackson-annotations-2.18.3.jar" path-in-jar="/" /> 7 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.49.1.0/sqlite-jdbc-3.49.1.0.jar" path-in-jar="/" /> 8 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.18.3/jackson-dataformat-yaml-2.18.3.jar" path-in-jar="/" /> 9 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.18.3/jackson-databind-2.18.3.jar" path-in-jar="/" /> 10 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.18.3/jackson-core-2.18.3.jar" path-in-jar="/" /> 11 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/yaml/snakeyaml/2.4/snakeyaml-2.4.jar" path-in-jar="/" /> 12 - <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/Moresteck/uberbukkit/2.0.2-241217-1442-3a5552b/uberbukkit-2.0.2-241217-1442-3a5552b.jar" path-in-jar="/" /> 13 - </root> 14 - </artifact> 1 + <component name="ArtifactManager"> 2 + <artifact type="jar" name="GoldenAge:jar:wsl"> 3 + <output-path>$PROJECT_DIR$/../b173server/plugins</output-path> 4 + <root id="archive" name="GoldenAge.jar"> 5 + <element id="module-output" name="GoldenAge" /> 6 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.18.3/jackson-annotations-2.18.3.jar" path-in-jar="/" /> 7 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/xerial/sqlite-jdbc/3.49.1.0/sqlite-jdbc-3.49.1.0.jar" path-in-jar="/" /> 8 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/dataformat/jackson-dataformat-yaml/2.18.3/jackson-dataformat-yaml-2.18.3.jar" path-in-jar="/" /> 9 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.18.3/jackson-databind-2.18.3.jar" path-in-jar="/" /> 10 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.18.3/jackson-core-2.18.3.jar" path-in-jar="/" /> 11 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/org/yaml/snakeyaml/2.4/snakeyaml-2.4.jar" path-in-jar="/" /> 12 + <element id="extracted-dir" path="$MAVEN_REPOSITORY$/com/github/Moresteck/uberbukkit/2.0.2-241217-1442-3a5552b/uberbukkit-2.0.2-241217-1442-3a5552b.jar" path-in-jar="/" /> 13 + </root> 14 + </artifact> 15 15 </component>
+1 -1
.idea/misc.xml
··· 13 13 </list> 14 14 </option> 15 15 </component> 16 - <component name="ProjectRootManager" version="2" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK"> 16 + <component name="ProjectRootManager" version="2" languageLevel="JDK_23" project-jdk-name="corretto-1.8" project-jdk-type="JavaSDK"> 17 17 <output url="file://$PROJECT_DIR$/out" /> 18 18 </component> 19 19 </project>
-6
dependency-reduced-pom.xml
··· 20 20 </plugin> 21 21 </plugins> 22 22 </build> 23 - <repositories> 24 - <repository> 25 - <id>jitpack.io</id> 26 - <url>https://jitpack.io</url> 27 - </repository> 28 - </repositories> 29 23 <dependencies> 30 24 <dependency> 31 25 <groupId>org.projectlombok</groupId>
+380
eclipse-formatter.xml
··· 1 + <?xml version="1.0" encoding="utf-8"?> 2 + <profiles version="21"> 3 + <profile kind="CodeFormatterProfile" name="Default" version="21"> 4 + <setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/> 5 + <setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/> 6 + <setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/> 7 + <setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/> 8 + <setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/> 9 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/> 10 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/> 11 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/> 12 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/> 13 + <setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/> 14 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/> 15 + <setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/> 16 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/> 17 + <setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/> 18 + <setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/> 19 + <setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/> 20 + <setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/> 21 + <setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/> 22 + <setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/> 23 + <setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="true"/> 24 + <setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="1"/> 25 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/> 26 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/> 27 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/> 28 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/> 29 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/> 30 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/> 31 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="end_of_line"/> 32 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="end_of_line"/> 33 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/> 34 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/> 35 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/> 36 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/> 37 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/> 38 + <setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/> 39 + <setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="end_of_line"/> 40 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="preserve_positions"/> 41 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="preserve_positions"/> 42 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="preserve_positions"/> 43 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="preserve_positions"/> 44 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="preserve_positions"/> 45 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="preserve_positions"/> 46 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="preserve_positions"/> 47 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="preserve_positions"/> 48 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="preserve_positions"/> 49 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="preserve_positions"/> 50 + <setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="preserve_positions"/> 51 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/> 52 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/> 53 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/> 54 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/> 55 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/> 56 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/> 57 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/> 58 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/> 59 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/> 60 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/> 61 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/> 62 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/> 63 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/> 64 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/> 65 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/> 66 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/> 67 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/> 68 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/> 69 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/> 70 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/> 71 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/> 72 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/> 73 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/> 74 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/> 75 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/> 76 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/> 77 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/> 78 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/> 79 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/> 80 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/> 81 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/> 82 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/> 83 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/> 84 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/> 85 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/> 86 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/> 87 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/> 88 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/> 89 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/> 90 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/> 91 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/> 92 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/> 93 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/> 94 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/> 95 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/> 96 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/> 97 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/> 98 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/> 99 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/> 100 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/> 101 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/> 102 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/> 103 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/> 104 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/> 105 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/> 106 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/> 107 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/> 108 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/> 109 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/> 110 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/> 111 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/> 112 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/> 113 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/> 114 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/> 115 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/> 116 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/> 117 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/> 118 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/> 119 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/> 120 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/> 121 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/> 122 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/> 123 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/> 124 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/> 125 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/> 126 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/> 127 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/> 128 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/> 129 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/> 130 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/> 131 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/> 132 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/> 133 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/> 134 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/> 135 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/> 136 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/> 137 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/> 138 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/> 139 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/> 140 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/> 141 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/> 142 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/> 143 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/> 144 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/> 145 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/> 146 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/> 147 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/> 148 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/> 149 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/> 150 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/> 151 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/> 152 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/> 153 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/> 154 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/> 155 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/> 156 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/> 157 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/> 158 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/> 159 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/> 160 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/> 161 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/> 162 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/> 163 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/> 164 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/> 165 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/> 166 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/> 167 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/> 168 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/> 169 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/> 170 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/> 171 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/> 172 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/> 173 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/> 174 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/> 175 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/> 176 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/> 177 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/> 178 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/> 179 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/> 180 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/> 181 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/> 182 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/> 183 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/> 184 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/> 185 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/> 186 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/> 187 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/> 188 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/> 189 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/> 190 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/> 191 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/> 192 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/> 193 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/> 194 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/> 195 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/> 196 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/> 197 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/> 198 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/> 199 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/> 200 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/> 201 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/> 202 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/> 203 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/> 204 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/> 205 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/> 206 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/> 207 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/> 208 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="do not insert"/> 209 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="do not insert"/> 210 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="do not insert"/> 211 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/> 212 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/> 213 + <setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/> 214 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/> 215 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/> 216 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/> 217 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/> 218 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/> 219 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/> 220 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/> 221 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/> 222 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/> 223 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/> 224 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/> 225 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/> 226 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/> 227 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/> 228 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/> 229 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/> 230 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/> 231 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/> 232 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/> 233 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/> 234 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/> 235 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/> 236 + <setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/> 237 + <setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/> 238 + <setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="2"/> 239 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/> 240 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/> 241 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/> 242 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/> 243 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/> 244 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/> 245 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="0"/> 246 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/> 247 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/> 248 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/> 249 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="1"/> 250 + <setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/> 251 + <setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/> 252 + <setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/> 253 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/> 254 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/> 255 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/> 256 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/> 257 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/> 258 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/> 259 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/> 260 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="insert"/> 261 + <setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="true"/> 262 + <setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/> 263 + <setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="true"/> 264 + <setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/> 265 + <setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="true"/> 266 + <setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="true"/> 267 + <setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="true"/> 268 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/> 269 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/> 270 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="do not insert"/> 271 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/> 272 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/> 273 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="do not insert"/> 274 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/> 275 + <setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/> 276 + <setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/> 277 + <setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/> 278 + <setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/> 279 + <setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/> 280 + <setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/> 281 + <setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/> 282 + <setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/> 283 + <setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/> 284 + <setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/> 285 + <setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/> 286 + <setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/> 287 + <setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/> 288 + <setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/> 289 + <setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/> 290 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/> 291 + <setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/> 292 + <setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="false"/> 293 + <setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="false"/> 294 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="0"/> 295 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="0"/> 296 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/> 297 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="2"/> 298 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="0"/> 299 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/> 300 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="0"/> 301 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="2"/> 302 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/> 303 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="0"/> 304 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="0"/> 305 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="18"/> 306 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="0"/> 307 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="0"/> 308 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="0"/> 309 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="0"/> 310 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="0"/> 311 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="0"/> 312 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="0"/> 313 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="false"/> 314 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="0"/> 315 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="false"/> 316 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="0"/> 317 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="false"/> 318 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/> 319 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="false"/> 320 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/> 321 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="false"/> 322 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="0"/> 323 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="false"/> 324 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="0"/> 325 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="false"/> 326 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="0"/> 327 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/> 328 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="false"/> 329 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/> 330 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/> 331 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="0"/> 332 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="2"/> 333 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/> 334 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/> 335 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="2"/> 336 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="18"/> 337 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="false"/> 338 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="0"/> 339 + <setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="false"/> 340 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/> 341 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/> 342 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/> 343 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="0"/> 344 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/> 345 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="0"/> 346 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/> 347 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/> 348 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="0"/> 349 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/> 350 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="49"/> 351 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/> 352 + <setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="0"/> 353 + <setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="120"/> 354 + <setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="false"/> 355 + <setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/> 356 + <setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="false"/> 357 + <setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="false"/> 358 + <setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/> 359 + <setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="true"/> 360 + <setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="true"/> 361 + <setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="true"/> 362 + <setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/> 363 + <setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="false"/> 364 + <setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="false"/> 365 + <setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="false"/> 366 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/> 367 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/> 368 + <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/> 369 + <setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/> 370 + <setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/> 371 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/> 372 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/> 373 + <setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/> 374 + <setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/> 375 + <setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/> 376 + <setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/> 377 + <setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/> 378 + <setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/> 379 + </profile> 380 + </profiles>
+5 -3
pom.xml
··· 14 14 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 15 15 </properties> 16 16 17 + <!-- 17 18 <repositories> 18 19 <repository> 19 20 <id>jitpack.io</id> 20 21 <url>https://jitpack.io</url> 21 22 </repository> 22 23 </repositories> 24 + --> 23 25 24 26 <build> 25 27 <plugins> ··· 47 49 <scope>provided</scope> 48 50 </dependency> 49 51 <dependency> 50 - <groupId>com.github.Moresteck</groupId> 52 + <groupId>org.bukkit</groupId> 51 53 <artifactId>uberbukkit</artifactId> 52 - <version>2.0.2-241217-1442-3a5552b</version> 54 + <version>2.0.2</version> 53 55 <exclusions> 54 56 <exclusion> 55 57 <groupId>org.yaml</groupId> ··· 63 65 <version>3.49.1.0</version> 64 66 </dependency> 65 67 </dependencies> 66 - </project> 68 + </project>
+185 -180
src/main/java/dev/keii/goldenage/GoldenAge.java
··· 1 - package dev.keii.goldenage; 2 - 3 - import dev.keii.goldenage.commands.DatabaseCommand; 4 - import dev.keii.goldenage.commands.HistoryCommand; 5 - import dev.keii.goldenage.commands.ListCommand; 6 - import dev.keii.goldenage.commands.SeenCommand; 7 - import dev.keii.goldenage.commands.StatisticsCommand; 8 - import dev.keii.goldenage.config.Config; 9 - import dev.keii.goldenage.config.ConfigLoader; 10 - import dev.keii.goldenage.config.Env; 11 - import dev.keii.goldenage.listeners.PlayerJoinListener; 12 - import dev.keii.goldenage.migration.Migrator; 13 - import dev.keii.goldenage.statistics.AnonymousStatistics; 14 - import dev.keii.goldenage.statistics.Statistics; 15 - import dev.keii.goldenage.utils.CommandUtility; 16 - import dev.keii.goldenage.utils.DatabaseUtility; 17 - import dev.keii.goldenage.utils.Logger; 18 - import lombok.Getter; 19 - import lombok.SneakyThrows; 20 - import org.bukkit.Bukkit; 21 - import org.bukkit.plugin.PluginManager; 22 - import org.bukkit.plugin.java.JavaPlugin; 23 - 24 - import java.io.*; 25 - import java.nio.charset.StandardCharsets; 26 - import java.sql.SQLException; 27 - 28 - public class GoldenAge extends JavaPlugin { 29 - @Getter 30 - private DatabaseUtility databaseUtility; 31 - 32 - @Getter 33 - private Migrator migrator; 34 - 35 - @Getter 36 - private static Logger logger; 37 - 38 - @Getter 39 - private Config config; 40 - 41 - @Getter 42 - private Statistics statistics; 43 - 44 - @SneakyThrows 45 - public boolean setupConfig() { 46 - File configFile = new File("plugins/GoldenAge/config.yml"); 47 - 48 - try { 49 - if (configFile.exists()) { 50 - return true; 51 - } 52 - 53 - GoldenAge.getLogger().info("Creating config..."); 54 - 55 - InputStream configInputStream = getClassLoader().getResourceAsStream("config.yml"); 56 - FileWriter configFileWriter = new FileWriter("plugins/GoldenAge/config.yml"); 57 - 58 - if (configInputStream != null) { 59 - try (BufferedReader reader = new BufferedReader( 60 - new InputStreamReader(configInputStream, StandardCharsets.UTF_8))) { 61 - StringBuilder content = new StringBuilder(); 62 - String line; 63 - GoldenAge.getLogger().info("Writing defaults to config..."); 64 - while ((line = reader.readLine()) != null) { 65 - content.append(line).append(System.lineSeparator()); 66 - } 67 - configFileWriter.write(content.toString()); 68 - configFileWriter.close(); 69 - } 70 - 71 - configInputStream.close(); 72 - GoldenAge.getLogger().info("Config created!"); 73 - } 74 - return true; 75 - } catch (IOException e) { 76 - GoldenAge.getLogger().severe("Failed to create config!"); 77 - GoldenAge.getLogger().severe(e.getMessage()); 78 - GoldenAge.getLogger().severe(e.toString()); 79 - Bukkit.getPluginManager().disablePlugin(this); 80 - throw e; 81 - // return false; 82 - } 83 - } 84 - 85 - @Override 86 - public void onEnable() { 87 - GoldenAge.logger = new Logger("[GoldenAge]"); 88 - GoldenAge.getLogger().info("Enabling GoldenAge..."); 89 - 90 - if (!getDataFolder().exists()) { 91 - getDataFolder().mkdirs(); 92 - } 93 - 94 - // Return out of onEnable if setting up config failed 95 - if (!setupConfig()) { 96 - return; 97 - } 98 - 99 - try { 100 - GoldenAge.getLogger().info("Loading config..."); 101 - this.config = ConfigLoader.loadConfig("plugins/GoldenAge/config.yml"); 102 - } catch (IOException e) { 103 - GoldenAge.getLogger().severe("Failed to read config!"); 104 - GoldenAge.getLogger().severe(e.getMessage()); 105 - Bukkit.getPluginManager().disablePlugin(this); 106 - return; 107 - } 108 - 109 - File databaseFile = new File("plugins/GoldenAge/database.db"); 110 - 111 - this.databaseUtility = new DatabaseUtility(this, "jdbc:sqlite:" + databaseFile.getAbsolutePath()); 112 - this.databaseUtility.openConnection(); 113 - 114 - this.migrator = new Migrator(this); 115 - try { 116 - this.migrator.setupMigrationsTable(); 117 - } catch (SQLException e) { 118 - GoldenAge.getLogger().severe("Failed to create migrations table!"); 119 - GoldenAge.getLogger().severe(e.getMessage()); 120 - Bukkit.getPluginManager().disablePlugin(this); 121 - return; 122 - } 123 - 124 - if (config.getDatabase().isAutoMigrate()) { 125 - Migrator migrator = new Migrator(this); 126 - try { 127 - GoldenAge.getLogger().info("Migrating database..."); 128 - migrator.migrate(); 129 - GoldenAge.getLogger().info("Finished migrating database."); 130 - } catch (SQLException e) { 131 - GoldenAge.getLogger().severe("Failed to migrate db!"); 132 - GoldenAge.getLogger().severe(e.getMessage()); 133 - Bukkit.getPluginManager().disablePlugin(this); 134 - return; 135 - } 136 - } 137 - 138 - if (config.getCommands().getList().isEnabled()) 139 - this.getCommand("list").setExecutor(new ListCommand(this)); 140 - else 141 - CommandUtility.unregisterCommand("list"); 142 - if (config.getCommands().getSeen().isEnabled()) 143 - this.getCommand("seen").setExecutor(new SeenCommand(this)); 144 - else 145 - CommandUtility.unregisterCommand("seen"); 146 - if (config.getCommands().getHistory().isEnabled()) 147 - this.getCommand("history").setExecutor(new HistoryCommand(this)); 148 - else 149 - CommandUtility.unregisterCommand("history"); 150 - if (config.getEnv().equals(Env.Development)) { 151 - this.getCommand("db").setExecutor(new DatabaseCommand(this)); 152 - this.getCommand("statistics").setExecutor(new StatisticsCommand(this)); 153 - } else { 154 - CommandUtility.unregisterCommand("db"); 155 - CommandUtility.unregisterCommand("statistics"); 156 - } 157 - 158 - PluginManager pm = this.getServer().getPluginManager(); 159 - pm.registerEvents(new PlayerJoinListener(this), this); 160 - 161 - if (config.getStatistics().getServerId() != null) { 162 - this.statistics = new Statistics(this, config.getStatistics().getRemote(), 163 - config.getStatistics().getServerId(), 164 - config.getStatistics().getServerSecret()); 165 - } else { 166 - this.statistics = new AnonymousStatistics(this, config.getStatistics().getRemote()); 167 - } 168 - statistics.beginScheduler(); 169 - 170 - GoldenAge.getLogger().info("GoldenAge has been enabled!"); 171 - } 172 - 173 - @Override 174 - public void onDisable() { 175 - if (this.databaseUtility != null) 176 - this.databaseUtility.closeConnection(); 177 - 178 - getLogger().info("GoldenAge has been disabled!"); 179 - } 180 - } 1 + package dev.keii.goldenage; 2 + 3 + import dev.keii.goldenage.betaprotect.BetaProtect; 4 + import dev.keii.goldenage.commands.DatabaseCommand; 5 + import dev.keii.goldenage.commands.HistoryCommand; 6 + import dev.keii.goldenage.commands.ListCommand; 7 + import dev.keii.goldenage.commands.SeenCommand; 8 + import dev.keii.goldenage.config.Config; 9 + import dev.keii.goldenage.config.ConfigLoader; 10 + import dev.keii.goldenage.config.Env; 11 + import dev.keii.goldenage.dao.WorldDao; 12 + import dev.keii.goldenage.listeners.PlayerJoinListener; 13 + import dev.keii.goldenage.migration.Migrator; 14 + import dev.keii.goldenage.statistics.Statistics; 15 + import dev.keii.goldenage.utils.DatabaseUtility; 16 + import dev.keii.goldenage.utils.Logger; 17 + import lombok.Getter; 18 + import lombok.SneakyThrows; 19 + import org.bukkit.Bukkit; 20 + import org.bukkit.World; 21 + import org.bukkit.plugin.PluginManager; 22 + import org.bukkit.plugin.java.JavaPlugin; 23 + 24 + import java.io.*; 25 + import java.nio.charset.StandardCharsets; 26 + import java.sql.SQLException; 27 + 28 + public class GoldenAge extends JavaPlugin { 29 + @Getter 30 + private DatabaseUtility databaseUtility; 31 + 32 + @Getter 33 + private Migrator migrator; 34 + 35 + @Getter 36 + private static Logger logger; 37 + 38 + @Getter 39 + private Config config; 40 + 41 + @Getter 42 + private Statistics statistics; 43 + 44 + @SneakyThrows 45 + public boolean setupConfig() { 46 + File configFile = new File("plugins/GoldenAge/config.yml"); 47 + 48 + try { 49 + if (configFile.exists()) { 50 + return true; 51 + } 52 + 53 + GoldenAge.getLogger().info("Creating config..."); 54 + 55 + InputStream configInputStream = getClassLoader().getResourceAsStream("config.yml"); 56 + FileWriter configFileWriter = new FileWriter("plugins/GoldenAge/config.yml"); 57 + 58 + if (configInputStream != null) { 59 + try (BufferedReader reader = new BufferedReader( 60 + new InputStreamReader(configInputStream, StandardCharsets.UTF_8))) { 61 + StringBuilder content = new StringBuilder(); 62 + String line; 63 + GoldenAge.getLogger().info("Writing defaults to config..."); 64 + while ((line = reader.readLine()) != null) { 65 + content.append(line).append(System.lineSeparator()); 66 + } 67 + configFileWriter.write(content.toString()); 68 + configFileWriter.close(); 69 + } 70 + 71 + configInputStream.close(); 72 + GoldenAge.getLogger().info("Config created!"); 73 + } 74 + return true; 75 + } catch (IOException e) { 76 + GoldenAge.getLogger().severe("Failed to create config!"); 77 + GoldenAge.getLogger().severe(e.getMessage()); 78 + GoldenAge.getLogger().severe(e.toString()); 79 + Bukkit.getPluginManager().disablePlugin(this); 80 + throw e; 81 + // return false; 82 + } 83 + } 84 + 85 + @Override 86 + public void onEnable() { 87 + GoldenAge.logger = new Logger("[GoldenAge]"); 88 + GoldenAge.getLogger().info("Enabling GoldenAge..."); 89 + 90 + if (!getDataFolder().exists()) { 91 + getDataFolder().mkdirs(); 92 + } 93 + 94 + // Return out of onEnable if setting up config failed 95 + if (!setupConfig()) { 96 + return; 97 + } 98 + 99 + try { 100 + GoldenAge.getLogger().info("Loading config."); 101 + this.config = ConfigLoader.loadConfig("plugins/GoldenAge/config.yml"); 102 + } catch (IOException e) { 103 + GoldenAge.getLogger().severe("Failed to read config!"); 104 + GoldenAge.getLogger().severe(e.getMessage()); 105 + Bukkit.getPluginManager().disablePlugin(this); 106 + return; 107 + } 108 + 109 + File databaseFile = new File("plugins/GoldenAge/database.db"); 110 + 111 + this.databaseUtility = new DatabaseUtility(this, "jdbc:sqlite:" + databaseFile.getAbsolutePath()); 112 + this.databaseUtility.openConnection(); 113 + 114 + this.migrator = new Migrator(this); 115 + try { 116 + this.migrator.setupMigrationsTable(); 117 + } catch (SQLException e) { 118 + GoldenAge.getLogger().severe("Failed to create migrations table!"); 119 + GoldenAge.getLogger().severe(e.getMessage()); 120 + Bukkit.getPluginManager().disablePlugin(this); 121 + return; 122 + } 123 + 124 + if (config.getDatabase().isAutoMigrate()) { 125 + Migrator migrator = new Migrator(this); 126 + try { 127 + GoldenAge.getLogger().info("Migrating database..."); 128 + migrator.migrate(); 129 + GoldenAge.getLogger().info("Finished migrating database."); 130 + } catch (SQLException e) { 131 + GoldenAge.getLogger().severe("Failed to migrate db!"); 132 + GoldenAge.getLogger().severe(e.getMessage()); 133 + Bukkit.getPluginManager().disablePlugin(this); 134 + return; 135 + } 136 + } 137 + 138 + WorldDao worldDao = new WorldDao(this.getDatabaseUtility()); 139 + for (World world : Bukkit.getWorlds()) { 140 + dev.keii.goldenage.models.World existingWorld = worldDao.getWorldByUuid(world.getUID()); 141 + if (existingWorld != null) 142 + continue; 143 + 144 + // Create world in database if it doesn't exist 145 + dev.keii.goldenage.models.World dbWorld = new dev.keii.goldenage.models.World(world.getName(), world.getUID()); 146 + worldDao.insertWorld(dbWorld); 147 + GoldenAge.getLogger().info("Created world '" + world.getName() + "' in database"); 148 + } 149 + 150 + if (config.getCommands().getList().isEnabled()) 151 + this.getCommand("list").setExecutor(new ListCommand(this)); 152 + if (config.getCommands().getSeen().isEnabled()) 153 + this.getCommand("seen").setExecutor(new SeenCommand(this)); 154 + if (config.getCommands().getHistory().isEnabled()) 155 + this.getCommand("history").setExecutor(new HistoryCommand(this)); 156 + if (config.getEnv().equals(Env.Development)) 157 + this.getCommand("db").setExecutor(new DatabaseCommand(this)); 158 + 159 + PluginManager pm = this.getServer().getPluginManager(); 160 + pm.registerEvents(new PlayerJoinListener(this), this); 161 + 162 + if (config.getStatistics().isEnabled()) { 163 + this.statistics = new Statistics(this, config.getStatistics().getRemote(), config.getStatistics().getServerId(), config.getStatistics().getServerSecret()); 164 + statistics.beginScheduler(); 165 + GoldenAge.getLogger().info("Statistics has been enabled!"); 166 + } 167 + 168 + if (config.getBetaProtect().isEnabled()) { 169 + BetaProtect betaProtect = new BetaProtect(this); 170 + betaProtect.registerCommands(); 171 + betaProtect.registerListeners(); 172 + GoldenAge.getLogger().info("BetaProtect has been enabled!"); 173 + } 174 + 175 + GoldenAge.getLogger().info("GoldenAge has been enabled!"); 176 + } 177 + 178 + @Override 179 + public void onDisable() { 180 + if (this.databaseUtility != null) 181 + this.databaseUtility.closeConnection(); 182 + 183 + getLogger().info("GoldenAge has been disabled!"); 184 + } 185 + }
+58
src/main/java/dev/keii/goldenage/betaprotect/BetaProtect.java
··· 1 + package dev.keii.goldenage.betaprotect; 2 + 3 + import java.util.HashMap; 4 + import java.util.HashSet; 5 + import java.util.Set; 6 + 7 + import org.bukkit.block.Block; 8 + import org.bukkit.plugin.PluginManager; 9 + 10 + import dev.keii.goldenage.GoldenAge; 11 + import dev.keii.goldenage.betaprotect.commands.BetaProtectCommand; 12 + import dev.keii.goldenage.betaprotect.listeners.BlockBreakListener; 13 + import dev.keii.goldenage.betaprotect.listeners.BlockBurnListener; 14 + import dev.keii.goldenage.betaprotect.listeners.BlockPlaceListener; 15 + import dev.keii.goldenage.betaprotect.listeners.EntityExplodeListener; 16 + import dev.keii.goldenage.betaprotect.listeners.PlayerBucketEmptyListener; 17 + import dev.keii.goldenage.betaprotect.listeners.PlayerBucketFillListener; 18 + import dev.keii.goldenage.betaprotect.listeners.PlayerInteractListener; 19 + import lombok.Getter; 20 + 21 + public class BetaProtect { 22 + @Getter 23 + private GoldenAge plugin; 24 + // UserId, Interacted Container 25 + public HashMap<Integer, Block> usersInContainers; 26 + 27 + public Set<Integer> usersInInteractMode; 28 + 29 + public BetaProtect(GoldenAge plugin) { 30 + this.plugin = plugin; 31 + this.usersInContainers = new HashMap<>(); 32 + this.usersInInteractMode = new HashSet<Integer>(); 33 + } 34 + 35 + public void registerCommands() { 36 + this.plugin.getCommand("betaprotect").setExecutor(new BetaProtectCommand(this)); 37 + } 38 + 39 + public void registerListeners() { 40 + PluginManager pm = this.plugin.getServer().getPluginManager(); 41 + 42 + // Block Transactions 43 + pm.registerEvents(new BlockBreakListener(this), this.plugin); 44 + pm.registerEvents(new BlockBurnListener(this), this.plugin); 45 + pm.registerEvents(new BlockPlaceListener(this), this.plugin); 46 + pm.registerEvents(new EntityExplodeListener(this), this.plugin); 47 + pm.registerEvents(new PlayerBucketEmptyListener(this), this.plugin); 48 + pm.registerEvents(new PlayerBucketFillListener(this), this.plugin); 49 + pm.registerEvents(new PlayerInteractListener(this), this.plugin); 50 + 51 + // Container Transactions 52 + // -- Container Transactions aren't implemented yet because of limitations in the server software 53 + // pm.registerEvents(new PlayerMoveListener(this), this.plugin); 54 + // pm.registerEvents(new ChestListener(this), this.plugin); 55 + // pm.registerEvents(new BlockDispenseListener(this), this.plugin); 56 + 57 + } 58 + }
+67
src/main/java/dev/keii/goldenage/betaprotect/commands/BetaProtectCommand.java
··· 1 + package dev.keii.goldenage.betaprotect.commands; 2 + 3 + import dev.keii.goldenage.GoldenAge; 4 + import dev.keii.goldenage.betaprotect.BetaProtect; 5 + import dev.keii.goldenage.config.Env; 6 + import dev.keii.goldenage.dao.UserDao; 7 + import dev.keii.goldenage.migration.Migrator; 8 + import dev.keii.goldenage.models.User; 9 + import dev.keii.goldenage.utils.DatabaseUtility; 10 + import org.bukkit.command.Command; 11 + import org.bukkit.command.CommandExecutor; 12 + import org.bukkit.command.CommandSender; 13 + import org.bukkit.entity.Player; 14 + 15 + import java.io.PrintWriter; 16 + import java.io.StringWriter; 17 + import java.sql.SQLException; 18 + 19 + @SuppressWarnings("unused") 20 + public class BetaProtectCommand implements CommandExecutor { 21 + BetaProtect betaProtect; 22 + GoldenAge plugin; 23 + 24 + public BetaProtectCommand(BetaProtect betaProtect) { 25 + this.betaProtect = betaProtect; 26 + this.plugin = betaProtect.getPlugin(); 27 + } 28 + 29 + @Override 30 + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 31 + if (args.length == 0) { 32 + sender.sendMessage(this.plugin.getConfig().getErrors().getInsufficientArguments()); 33 + return false; 34 + } 35 + 36 + if (!(sender instanceof Player)) { 37 + //message 38 + return true; 39 + } 40 + 41 + Player player = (Player) sender; 42 + 43 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 44 + User user = userDao.getUserByUuid(player.getUniqueId()); 45 + if (user == null) { 46 + GoldenAge.getLogger().severe("Player who ran BetaProtect command didn't exist in database."); 47 + sender.sendMessage(this.plugin.getConfig().getErrors().getInternalServerError()); 48 + return true; 49 + } 50 + 51 + if (args[0].equalsIgnoreCase("inspect") || args[0].equalsIgnoreCase("i")) { 52 + if (!this.betaProtect.usersInInteractMode.contains(user.getId())) { 53 + this.betaProtect.usersInInteractMode.add(user.getId()); 54 + sender.sendMessage(this.plugin.getConfig().getBetaProtect().getCommands().getBetaProtect().getInspect().getOnMessage()); 55 + return true; 56 + } 57 + 58 + this.betaProtect.usersInInteractMode.remove(user.getId()); 59 + sender.sendMessage(this.plugin.getConfig().getBetaProtect().getCommands().getBetaProtect().getInspect().getOffMessage()); 60 + return true; 61 + } 62 + 63 + sender.sendMessage(this.plugin.getConfig().getErrors().getInvalidArgument(args[0])); 64 + return false; 65 + } 66 + 67 + }
+100
src/main/java/dev/keii/goldenage/betaprotect/dao/BlockTransactionDao.java
··· 1 + package dev.keii.goldenage.betaprotect.dao; 2 + 3 + import java.sql.PreparedStatement; 4 + import java.sql.ResultSet; 5 + import java.sql.SQLException; 6 + import java.sql.Types; 7 + import java.time.ZoneOffset; 8 + import java.util.ArrayList; 9 + import java.util.List; 10 + 11 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 12 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 13 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 14 + import dev.keii.goldenage.dao.UserDao; 15 + import dev.keii.goldenage.dao.WorldDao; 16 + import dev.keii.goldenage.models.User; 17 + import dev.keii.goldenage.models.World; 18 + import dev.keii.goldenage.utils.DatabaseUtility; 19 + import dev.keii.goldenage.utils.DateUtility; 20 + 21 + public class BlockTransactionDao { 22 + private final DatabaseUtility db; 23 + 24 + public BlockTransactionDao(DatabaseUtility db) { 25 + this.db = db; 26 + } 27 + 28 + public void insertBlockTransaction(BlockTransaction blockTransaction) { 29 + if (blockTransaction.getId() != null) { 30 + throw new IllegalArgumentException("BlockTransaction ID must be null for new block transactions"); 31 + } 32 + 33 + try (PreparedStatement stmt = db.getConnection().prepareStatement("INSERT INTO block_transactions(actor, user_id, x, y, z, world_id, action, block_id, block_data, created_at) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { 34 + stmt.setInt(1, blockTransaction.getActor().toInt()); 35 + if (blockTransaction.getUser() != null) 36 + stmt.setInt(2, blockTransaction.getUser().getId()); 37 + else 38 + stmt.setNull(2, Types.INTEGER); 39 + stmt.setInt(3, blockTransaction.getX()); 40 + stmt.setInt(4, blockTransaction.getY()); 41 + stmt.setInt(5, blockTransaction.getZ()); 42 + stmt.setInt(6, blockTransaction.getWorldId()); 43 + stmt.setInt(7, blockTransaction.getAction().toInt()); 44 + stmt.setInt(8, blockTransaction.getBlockId()); 45 + stmt.setInt(9, blockTransaction.getBlockData()); 46 + stmt.setInt(10, (int) blockTransaction.getCreatedAt().toEpochSecond(ZoneOffset.UTC)); 47 + stmt.execute(); 48 + stmt.close(); 49 + 50 + db.getConnection().commit(); 51 + } catch (SQLException e) { 52 + throw new RuntimeException(e); 53 + } 54 + } 55 + 56 + public List<BlockTransaction> getBlockTransactionsAtLocation(int x, int y, int z, int amount, int page) { 57 + List<BlockTransaction> transactionList = new ArrayList<>(); 58 + 59 + try (PreparedStatement stmt = db.getConnection().prepareStatement("SELECT id, actor, user_id, x, y, z, world_id, action, block_id, block_data, created_at FROM block_transactions WHERE x = ? AND y = ? AND z = ? ORDER BY created_at DESC LIMIT ? OFFSET ?")) { 60 + stmt.setInt(1, x); 61 + stmt.setInt(2, y); 62 + stmt.setInt(3, z); 63 + 64 + stmt.setInt(4, amount); 65 + stmt.setInt(5, page * amount); 66 + 67 + ResultSet rs = stmt.executeQuery(); 68 + 69 + 70 + while (rs.next()) { 71 + int userId = rs.getInt(3); 72 + User user = null; 73 + if (!rs.wasNull()) { 74 + UserDao userDao = new UserDao(this.db); 75 + user = userDao.getUserById(userId); 76 + 77 + if (user == null) { 78 + throw new Exception("User was not found in DB"); 79 + } 80 + } 81 + 82 + WorldDao worldDao = new WorldDao(this.db); 83 + World world = worldDao.getWorldById(rs.getInt(7)); 84 + 85 + if (world == null) { 86 + throw new Exception("World was not found in DB"); 87 + } 88 + 89 + BlockTransaction blockTransaction = new BlockTransaction(rs.getInt(1), TransactionActor.fromInt(rs.getInt(2)), TransactionAction.fromInt(rs.getInt(8)), user, rs.getInt(4), rs.getInt(5), rs.getInt(6), rs.getInt(9), (byte) rs.getInt(10), world, DateUtility.epochSecondsToDateTime(rs.getInt(11))); 90 + transactionList.add(blockTransaction); 91 + } 92 + 93 + rs.close(); 94 + stmt.close(); 95 + return transactionList; 96 + } catch (Exception e) { 97 + throw new RuntimeException(e); 98 + } 99 + } 100 + }
+46
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockBreakListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + 6 + import org.bukkit.event.EventHandler; 7 + import org.bukkit.event.Listener; 8 + import org.bukkit.event.block.BlockBreakEvent; 9 + 10 + import dev.keii.goldenage.GoldenAge; 11 + import dev.keii.goldenage.betaprotect.BetaProtect; 12 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 13 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 14 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 15 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 16 + import dev.keii.goldenage.dao.UserDao; 17 + import dev.keii.goldenage.dao.WorldDao; 18 + import dev.keii.goldenage.models.User; 19 + import dev.keii.goldenage.models.World; 20 + 21 + public class BlockBreakListener implements Listener { 22 + private final GoldenAge plugin; 23 + 24 + public BlockBreakListener(BetaProtect betaProtect) { 25 + this.plugin = betaProtect.getPlugin(); 26 + } 27 + 28 + @EventHandler 29 + public void onBlockBreak(BlockBreakEvent event) throws Exception { 30 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 31 + User user = userDao.getUserByUuid(event.getPlayer().getUniqueId()); 32 + if (user == null) { 33 + throw new Exception("Player does not exist"); 34 + } 35 + 36 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 37 + World world = worldDao.getWorldByUuid(event.getBlock().getWorld().getUID()); 38 + if (world == null) { 39 + throw new Exception("World does not exist"); 40 + } 41 + 42 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Player, TransactionAction.Remove, user, event.getBlock(), world, LocalDateTime.now(ZoneOffset.UTC)); 43 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 44 + blockTransactionDao.insertBlockTransaction(blockTransaction); 45 + } 46 + }
+38
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockBurnListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + 6 + import org.bukkit.event.EventHandler; 7 + import org.bukkit.event.Listener; 8 + import org.bukkit.event.block.BlockBurnEvent; 9 + 10 + import dev.keii.goldenage.GoldenAge; 11 + import dev.keii.goldenage.betaprotect.BetaProtect; 12 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 13 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 14 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 15 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 16 + import dev.keii.goldenage.dao.WorldDao; 17 + import dev.keii.goldenage.models.World; 18 + 19 + public class BlockBurnListener implements Listener { 20 + private final GoldenAge plugin; 21 + 22 + public BlockBurnListener(BetaProtect betaProtect) { 23 + this.plugin = betaProtect.getPlugin(); 24 + } 25 + 26 + @EventHandler 27 + public void onBlockBurn(BlockBurnEvent event) throws Exception { 28 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 29 + World world = worldDao.getWorldByUuid(event.getBlock().getWorld().getUID()); 30 + if (world == null) { 31 + throw new Exception("World does not exist"); 32 + } 33 + 34 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Fire, TransactionAction.Remove, null, event.getBlock(), world, LocalDateTime.now(ZoneOffset.UTC)); 35 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 36 + blockTransactionDao.insertBlockTransaction(blockTransaction); 37 + } 38 + }
+4
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockDispenseListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + public class BlockDispenseListener { 4 + }
+46
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockPlaceListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + 6 + import org.bukkit.event.EventHandler; 7 + import org.bukkit.event.Listener; 8 + import org.bukkit.event.block.BlockPlaceEvent; 9 + 10 + import dev.keii.goldenage.GoldenAge; 11 + import dev.keii.goldenage.betaprotect.BetaProtect; 12 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 13 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 14 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 15 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 16 + import dev.keii.goldenage.dao.UserDao; 17 + import dev.keii.goldenage.dao.WorldDao; 18 + import dev.keii.goldenage.models.User; 19 + import dev.keii.goldenage.models.World; 20 + 21 + public class BlockPlaceListener implements Listener { 22 + private final GoldenAge plugin; 23 + 24 + public BlockPlaceListener(BetaProtect betaProtect) { 25 + this.plugin = betaProtect.getPlugin(); 26 + } 27 + 28 + @EventHandler 29 + public void onBlockPlace(BlockPlaceEvent event) throws Exception { 30 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 31 + User user = userDao.getUserByUuid(event.getPlayer().getUniqueId()); 32 + if (user == null) { 33 + throw new Exception("Player does not exist"); 34 + } 35 + 36 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 37 + World world = worldDao.getWorldByUuid(event.getBlock().getWorld().getUID()); 38 + if (world == null) { 39 + throw new Exception("World does not exist"); 40 + } 41 + 42 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Player, TransactionAction.Add, user, event.getBlock(), world, LocalDateTime.now(ZoneOffset.UTC)); 43 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 44 + blockTransactionDao.insertBlockTransaction(blockTransaction); 45 + } 46 + }
+31
src/main/java/dev/keii/goldenage/betaprotect/listeners/ChestListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import org.bukkit.event.EventHandler; 4 + import org.bukkit.event.Listener; 5 + import org.bukkit.event.inventory.ChestOpenedEvent; 6 + import org.bukkit.event.player.PlayerInteractEvent; 7 + 8 + import dev.keii.goldenage.GoldenAge; 9 + import dev.keii.goldenage.betaprotect.BetaProtect; 10 + 11 + public class ChestListener implements Listener { 12 + private final GoldenAge plugin; 13 + private final BetaProtect betaProtect; 14 + 15 + public ChestListener(BetaProtect betaProtect) { 16 + this.plugin = betaProtect.getPlugin(); 17 + this.betaProtect = betaProtect; 18 + GoldenAge.getLogger().info("Testa"); 19 + } 20 + 21 + @EventHandler 22 + public void onChestOpen(ChestOpenedEvent event) { 23 + GoldenAge.getLogger().info("Test1"); 24 + } 25 + 26 + 27 + @EventHandler 28 + public void onPlayerInteract(PlayerInteractEvent event) { 29 + GoldenAge.getLogger().info("Test2"); 30 + } 31 + }
+61
src/main/java/dev/keii/goldenage/betaprotect/listeners/EntityExplodeListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + import java.util.List; 6 + 7 + import org.bukkit.block.Block; 8 + import org.bukkit.entity.Creeper; 9 + import org.bukkit.entity.Fireball; 10 + import org.bukkit.entity.TNTPrimed; 11 + import org.bukkit.event.EventHandler; 12 + import org.bukkit.event.Listener; 13 + import org.bukkit.event.entity.EntityExplodeEvent; 14 + 15 + import dev.keii.goldenage.GoldenAge; 16 + import dev.keii.goldenage.betaprotect.BetaProtect; 17 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 18 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 19 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 20 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 21 + import dev.keii.goldenage.dao.WorldDao; 22 + import dev.keii.goldenage.models.World; 23 + 24 + public class EntityExplodeListener implements Listener { 25 + private final GoldenAge plugin; 26 + 27 + public EntityExplodeListener(BetaProtect betaProtect) { 28 + this.plugin = betaProtect.getPlugin(); 29 + } 30 + 31 + @EventHandler 32 + public void onEntityExplode(EntityExplodeEvent event) throws Exception { 33 + List<Block> blocks = event.blockList(); 34 + 35 + if (blocks.isEmpty()) 36 + return; 37 + 38 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 39 + // Get the world for the first block since blocks can't be broken across dimensions 40 + World world = worldDao.getWorldByUuid(blocks.get(0).getWorld().getUID()); 41 + if (world == null) { 42 + throw new Exception("World does not exist"); 43 + } 44 + 45 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 46 + 47 + TransactionActor actor = TransactionActor.Unknown; 48 + if (event.getEntity() instanceof TNTPrimed) 49 + actor = TransactionActor.PrimedTNT; 50 + else if (event.getEntity() instanceof Creeper) 51 + actor = TransactionActor.Creeper; 52 + else if (event.getEntity() instanceof Fireball) 53 + actor = TransactionActor.Fireball; 54 + 55 + for (Block block : event.blockList()) { 56 + BlockTransaction blockTransaction = new BlockTransaction(actor, TransactionAction.Remove, null, block, world, LocalDateTime.now(ZoneOffset.UTC)); 57 + blockTransactionDao.insertBlockTransaction(blockTransaction); 58 + } 59 + 60 + } 61 + }
+49
src/main/java/dev/keii/goldenage/betaprotect/listeners/PlayerBucketEmptyListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + 6 + import org.bukkit.block.Block; 7 + import org.bukkit.event.EventHandler; 8 + import org.bukkit.event.Listener; 9 + import org.bukkit.event.player.PlayerBucketEmptyEvent; 10 + 11 + import dev.keii.goldenage.GoldenAge; 12 + import dev.keii.goldenage.betaprotect.BetaProtect; 13 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 14 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 15 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 16 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 17 + import dev.keii.goldenage.dao.UserDao; 18 + import dev.keii.goldenage.dao.WorldDao; 19 + import dev.keii.goldenage.models.User; 20 + import dev.keii.goldenage.models.World; 21 + 22 + public class PlayerBucketEmptyListener implements Listener { 23 + private final GoldenAge plugin; 24 + 25 + public PlayerBucketEmptyListener(BetaProtect betaProtect) { 26 + this.plugin = betaProtect.getPlugin(); 27 + } 28 + 29 + @EventHandler 30 + public void onPlayerBucketEmpty(PlayerBucketEmptyEvent event) throws Exception { 31 + Block block = event.getBlockClicked(); 32 + 33 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 34 + User user = userDao.getUserByUuid(event.getPlayer().getUniqueId()); 35 + if (user == null) { 36 + throw new Exception("Player does not exist"); 37 + } 38 + 39 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 40 + World world = worldDao.getWorldByUuid(block.getWorld().getUID()); 41 + if (world == null) { 42 + throw new Exception("World does not exist"); 43 + } 44 + 45 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 46 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Player, TransactionAction.Add, user, block, world, LocalDateTime.now(ZoneOffset.UTC)); 47 + blockTransactionDao.insertBlockTransaction(blockTransaction); 48 + } 49 + }
+49
src/main/java/dev/keii/goldenage/betaprotect/listeners/PlayerBucketFillListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + 6 + import org.bukkit.block.Block; 7 + import org.bukkit.event.EventHandler; 8 + import org.bukkit.event.Listener; 9 + import org.bukkit.event.player.PlayerBucketFillEvent; 10 + 11 + import dev.keii.goldenage.GoldenAge; 12 + import dev.keii.goldenage.betaprotect.BetaProtect; 13 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 14 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 15 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 16 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 17 + import dev.keii.goldenage.dao.UserDao; 18 + import dev.keii.goldenage.dao.WorldDao; 19 + import dev.keii.goldenage.models.User; 20 + import dev.keii.goldenage.models.World; 21 + 22 + public class PlayerBucketFillListener implements Listener { 23 + private final GoldenAge plugin; 24 + 25 + public PlayerBucketFillListener(BetaProtect betaProtect) { 26 + this.plugin = betaProtect.getPlugin(); 27 + } 28 + 29 + @EventHandler 30 + public void onPlayerBucketFill(PlayerBucketFillEvent event) throws Exception { 31 + Block block = event.getBlockClicked(); 32 + 33 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 34 + User user = userDao.getUserByUuid(event.getPlayer().getUniqueId()); 35 + if (user == null) { 36 + throw new Exception("Player does not exist"); 37 + } 38 + 39 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 40 + World world = worldDao.getWorldByUuid(block.getWorld().getUID()); 41 + if (world == null) { 42 + throw new Exception("World does not exist"); 43 + } 44 + 45 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 46 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Player, TransactionAction.Remove, user, block, world, LocalDateTime.now(ZoneOffset.UTC)); 47 + blockTransactionDao.insertBlockTransaction(blockTransaction); 48 + } 49 + }
+134
src/main/java/dev/keii/goldenage/betaprotect/listeners/PlayerInteractListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import java.time.LocalDateTime; 4 + import java.time.ZoneOffset; 5 + import java.util.List; 6 + 7 + import org.bukkit.Material; 8 + import org.bukkit.block.Block; 9 + import org.bukkit.entity.Player; 10 + import org.bukkit.event.EventHandler; 11 + import org.bukkit.event.Listener; 12 + import org.bukkit.event.block.Action; 13 + import org.bukkit.event.player.PlayerInteractEvent; 14 + 15 + import dev.keii.goldenage.GoldenAge; 16 + import dev.keii.goldenage.betaprotect.BetaProtect; 17 + import dev.keii.goldenage.betaprotect.dao.BlockTransactionDao; 18 + import dev.keii.goldenage.betaprotect.models.BlockTransaction; 19 + import dev.keii.goldenage.betaprotect.models.TransactionAction; 20 + import dev.keii.goldenage.betaprotect.models.TransactionActor; 21 + import dev.keii.goldenage.dao.UserDao; 22 + import dev.keii.goldenage.dao.UserNameDao; 23 + import dev.keii.goldenage.dao.WorldDao; 24 + import dev.keii.goldenage.models.User; 25 + import dev.keii.goldenage.models.UserName; 26 + import dev.keii.goldenage.models.World; 27 + import dev.keii.goldenage.utils.DateUtility; 28 + 29 + public class PlayerInteractListener implements Listener { 30 + private final GoldenAge plugin; 31 + private final BetaProtect betaProtect; 32 + 33 + public PlayerInteractListener(BetaProtect betaProtect) { 34 + this.plugin = betaProtect.getPlugin(); 35 + this.betaProtect = betaProtect; 36 + } 37 + 38 + @EventHandler 39 + public void onPlayerInteract(PlayerInteractEvent event) throws Exception { 40 + Player player = event.getPlayer(); 41 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 42 + User user = userDao.getUserByUuid(player.getUniqueId()); 43 + if (user == null) { 44 + throw new Exception("Player does not exist"); 45 + } 46 + 47 + BlockTransactionDao blockTransactionDao = new BlockTransactionDao(plugin.getDatabaseUtility()); 48 + Block block = event.getClickedBlock(); 49 + 50 + if (event.getAction() == Action.RIGHT_CLICK_BLOCK) { 51 + 52 + if (List.of(Material.CHEST, Material.DISPENSER, Material.FURNACE, Material.BURNING_FURNACE, Material.STONE_BUTTON, Material.LEVER, Material.TRAP_DOOR, Material.WOODEN_DOOR).contains(block.getType())) { 53 + WorldDao worldDao = new WorldDao(plugin.getDatabaseUtility()); 54 + World world = worldDao.getWorldByUuid(block.getWorld().getUID()); 55 + if (world == null) { 56 + throw new Exception("World does not exist"); 57 + } 58 + 59 + BlockTransaction blockTransaction = new BlockTransaction(TransactionActor.Player, TransactionAction.Interact, user, block, world, LocalDateTime.now(ZoneOffset.UTC)); 60 + blockTransactionDao.insertBlockTransaction(blockTransaction); 61 + } 62 + } else if (event.getAction() == Action.LEFT_CLICK_BLOCK) { 63 + if (this.betaProtect.usersInInteractMode.contains(user.getId())) { 64 + List<BlockTransaction> transactions = blockTransactionDao.getBlockTransactionsAtLocation(block.getX(), block.getY(), block.getZ(), 10, 0); 65 + 66 + UserNameDao userNameDao = new UserNameDao(plugin.getDatabaseUtility()); 67 + 68 + 69 + String title = plugin.getConfig().getBetaProtect().getCommands().getBetaProtect().getInspect().getBlockTitle(); 70 + title = title.replace("%x", String.valueOf(block.getX())); 71 + title = title.replace("%y", String.valueOf(block.getY())); 72 + title = title.replace("%z", String.valueOf(block.getZ())); 73 + 74 + player.sendMessage(title); 75 + for (BlockTransaction blockTransaction : transactions) { 76 + 77 + String entry = plugin.getConfig().getBetaProtect().getCommands().getBetaProtect().getInspect().getBlockEntry(); 78 + entry = entry.replace("%d", DateUtility.getHumanReadableTimeSpan(blockTransaction.getCreatedAt().toEpochSecond(ZoneOffset.UTC), true)); 79 + 80 + switch (blockTransaction.getActor()) { 81 + case Player: 82 + UserName userName = userNameDao.getUserNameByUser(blockTransaction.getUser()); 83 + entry = entry.replace("%a", userName.getName()); 84 + break; 85 + case Creeper: 86 + entry = entry.replace("%a", "CREEPER"); 87 + break; 88 + case Fire: 89 + entry = entry.replace("%a", "FIRE"); 90 + break; 91 + case Fireball: 92 + entry = entry.replace("%a", "FIREBALL"); 93 + break; 94 + case PrimedTNT: 95 + entry = entry.replace("%a", "TNT"); 96 + break; 97 + case Unknown: 98 + entry = entry.replace("%a", "UNKNOWN"); 99 + break; 100 + default: 101 + break; 102 + 103 + } 104 + 105 + switch (blockTransaction.getAction()) { 106 + case Add: 107 + entry = entry.replace("%r", "placed"); 108 + break; 109 + case Interact: 110 + entry = entry.replace("%r", "interacted with"); 111 + break; 112 + case Remove: 113 + entry = entry.replace("%r", "removed"); 114 + break; 115 + default: 116 + break; 117 + 118 + } 119 + 120 + StringBuilder id = new StringBuilder(); 121 + id.append(blockTransaction.getBlockId()); 122 + if (blockTransaction.getBlockData() != 0) { 123 + id.append(":"); 124 + id.append(blockTransaction.getBlockData()); 125 + } 126 + entry = entry.replace("%i", id.toString()); 127 + entry = entry.replace("%b", Material.getMaterial(blockTransaction.getBlockId()).toString()); 128 + 129 + player.sendMessage(entry); 130 + } 131 + } 132 + } 133 + } 134 + }
+31
src/main/java/dev/keii/goldenage/betaprotect/listeners/PlayerMoveListener.java
··· 1 + package dev.keii.goldenage.betaprotect.listeners; 2 + 3 + import org.bukkit.event.EventHandler; 4 + import org.bukkit.event.Listener; 5 + import org.bukkit.event.player.PlayerMoveEvent; 6 + 7 + import dev.keii.goldenage.GoldenAge; 8 + import dev.keii.goldenage.betaprotect.BetaProtect; 9 + import dev.keii.goldenage.dao.UserDao; 10 + import dev.keii.goldenage.models.User; 11 + 12 + public class PlayerMoveListener implements Listener { 13 + private final GoldenAge plugin; 14 + private final BetaProtect betaProtect; 15 + 16 + public PlayerMoveListener(BetaProtect betaProtect) { 17 + this.plugin = betaProtect.getPlugin(); 18 + this.betaProtect = betaProtect; 19 + } 20 + 21 + @EventHandler 22 + public void onPlayerMove(PlayerMoveEvent event) throws Exception { 23 + UserDao userDao = new UserDao(plugin.getDatabaseUtility()); 24 + User user = userDao.getUserByUuid(event.getPlayer().getUniqueId()); 25 + if (user == null) { 26 + throw new Exception("Player does not exist"); 27 + } 28 + 29 + betaProtect.usersInContainers.remove(user.getId()); 30 + } 31 + }
+81
src/main/java/dev/keii/goldenage/betaprotect/models/BlockTransaction.java
··· 1 + package dev.keii.goldenage.betaprotect.models; 2 + 3 + import dev.keii.goldenage.models.User; 4 + import dev.keii.goldenage.models.World; 5 + import lombok.Getter; 6 + import lombok.Setter; 7 + import org.bukkit.block.Block; 8 + import org.jetbrains.annotations.Nullable; 9 + 10 + import java.time.LocalDateTime; 11 + 12 + public class BlockTransaction { 13 + @Getter 14 + @Setter 15 + private Integer id = null; 16 + @Getter 17 + private TransactionActor actor; 18 + @Getter 19 + @Nullable 20 + private Integer userId = null; 21 + @Getter 22 + @Nullable 23 + private User user = null; 24 + @Getter 25 + private int x, y, z; 26 + @Getter 27 + private int worldId; 28 + @Getter 29 + private World world; 30 + @Getter 31 + private TransactionAction action; 32 + @Getter 33 + private int blockId; 34 + @Getter 35 + @Nullable 36 + private Block block; 37 + @Getter 38 + private byte blockData; 39 + @Setter 40 + @Getter 41 + private LocalDateTime createdAt; 42 + 43 + public BlockTransaction( 44 + TransactionActor actor, TransactionAction action, @Nullable User user, Block block, World world, LocalDateTime createdAt 45 + ) { 46 + this.actor = actor; 47 + if (user != null) 48 + this.userId = user.getId(); 49 + this.user = user; 50 + this.x = block.getX(); 51 + this.y = block.getY(); 52 + this.z = block.getZ(); 53 + this.worldId = world.getId(); 54 + this.world = world; 55 + this.action = action; 56 + this.blockId = block.getTypeId(); 57 + this.block = block; 58 + this.blockData = block.getData(); 59 + this.createdAt = createdAt; 60 + } 61 + 62 + public BlockTransaction( 63 + int id, TransactionActor actor, TransactionAction action, @Nullable User user, int x, int y, int z, int blockTypeId, byte blockData, World world, LocalDateTime createdAt 64 + ) { 65 + this.id = id; 66 + this.actor = actor; 67 + if (user != null) 68 + this.userId = user.getId(); 69 + this.user = user; 70 + this.x = x; 71 + this.y = y; 72 + this.z = z; 73 + this.worldId = world.getId(); 74 + this.world = world; 75 + this.action = action; 76 + this.blockId = blockTypeId; 77 + this.block = null; 78 + this.blockData = blockData; 79 + this.createdAt = createdAt; 80 + } 81 + }
+97
src/main/java/dev/keii/goldenage/betaprotect/models/ContainerTransaction.java
··· 1 + package dev.keii.goldenage.betaprotect.models; 2 + 3 + import dev.keii.goldenage.models.User; 4 + import dev.keii.goldenage.models.World; 5 + import lombok.Getter; 6 + import lombok.Setter; 7 + import org.bukkit.Material; 8 + 9 + import javax.annotation.Nullable; 10 + import java.time.LocalDateTime; 11 + 12 + public class ContainerTransaction { 13 + @Getter 14 + @Setter 15 + private Integer id = null; 16 + @Getter 17 + private int userId; 18 + @Getter 19 + private User user; 20 + @Getter 21 + private int x, y, z; 22 + @Getter 23 + private int worldId; 24 + @Getter 25 + private World world; 26 + @Getter 27 + private TransactionAction action; 28 + @Getter 29 + private int itemId; 30 + @Getter 31 + private Material item; 32 + @Getter 33 + @Nullable 34 + private Integer itemData; 35 + @Getter 36 + private Integer itemCount; 37 + @Setter 38 + private LocalDateTime createdAt; 39 + 40 + public ContainerTransaction( 41 + int userId, 42 + User user, 43 + int x, int y, int z, 44 + int worldId, 45 + World world, 46 + TransactionAction action, 47 + int itemId, 48 + Material item, 49 + @Nullable Integer itemData, 50 + Integer itemCount, 51 + LocalDateTime createdAt 52 + ) { 53 + this.userId = userId; 54 + this.user = user; 55 + this.x = x; 56 + this.y = y; 57 + this.z = z; 58 + this.worldId = worldId; 59 + this.world = world; 60 + this.action = action; 61 + this.itemId = itemId; 62 + this.item = item; 63 + this.itemData = itemData; 64 + this.itemCount = itemCount; 65 + this.createdAt = createdAt; 66 + } 67 + 68 + public ContainerTransaction( 69 + Integer id, 70 + int userId, 71 + User user, 72 + int x, int y, int z, 73 + int worldId, 74 + World world, 75 + TransactionAction action, 76 + int itemId, 77 + Material item, 78 + @Nullable Integer itemData, 79 + Integer itemCount, 80 + LocalDateTime createdAt 81 + ) { 82 + this.id = id; 83 + this.userId = userId; 84 + this.user = user; 85 + this.x = x; 86 + this.y = y; 87 + this.z = z; 88 + this.worldId = worldId; 89 + this.world = world; 90 + this.action = action; 91 + this.itemId = itemId; 92 + this.item = item; 93 + this.itemData = itemData; 94 + this.itemCount = itemCount; 95 + this.createdAt = createdAt; 96 + } 97 + }
+24
src/main/java/dev/keii/goldenage/betaprotect/models/TransactionAction.java
··· 1 + package dev.keii.goldenage.betaprotect.models; 2 + 3 + public enum TransactionAction { 4 + Add(0), Remove(1), Interact(2); 5 + 6 + private final int value; 7 + 8 + TransactionAction(int value) { 9 + this.value = value; 10 + } 11 + 12 + public int toInt() { 13 + return value; 14 + } 15 + 16 + public static TransactionAction fromInt(int value) { 17 + for (TransactionAction action : TransactionAction.values()) { 18 + if (action.value == value) { 19 + return action; 20 + } 21 + } 22 + throw new IllegalArgumentException("Invalid int value for TransactionAction: " + value); 23 + } 24 + }
+28
src/main/java/dev/keii/goldenage/betaprotect/models/TransactionActor.java
··· 1 + package dev.keii.goldenage.betaprotect.models; 2 + 3 + public enum TransactionActor { 4 + Player(0), 5 + Fire(1), 6 + PrimedTNT(2), 7 + Creeper(3), 8 + Fireball(4), 9 + Unknown(5); 10 + private final int value; 11 + 12 + TransactionActor(int value) { 13 + this.value = value; 14 + } 15 + 16 + public int toInt() { 17 + return value; 18 + } 19 + 20 + public static TransactionActor fromInt(int value) { 21 + for (TransactionActor action : TransactionActor.values()) { 22 + if (action.value == value) { 23 + return action; 24 + } 25 + } 26 + throw new IllegalArgumentException("Invalid int value for TransactionActor: " + value); 27 + } 28 + }
+3
src/main/java/dev/keii/goldenage/commands/DatabaseCommand.java
··· 42 42 migrator.migrate(); 43 43 } else if (args[0].equalsIgnoreCase("rollback")) { 44 44 migrator.rollback(); 45 + } else { 46 + sender.sendMessage(this.plugin.getConfig().getErrors().getInvalidArgument(args[0])); 47 + return false; 45 48 } 46 49 } catch (SQLException e) { 47 50 sender.sendMessage("Failed to migrate");
+6 -10
src/main/java/dev/keii/goldenage/commands/HistoryCommand.java
··· 34 34 UserNameDao userNameDao = new UserNameDao(this.plugin.getDatabaseUtility()); 35 35 UserDao userDao = new UserDao(this.plugin.getDatabaseUtility()); 36 36 37 - if(args.length == 0) 38 - { 37 + if (args.length == 0) { 39 38 List<Login> logins = loginDao.getLogins(10); 40 39 sender.sendMessage(plugin.getConfig().getCommands().getHistory().getGlobalTitle()); 41 - for(Login login : logins) 42 - { 40 + for (Login login : logins) { 43 41 User user = userDao.getUserById(login.getUserId()); 44 42 UserName userName = userNameDao.getUserNameByUser(user); 45 43 Map<String, Object> params = new HashMap<>(); ··· 49 47 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(plugin.getConfig().getFormatters().getDate()); 50 48 params.put("date", formatter.format(login.getCreatedAt())); 51 49 52 - params.put("duration", DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC))); 50 + params.put("duration", DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC), false)); 53 51 54 52 StringSubstitutor substitutor = new StringSubstitutor(params); 55 53 sender.sendMessage(substitutor.replace(plugin.getConfig().getCommands().getHistory().getGlobalRow())); ··· 58 56 } 59 57 60 58 User user = userDao.getUserByUserName(args[0]); 61 - if(user == null) 62 - { 59 + if (user == null) { 63 60 sender.sendMessage(plugin.getConfig().getCommands().getHistory().getNoUser()); 64 61 return false; 65 62 } ··· 74 71 StringSubstitutor substitutor = new StringSubstitutor(params); 75 72 sender.sendMessage(substitutor.replace(plugin.getConfig().getCommands().getHistory().getPlayerTitle())); 76 73 77 - for(Login login : logins) 78 - { 74 + for (Login login : logins) { 79 75 userName = userNameDao.getUserNameByUser(user); 80 76 params = new HashMap<>(); 81 77 assert userName != null; ··· 84 80 DateTimeFormatter formatter = DateTimeFormatter.ofPattern(plugin.getConfig().getFormatters().getDate()); 85 81 params.put("date", formatter.format(login.getCreatedAt())); 86 82 87 - params.put("duration", DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC))); 83 + params.put("duration", DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC), false)); 88 84 89 85 substitutor = new StringSubstitutor(params); 90 86 sender.sendMessage(substitutor.replace(plugin.getConfig().getCommands().getHistory().getPlayerRow()));
+2 -3
src/main/java/dev/keii/goldenage/commands/SeenCommand.java
··· 52 52 Map<String, Object> params = new HashMap<>(); 53 53 params.put("player", args[0]); 54 54 55 - if (Arrays.stream(Bukkit.getOnlinePlayers()).anyMatch((Player player) -> player.getDisplayName().equalsIgnoreCase(args[0]) )) 56 - { 55 + if (Arrays.stream(Bukkit.getOnlinePlayers()).anyMatch((Player player) -> player.getDisplayName().equalsIgnoreCase(args[0]))) { 57 56 StringSubstitutor substitutor = new StringSubstitutor(params); 58 57 sender.sendMessage(substitutor.replace(plugin.getConfig().getCommands().getSeen().getSuccessOnline())); 59 58 return true; 60 59 } 61 60 62 - String ago = DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC)); 61 + String ago = DateUtility.getHumanReadableTimeSpan(login.getCreatedAt().toEpochSecond(ZoneOffset.UTC), false); 63 62 64 63 if (ago.equals("now")) { 65 64 StringSubstitutor substitutor = new StringSubstitutor(params);
+23
src/main/java/dev/keii/goldenage/config/BetaProtectConfig.java
··· 1 + package dev.keii.goldenage.config; 2 + 3 + import dev.keii.goldenage.config.betaprotect.CommandsConfig; 4 + import dev.keii.goldenage.config.commands.HistoryConfig; 5 + import dev.keii.goldenage.config.commands.ListConfig; 6 + import dev.keii.goldenage.config.commands.SeenConfig; 7 + import lombok.Getter; 8 + import org.bukkit.util.config.Configuration; 9 + 10 + public class BetaProtectConfig { 11 + private final Configuration configuration; 12 + @Getter 13 + private CommandsConfig commands; 14 + 15 + public BetaProtectConfig(Configuration configuration) { 16 + this.configuration = configuration; 17 + this.commands = new CommandsConfig(configuration); 18 + } 19 + 20 + public boolean isEnabled() { 21 + return this.configuration.getBoolean("betaprotect.enabled", true); 22 + } 23 + }
+4
src/main/java/dev/keii/goldenage/config/Config.java
··· 20 20 @Getter 21 21 private StatisticsConfig statistics; 22 22 23 + @Getter 24 + private BetaProtectConfig betaProtect; 25 + 23 26 private final Configuration configuration; 24 27 25 28 public Config(Configuration configuration) { ··· 29 32 this.errors = new ErrorsConfig(configuration); 30 33 this.formatters = new FormattersConfig(configuration); 31 34 this.statistics = new StatisticsConfig(configuration); 35 + this.betaProtect = new BetaProtectConfig(configuration); 32 36 } 33 37 34 38 public Env getEnv() {
+8
src/main/java/dev/keii/goldenage/config/ErrorsConfig.java
··· 12 12 public String getInsufficientArguments() { 13 13 return this.configuration.getString("errors.insufficient-arguments", "§cNot enough arguments"); 14 14 } 15 + 16 + public String getInternalServerError() { 17 + return this.configuration.getString("errors.internal-server-error", "§cInternal server error"); 18 + } 19 + 20 + public String getInvalidArgument(String argument) { 21 + return this.configuration.getString("errors.invalid-argument", "§cInvalid argument provided: \"%s\"").replace("%s", argument); 22 + } 15 23 }
+1 -1
src/main/java/dev/keii/goldenage/config/StatisticsConfig.java
··· 11 11 this.configuration = configuration; 12 12 } 13 13 14 - public boolean getEnabled() { 14 + public boolean isEnabled() { 15 15 return this.configuration.getBoolean("statistics.enabled", true); 16 16 } 17 17
+16
src/main/java/dev/keii/goldenage/config/betaprotect/CommandsConfig.java
··· 1 + package dev.keii.goldenage.config.betaprotect; 2 + 3 + import dev.keii.goldenage.config.betaprotect.commands.BetaProtectConfig; 4 + import lombok.Getter; 5 + import org.bukkit.util.config.Configuration; 6 + 7 + public class CommandsConfig { 8 + private final Configuration configuration; 9 + @Getter 10 + private BetaProtectConfig betaProtect; 11 + 12 + public CommandsConfig(Configuration configuration) { 13 + this.configuration = configuration; 14 + this.betaProtect = new BetaProtectConfig(configuration); 15 + } 16 + }
+17
src/main/java/dev/keii/goldenage/config/betaprotect/commands/BetaProtectConfig.java
··· 1 + package dev.keii.goldenage.config.betaprotect.commands; 2 + 3 + import org.bukkit.util.config.Configuration; 4 + 5 + import dev.keii.goldenage.config.betaprotect.commands.betaprotect.InspectConfig; 6 + import lombok.Getter; 7 + 8 + public class BetaProtectConfig { 9 + private final Configuration configuration; 10 + @Getter 11 + private InspectConfig inspect; 12 + 13 + public BetaProtectConfig(Configuration configuration) { 14 + this.configuration = configuration; 15 + this.inspect = new InspectConfig(configuration); 16 + } 17 + }
+27
src/main/java/dev/keii/goldenage/config/betaprotect/commands/betaprotect/InspectConfig.java
··· 1 + package dev.keii.goldenage.config.betaprotect.commands.betaprotect; 2 + 3 + import org.bukkit.util.config.Configuration; 4 + 5 + public class InspectConfig { 6 + private final Configuration configuration; 7 + 8 + public InspectConfig(Configuration configuration) { 9 + this.configuration = configuration; 10 + } 11 + 12 + public String getOnMessage() { 13 + return this.configuration.getString("betaprotect.commands.betaprotect.inspect.on-message", "§eTurned on inspect mode"); 14 + } 15 + 16 + public String getOffMessage() { 17 + return this.configuration.getString("betaprotect.commands.betaprotect.inspect.off-message", "§eTurned off inspect mode"); 18 + } 19 + 20 + public String getBlockTitle() { 21 + return this.configuration.getString("betaprotect.commands.betaprotect.inspect.block-title", "§f----- §eBetaProtect §f----- §e(x%x/y%y/z%z)"); 22 + } 23 + 24 + public String getBlockEntry() { 25 + return this.configuration.getString("betaprotect.commands.betaprotect.inspect.block-entry", "§e%d §f- §e%a §f%r §e#%i (%b)"); 26 + } 27 + }
+78
src/main/java/dev/keii/goldenage/dao/WorldDao.java
··· 1 + package dev.keii.goldenage.dao; 2 + 3 + import java.sql.PreparedStatement; 4 + import java.sql.ResultSet; 5 + import java.sql.SQLException; 6 + import java.util.UUID; 7 + 8 + import javax.annotation.Nullable; 9 + 10 + import dev.keii.goldenage.models.World; 11 + import dev.keii.goldenage.utils.DatabaseUtility; 12 + 13 + public class WorldDao { 14 + private final DatabaseUtility db; 15 + 16 + public WorldDao(DatabaseUtility db) { 17 + this.db = db; 18 + } 19 + 20 + public void insertWorld(World world) { 21 + if (world.getId() != null) { 22 + throw new IllegalArgumentException("World ID must be null for new worlds"); 23 + } 24 + 25 + try (PreparedStatement stmt = db.getConnection().prepareStatement("INSERT INTO worlds(world_name, uuid) VALUES(?, ?)")) { 26 + stmt.setString(1, world.getWorldName()); 27 + stmt.setString(2, world.getUuid().toString()); 28 + stmt.execute(); 29 + stmt.close(); 30 + 31 + db.getConnection().commit(); 32 + } catch (SQLException e) { 33 + throw new RuntimeException(e); 34 + } 35 + } 36 + 37 + public @Nullable World getWorldByUuid(UUID uuid) { 38 + try { 39 + PreparedStatement stmt = db.getConnection().prepareStatement("SELECT id, world_name, uuid FROM worlds WHERE uuid = ? LIMIT 1"); 40 + stmt.setString(1, uuid.toString()); 41 + ResultSet rs = stmt.executeQuery(); 42 + 43 + if (rs.next()) { 44 + World world = new World(rs.getInt(1), rs.getString(2), UUID.fromString(rs.getString(3))); 45 + rs.close(); 46 + stmt.close(); 47 + return world; 48 + } 49 + 50 + rs.close(); 51 + stmt.close(); 52 + return null; 53 + } catch (SQLException e) { 54 + return null; 55 + } 56 + } 57 + 58 + public @Nullable World getWorldById(int id) { 59 + try { 60 + PreparedStatement stmt = db.getConnection().prepareStatement("SELECT id, world_name, uuid FROM worlds WHERE id = ? LIMIT 1"); 61 + stmt.setInt(1, id); 62 + ResultSet rs = stmt.executeQuery(); 63 + 64 + if (rs.next()) { 65 + World world = new World(rs.getInt(1), rs.getString(2), UUID.fromString(rs.getString(3))); 66 + rs.close(); 67 + stmt.close(); 68 + return world; 69 + } 70 + 71 + rs.close(); 72 + stmt.close(); 73 + return null; 74 + } catch (SQLException e) { 75 + return null; 76 + } 77 + } 78 + }
+14 -14
src/main/java/dev/keii/goldenage/migration/Migrator.java
··· 1 1 package dev.keii.goldenage.migration; 2 2 3 - import dev.keii.goldenage.GoldenAge; 4 - import dev.keii.goldenage.migration.migrations.V0002_CreateLogins; 5 - import dev.keii.goldenage.migration.migrations.V0001_CreateUsers; 6 - import dev.keii.goldenage.migration.migrations.V0003_CreateUserNames; 7 - import dev.keii.goldenage.utils.DatabaseUtility; 8 - 9 3 import java.sql.ResultSet; 10 4 import java.sql.SQLException; 11 5 import java.sql.Statement; 12 6 import java.util.ArrayList; 13 7 import java.util.Collections; 14 8 import java.util.List; 9 + 10 + import dev.keii.goldenage.GoldenAge; 11 + import dev.keii.goldenage.migration.migrations.V0001_CreateUsers; 12 + import dev.keii.goldenage.migration.migrations.V0002_CreateLogins; 13 + import dev.keii.goldenage.migration.migrations.V0003_CreateUserNames; 14 + import dev.keii.goldenage.migration.migrations.V0004_CreateWorlds; 15 + import dev.keii.goldenage.migration.migrations.V0005_CreateTransactions; 16 + import dev.keii.goldenage.utils.DatabaseUtility; 15 17 16 18 public class Migrator { 17 19 public DatabaseUtility db; 18 20 private final List<Migration> migrations; 19 21 private GoldenAge plugin; 20 22 21 - public Migrator(GoldenAge plugin) 22 - { 23 + public Migrator(GoldenAge plugin) { 23 24 this.plugin = plugin; 24 25 this.db = plugin.getDatabaseUtility(); 25 26 migrations = new ArrayList<>(); 26 27 migrations.add(new V0001_CreateUsers(this)); 27 28 migrations.add(new V0002_CreateLogins(this)); 28 29 migrations.add(new V0003_CreateUserNames(this)); 30 + migrations.add(new V0004_CreateWorlds(this)); 31 + migrations.add(new V0005_CreateTransactions(this)); 29 32 } 30 33 31 34 public void setupMigrationsTable() throws SQLException { ··· 39 42 Statement stmt = db.getConnection().createStatement(); 40 43 ResultSet rs = stmt.executeQuery("SELECT batch FROM migrations ORDER BY id DESC LIMIT 1"); 41 44 42 - if(rs.next()) 43 - { 45 + if (rs.next()) { 44 46 int latestBatch = rs.getInt(1); 45 47 rs.close(); 46 48 stmt.close(); ··· 54 56 public void migrate() throws SQLException { 55 57 int newBatch = getLatestBatch() + 1; 56 58 57 - for (Migration migration : migrations) 58 - { 59 + for (Migration migration : migrations) { 59 60 migration.migrate(newBatch); 60 61 } 61 62 } ··· 64 65 int latestBatch = getLatestBatch(); 65 66 66 67 Collections.reverse(migrations); 67 - for (Migration migration : migrations) 68 - { 68 + for (Migration migration : migrations) { 69 69 migration.rollback(latestBatch); 70 70 } 71 71 Collections.reverse(migrations);
+28
src/main/java/dev/keii/goldenage/migration/migrations/V0004_CreateWorlds.java
··· 1 + package dev.keii.goldenage.migration.migrations; 2 + 3 + import dev.keii.goldenage.migration.Migration; 4 + import dev.keii.goldenage.migration.Migrator; 5 + 6 + import java.sql.SQLException; 7 + import java.sql.Statement; 8 + 9 + public class V0004_CreateWorlds extends Migration { 10 + 11 + public V0004_CreateWorlds(Migrator migrator) { 12 + super(migrator); 13 + } 14 + 15 + @Override 16 + public void up(Statement stmt) throws SQLException { 17 + stmt.execute("CREATE TABLE IF NOT EXISTS worlds (\n" + 18 + " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" + 19 + " world_name TEXT NOT NULL,\n" + 20 + " uuid TEXT NOT NULL\n" + 21 + ");\n"); 22 + } 23 + 24 + @Override 25 + public void down(Statement stmt) throws SQLException { 26 + stmt.execute("DROP TABLE IF EXISTS worlds;"); 27 + } 28 + }
+58
src/main/java/dev/keii/goldenage/migration/migrations/V0005_CreateTransactions.java
··· 1 + package dev.keii.goldenage.migration.migrations; 2 + 3 + import dev.keii.goldenage.migration.Migration; 4 + import dev.keii.goldenage.migration.Migrator; 5 + 6 + import java.sql.SQLException; 7 + import java.sql.Statement; 8 + 9 + public class V0005_CreateTransactions extends Migration { 10 + 11 + public V0005_CreateTransactions(Migrator migrator) { 12 + super(migrator); 13 + } 14 + 15 + @Override 16 + public void up(Statement stmt) throws SQLException { 17 + stmt.execute("CREATE TABLE IF NOT EXISTS container_transactions (\n" + 18 + " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" + 19 + " user_id INTEGER NOT NULL,\n" + 20 + " x INTEGER NOT NULL,\n" + 21 + " y INTEGER NOT NULL,\n" + 22 + " z INTEGER NOT NULL,\n" + 23 + " world_id INTEGER NOT NULL,\n" + 24 + " action INTEGER NOT NULL,\n" + 25 + " item_id INTEGER NOT NULL,\n" + 26 + " item_data INTEGER NOT NULL,\n" + 27 + " item_count INTEGER NOT NULL,\n" + 28 + " created_at INTEGER NOT NULL,\n" + 29 + " FOREIGN KEY(user_id) REFERENCES users(id)\n" + 30 + " FOREIGN KEY(world_id) REFERENCES worlds(id)\n" + 31 + ");\n"); 32 + 33 + stmt.execute("CREATE TABLE IF NOT EXISTS block_transactions (\n" + 34 + " id INTEGER PRIMARY KEY AUTOINCREMENT,\n" + 35 + " actor INTEGER NOT NULL,\n" + 36 + " user_id INTEGER,\n" + 37 + " x INTEGER NOT NULL,\n" + 38 + " y INTEGER NOT NULL,\n" + 39 + " z INTEGER NOT NULL,\n" + 40 + " world_id INTEGER NOT NULL,\n" + 41 + " action INTEGER NOT NULL,\n" + 42 + " block_id INTEGER NOT NULL,\n" + 43 + " block_data INTEGER NOT NULL,\n" + 44 + " created_at INTEGER NOT NULL,\n" + 45 + " FOREIGN KEY(user_id) REFERENCES users(id)\n" + 46 + " FOREIGN KEY(world_id) REFERENCES worlds(id)\n" + 47 + ");\n"); 48 + 49 + stmt.execute("CREATE INDEX IF NOT EXISTS idx_container_xyz ON container_transactions (x, y, z);"); 50 + stmt.execute("CREATE INDEX IF NOT EXISTS idx_block_xyz ON block_transactions (x, y, z);"); 51 + } 52 + 53 + @Override 54 + public void down(Statement stmt) throws SQLException { 55 + stmt.execute("DROP TABLE IF EXISTS container_transactions;"); 56 + stmt.execute("DROP TABLE IF EXISTS block_transactions;"); 57 + } 58 + }
+27
src/main/java/dev/keii/goldenage/models/World.java
··· 1 + package dev.keii.goldenage.models; 2 + 3 + import lombok.Getter; 4 + import lombok.Setter; 5 + 6 + import java.util.UUID; 7 + 8 + public class World { 9 + @Getter 10 + @Setter 11 + private Integer id = null; 12 + @Getter @Setter 13 + private String worldName; 14 + @Getter @Setter 15 + private UUID uuid; 16 + 17 + public World(String worldName, UUID uuid) { 18 + this.worldName = worldName; 19 + this.uuid = uuid; 20 + } 21 + 22 + public World(Integer id, String worldName, UUID uuid) { 23 + this.id = id; 24 + this.worldName = worldName; 25 + this.uuid = uuid; 26 + } 27 + }
+13 -6
src/main/java/dev/keii/goldenage/utils/DateUtility.java
··· 16 16 return instant.atZone(ZoneId.ofOffset("UTC", ZoneOffset.UTC)).toLocalDateTime(); 17 17 } 18 18 19 + private static String getShort(String unit, boolean shortUnits) { 20 + if (shortUnits) { 21 + return unit.substring(0, 2).trim(); 22 + } else { 23 + return unit; 24 + } 25 + } 19 26 20 - public static String getHumanReadableTimeSpan(long epochSeconds) { 27 + public static String getHumanReadableTimeSpan(long epochSeconds, boolean shortUnits) { 21 28 Instant now = Instant.now(); 22 29 Instant past = Instant.ofEpochSecond(epochSeconds); 23 30 Duration duration = Duration.between(past, now); ··· 39 46 List<String> parts = new ArrayList<>(); 40 47 41 48 if (weeks > 0) { 42 - parts.add(weeks + (weeks > 1 ? " weeks" : " week")); 49 + parts.add(weeks + getShort(weeks > 1 ? " weeks" : " week", shortUnits)); 43 50 } 44 51 if (days > 0) { 45 - parts.add(days + (days > 1 ? " days" : " day")); 52 + parts.add(days + getShort(days > 1 ? " days" : " day", shortUnits)); 46 53 } 47 54 if (hours > 0) { 48 - parts.add(hours + (hours > 1 ? " hours" : " hour")); 55 + parts.add(hours + getShort(hours > 1 ? " hours" : " hour", shortUnits)); 49 56 } 50 57 if (minutes > 0 && weeks == 0) { 51 - parts.add(minutes + (minutes > 1 ? " minutes" : " minute")); 58 + parts.add(minutes + getShort(minutes > 1 ? " minutes" : " minute", shortUnits)); 52 59 } 53 60 if (remainingSeconds > 0 && days == 0 && hours == 0 && weeks == 0) { 54 - parts.add(remainingSeconds + (remainingSeconds > 1 ? " seconds" : " second")); 61 + parts.add(remainingSeconds + getShort(remainingSeconds > 1 ? " seconds" : " second", shortUnits)); 55 62 } 56 63 57 64 if (parts.isEmpty()) {
+14
src/main/resources/config.yml
··· 3 3 auto-migrate: true 4 4 errors: 5 5 insufficient-arguments: "§cNot enough arguments" 6 + internal-server-error: "§cInternal server error" 7 + invalid-argument: '§cInvalid argument provided: "%s"' 6 8 formatters: 7 9 date: "yyyy-MM-dd HH:mm" 8 10 statistics: 9 11 enabled: true 12 + remote: "https://goldenage.keii.dev" 13 + serverId: -1 14 + serverSecret: "" 15 + betaprotect: 16 + enabled: true 17 + commands: 18 + betaprotect: 19 + inspect: 20 + on-message: "§eTurned on inspect mode" 21 + off-message: "§eTurned off inspect mode" 22 + block-title: "§f----- §eBetaProtect §f----- §e(x%x/y%y/z%z)" 23 + block-entry: "§e%d §f- §e%a §f%r §e#%i (%b)" 10 24 commands: 11 25 list: 12 26 format: "§eOnline players (${online}/${max}): ${playerList}"
+4
src/main/resources/plugin.yml
··· 22 22 description: Command for statistics 23 23 usage: /statistics send 24 24 permission: dev.keii.goldenage.statistics 25 + betaprotect: 26 + aliases: ["bp"] 27 + description: Command for BetaProtect 28 + usage: /betaprotect inspect