-15
.idea/artifacts/GoldenAge_jar4.xml
-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
+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
+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
-6
dependency-reduced-pom.xml
+380
eclipse-formatter.xml
+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
+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
+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
+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
+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
+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
+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
+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
+4
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockDispenseListener.java
+46
src/main/java/dev/keii/goldenage/betaprotect/listeners/BlockPlaceListener.java
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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
+1
-1
src/main/java/dev/keii/goldenage/config/StatisticsConfig.java
+16
src/main/java/dev/keii/goldenage/config/betaprotect/CommandsConfig.java
+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
+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
+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
+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
+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
+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
+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
+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
+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
+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}"