Milestone towards tracking config files on git. Waiting on true-og/SubstAgent update

This commit is contained in:
NotAlexNoyle committed 2026-01-01 07:56:08 -05:00
1 parent bb1846d086
commit b45037511f
200 files changed
+15561 -7546

No files matched your search

+26 -6
View File
@@ -1,17 +1,16 @@
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
import org.apache.tools.ant.filters.ReplaceTokens
import org.gradle.jvm.tasks.Jar
/* ------------------------------ Plugins ------------------------------ */
plugins {
id("java") // Import Java plugin.
id("java-library") // Import Java Library plugin.
id("com.diffplug.spotless") version "7.0.4" // Import Spotless plugin.
id("com.gradleup.shadow") version "8.3.6" // Import Shadow plugin.
id("com.diffplug.spotless") version "8.1.0" // Import Spotless plugin.
id("com.gradleup.shadow") version "8.3.9" // Import Shadow plugin.
id("checkstyle") // Import Checkstyle plugin.
eclipse // Import Eclipse plugin.
kotlin("jvm") version "2.1.21" // Import Kotlin JVM plugin.
}
/* --------------------------- JDK / Kotlin ---------------------------- */
java {
sourceCompatibility = JavaVersion.VERSION_17 // Compile with JDK 17 compatibility.
@@ -23,7 +22,7 @@ java {
kotlin { jvmToolchain(17) }
/* ----------------------------- // Declare bundle identifier. Metadata ------------------------------ */
/* ----------------------------- Metadata ------------------------------ */
group = "net.coreprotect"
val version = "22.4" // Declare plugin version (will be in .jar).
@@ -54,9 +53,9 @@ repositories {
/* ---------------------- Java project deps ---------------------------- */
dependencies {
implementation(platform("com.intellectualsites.bom:bom-newest:1.45"))
compileOnly("io.papermc.paper:paper-api:1.19-R0.1-SNAPSHOT")
compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.3.0-SNAPSHOT")
implementation(platform("com.intellectualsites.bom:bom-newest:1.45"))
implementation("com.zaxxer:HikariCP:5.0.1")
implementation("com.github.oshi:oshi-core:6.6.5")
}
@@ -94,9 +93,30 @@ tasks.withType<JavaCompile>().configureEach {
options.encoding = "UTF-8" // Use UTF-8 file encoding.
}
/* ----------------------------- Auto Formatting ------------------------ */
spotless {
java {
eclipse().configFile("config/formatter/eclipse-java-formatter.xml") // Eclipse java formatting.
leadingTabsToSpaces() // Convert leftover leading tabs to spaces.
removeUnusedImports() // Remove imports that aren't being called.
}
kotlinGradle {
ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } // JetBrains Kotlin formatting.
target("build.gradle.kts", "settings.gradle.kts") // Gradle files to format.
}
}
checkstyle {
toolVersion = "10.18.1" // Declare checkstyle version to use.
configFile = file("config/checkstyle/checkstyle.xml") // Point checkstyle to config file.
isIgnoreFailures = true // Don't fail the build if checkstyle does not pass.
isShowViolations = true // Show the violations in any IDE with the checkstyle plugin.
}
tasks.named("compileJava") {
dependsOn("spotlessApply") // Run spotless before compiling with the JDK.
}
tasks.named("spotlessCheck") {
dependsOn("spotlessApply") // Run spotless before checking if spotless ran.
}
+404
View File
@@ -0,0 +1,404 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<profiles version="23">
<profile kind="CodeFormatterProfile" name="TrueOG Network Formatting" version="23">
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_with_spaces" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.enabling_tag" value="@formatter:on"/>
<setting id="org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_record_components" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_logical_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_shift_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_parameters" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_loops" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_switch_case_arrow_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.text_block_indentation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_module_statements" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_permitted_types" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_annotations" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_method_declaration" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines" value="2147483647"/>
<setting id="org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_resources_in_try" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_not_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_type_arguments" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_label" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_permitted_types_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.javadoc_do_not_separate_block_tags" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_tag_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_constructor" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_string_concatenation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_shift_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_additive_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case_after_arrow" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_lines_in_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.disabling_tag" value="@formatter:off"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_arrow" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.use_on_off_tags" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_method_body_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_additive_operator" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_relational_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_lambda_body" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_relational_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.align_arrows_in_switch_on_columns" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.align_selector_in_method_invocation_on_expression_first_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_record_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_switch_case_with_arrow_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_switch_case_with_colon" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_additive_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_wrapped_lines" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_conditional_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.join_line_comments" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_shift_operator" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.keep_code_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_assignment_operator" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_switch_case_with_arrow" value="20"/>
<setting id="org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method" value="49"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_assertion_message" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_logical_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_relational_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_logical_operator" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration" value="common_lines"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_permitted_types" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line" value="one_line_never"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="next_line_on_wrap"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="false"/>
<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block" value="1"/>
<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="space"/>
<setting id="org.eclipse.jdt.core.formatter.wrap_before_string_concatenation" value="true"/>
<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
</profile>
</profiles>
+117 -49
View File
@@ -3,6 +3,12 @@ package net.coreprotect;
import java.io.File;
import java.util.Iterator;
import java.util.Map.Entry;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.plugin.java.JavaPlugin;
import net.coreprotect.command.CommandHandler;
import net.coreprotect.command.TabHandler;
import net.coreprotect.config.Config;
@@ -20,12 +26,6 @@ import net.coreprotect.thread.Scheduler;
import net.coreprotect.utility.Chat;
import net.coreprotect.utility.Teleport;
import net.coreprotect.utility.Util;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.block.data.BlockData;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.java.JavaPlugin;
public final class CoreProtect extends JavaPlugin {
@@ -37,10 +37,12 @@ public final class CoreProtect extends JavaPlugin {
* @return This CoreProtect instance
*/
public static CoreProtect getInstance() {
return instance;
}
private CoreProtectAPI api = new CoreProtectAPI();
private final CoreProtectAPI api = new CoreProtectAPI();
/**
* Get the CoreProtect API
@@ -48,18 +50,23 @@ public final class CoreProtect extends JavaPlugin {
* @return The CoreProtect API
*/
public CoreProtectAPI getAPI() {
return api;
}
@Override
public void onEnable() {
instance = this;
ConfigHandler.path = this.getDataFolder().getPath() + File.separator;
Language.loadPhrases();
boolean start = performVersionChecks();
if (start) {
try {
Consumer.initialize(); // Prepare consumer (keep this here)
new ListenerHandler(this);
getCommand("coreprotect").setExecutor(CommandHandler.getInstance());
@@ -69,146 +76,207 @@ public final class CoreProtect extends JavaPlugin {
getCommand("co").setExecutor(CommandHandler.getInstance());
getCommand("co").setTabCompleter(new TabHandler());
boolean exists = (new File(ConfigHandler.path)).exists();
final boolean exists = (new File(ConfigHandler.path)).exists();
if (!exists) {
new File(ConfigHandler.path).mkdir();
}
start = ConfigHandler.performInitialization(true); // Perform any necessary initialization
} catch (Exception e) {
e.printStackTrace();
} catch (Exception error) {
error.printStackTrace();
start = false;
}
}
if (start) {
PluginDescriptionFile pluginDescription = this.getDescription();
Util.sendConsoleComponentStartup(
Bukkit.getServer().getConsoleSender(),
Util.sendConsoleComponentStartup(Bukkit.getServer().getConsoleSender(),
Phrase.build(Phrase.ENABLE_SUCCESS, ConfigHandler.EDITION_NAME));
if (Config.getGlobal().MYSQL) {
Chat.console(Phrase.build(Phrase.USING_MYSQL));
} else {
Chat.console(Phrase.build(Phrase.USING_SQLITE));
}
Chat.console("--------------------");
Chat.console(Phrase.build(Phrase.ENJOY_COREPROTECT, pluginDescription.getName()));
Chat.console(Phrase.build(Phrase.ENJOY_COREPROTECT, getPluginMeta().getName()));
Chat.console(Phrase.build(Phrase.LINK_DISCORD, "www.coreprotect.net/discord/"));
Chat.console("--------------------");
Scheduler.scheduleSyncDelayedTask(
this,
() -> {
try {
Thread networkHandler = new Thread(new NetworkHandler(true, true));
networkHandler.start();
} catch (Exception e) {
e.printStackTrace();
}
},
0);
Scheduler.scheduleSyncDelayedTask(this, () -> {
Thread cacheCleanUpThread = new Thread(new CacheHandler());
try {
final Thread networkHandler = new Thread(new NetworkHandler(true, true));
networkHandler.start();
} catch (Exception error) {
error.printStackTrace();
}
}, 0);
final Thread cacheCleanUpThread = new Thread(new CacheHandler());
cacheCleanUpThread.start();
Consumer.startConsumer();
} else {
Chat.console(Phrase.build(Phrase.ENABLE_FAILED, ConfigHandler.EDITION_NAME));
getServer().getPluginManager().disablePlugin(this);
}
}
@Override
public void onDisable() {
safeShutdown(this);
}
private static boolean performVersionChecks() {
try {
String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]");
final String[] bukkitVersion = Bukkit.getServer().getBukkitVersion().split("[-.]");
if (Util.newVersion(bukkitVersion[0] + "." + bukkitVersion[1], ConfigHandler.MINECRAFT_VERSION)) {
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Minecraft", ConfigHandler.MINECRAFT_VERSION));
return false;
}
if (Util.newVersion(ConfigHandler.LATEST_VERSION, bukkitVersion[0] + "." + bukkitVersion[1])
&& Util.isBranch("master")) {
Chat.console(Phrase.build(
Phrase.VERSION_INCOMPATIBLE, "Minecraft", bukkitVersion[0] + "." + bukkitVersion[1]));
&& Util.isBranch("master"))
{
Chat.console(Phrase.build(Phrase.VERSION_INCOMPATIBLE, "Minecraft",
bukkitVersion[0] + "." + bukkitVersion[1]));
return false;
}
String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0").split("\\.");
final String[] javaVersion = (System.getProperty("java.version").replaceAll("[^0-9.]", "") + ".0")
.split("\\.");
if (Util.newVersion(javaVersion[0] + "." + javaVersion[1], ConfigHandler.JAVA_VERSION)) {
Chat.console(Phrase.build(Phrase.VERSION_REQUIRED, "Java", ConfigHandler.JAVA_VERSION));
return false;
}
ConfigHandler.SERVER_VERSION = Integer.parseInt(bukkitVersion[1]);
} catch (Exception e) {
e.printStackTrace();
} catch (Exception error) {
error.printStackTrace();
return false;
}
return true;
}
private static void safeShutdown(CoreProtect plugin) {
try {
/* if server is stopping, log disconnections of online players */
if (ConfigHandler.serverRunning && PaperAdapter.ADAPTER.isStopping(plugin.getServer())) {
for (Player player : plugin.getServer().getOnlinePlayers()) {
PlayerQuitListener.queuePlayerQuit(player);
}
plugin.getServer().getOnlinePlayers().forEach(PlayerQuitListener::queuePlayerQuit);
}
if (!ConfigHandler.isFolia) {
Iterator<Entry<Location, BlockData>> iterator =
Teleport.revertBlocks.entrySet().iterator();
final Iterator<Entry<Location, BlockData>> iterator = Teleport.revertBlocks.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Location, BlockData> entry = iterator.next();
final Entry<Location, BlockData> entry = iterator.next();
entry.getKey().getBlock().setBlockData(entry.getValue());
iterator.remove();
}
}
ConfigHandler.serverRunning = false;
long shutdownTime = System.currentTimeMillis();
final long shutdownTime = System.currentTimeMillis();
long alertTime = shutdownTime + (10 * 1000);
if (ConfigHandler.converterRunning) {
Chat.console(Phrase.build(Phrase.FINISHING_CONVERSION));
} else {
Chat.console(Phrase.build(Phrase.FINISHING_LOGGING));
}
if (ConfigHandler.migrationRunning) {
ConfigHandler.purgeRunning = false;
}
while ((Consumer.isRunning() || ConfigHandler.converterRunning) && !ConfigHandler.purgeRunning) {
long time = System.currentTimeMillis();
final long time = System.currentTimeMillis();
if (time >= alertTime) {
if (!ConfigHandler.converterRunning) {
int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
int consumerCount = Consumer.getConsumerSize(consumerId) + Process.getCurrentConsumerSize();
Chat.console(Phrase.build(Phrase.LOGGING_ITEMS, String.format("%,d", consumerCount)));
final int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
final int consumerCount = Consumer.getConsumerSize(consumerId)
+ Process.getCurrentConsumerSize();
Chat.console(Phrase.build(Phrase.LOGGING_ITEMS, "%,d".formatted(consumerCount)));
}
alertTime = alertTime + (30 * 1000);
} else if (!ConfigHandler.databaseReachable && (time - shutdownTime) >= (5 * 60 * 1000)) {
Chat.console(Phrase.build(Phrase.DATABASE_UNREACHABLE));
break;
} else if ((time - shutdownTime) >= (15 * 60 * 1000)) {
Chat.console(Phrase.build(Phrase.LOGGING_TIME_LIMIT));
break;
}
Thread.sleep(100);
}
ConfigHandler.performDisable();
Chat.console(Phrase.build(
Phrase.DISABLE_SUCCESS,
"CoreProtect v" + plugin.getDescription().getVersion()));
} catch (Exception e) {
e.printStackTrace();
Chat.console(Phrase.build(Phrase.DISABLE_SUCCESS, "CoreProtect v" + plugin.getPluginMeta().getVersion()));
} catch (Exception error) {
error.printStackTrace();
}
}
}
File diff suppressed because it is too large. Load diff
+22 -13
View File
@@ -14,11 +14,15 @@ import org.bukkit.block.Block;
public class BlockAPI {
public static List<String[]> performLookup(Block block, int offset) {
List<String[]> result = new ArrayList<>();
try (Connection connection = Database.getConnection(false, 1000)) {
if (block == null) {
return result;
}
int x = block.getX();
@@ -28,11 +32,15 @@ public class BlockAPI {
int worldId = Util.getWorldId(block.getWorld().getName());
int checkTime = 0;
if (offset > 0) {
checkTime = time - offset;
}
if (connection == null) {
return result;
}
Statement statement = connection.createStatement();
@@ -42,6 +50,7 @@ public class BlockAPI {
ResultSet results = statement.executeQuery(query);
while (results.next()) {
String resultTime = results.getString("time");
int resultUserId = results.getInt("user");
String resultAction = results.getString("action");
@@ -50,33 +59,33 @@ public class BlockAPI {
byte[] resultBlockData = results.getBytes("blockdata");
String resultRolledBack = results.getString("rolled_back");
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(connection, resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String blockData = Util.byteDataToString(resultBlockData, resultType);
String[] lookupData = new String[] {
resultTime,
resultUser,
String.valueOf(x),
String.valueOf(y),
String.valueOf(z),
String.valueOf(resultType),
resultData,
resultAction,
resultRolledBack,
String.valueOf(worldId),
blockData
};
String[] lookupData = new String[] { resultTime, resultUser, String.valueOf(x), String.valueOf(y),
String.valueOf(z), String.valueOf(resultType), resultData, resultAction, resultRolledBack,
String.valueOf(worldId), blockData };
String[] lineData = Util.toStringArray(lookupData);
result.add(lineData);
}
results.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -18,27 +18,39 @@ import org.bukkit.block.BlockState;
public class QueueLookup extends Queue {
private QueueLookup() {
throw new IllegalStateException("API class");
}
public static List<String[]> performLookup(Block block) {
List<String[]> result = new ArrayList<>();
if (!Config.getGlobal().API_ENABLED) {
return result;
}
try {
int consumerCount = 0;
int currentConsumerSize = Process.getCurrentConsumerSize();
if (currentConsumerSize == 0) {
consumerCount = Consumer.getConsumerSize(0) + Consumer.getConsumerSize(1);
} else {
int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
consumerCount = Consumer.getConsumerSize(consumerId) + currentConsumerSize;
}
if (consumerCount == 0) {
return result;
}
int currentConsumer = Consumer.currentConsumer;
@@ -49,19 +61,22 @@ public class QueueLookup extends Queue {
Location oldLocation = block.getLocation();
ListIterator<Object[]> iterator = consumerData.listIterator();
while (iterator.hasNext()) {
Object[] data = iterator.next();
int id = (int) data[0];
int action = (int) data[1];
if (action != Process.BLOCK_BREAK && action != Process.BLOCK_PLACE) {
continue;
}
String[] userData = users.get(id);
Object objectData = consumerObject.get(id);
if (userData != null
&& objectData != null
&& (objectData instanceof BlockState)
&& ((BlockState) objectData).getLocation().equals(oldLocation)) {
if (userData != null && objectData != null && (objectData instanceof BlockState)
&& ((BlockState) objectData).getLocation().equals(oldLocation))
{
Material blockType = (Material) data[2];
int legacyData = (int) data[3];
String blockData = (String) data[7];
@@ -72,29 +87,27 @@ public class QueueLookup extends Queue {
int resultType = Util.getBlockId(blockType);
int time = (int) (System.currentTimeMillis() / 1000L);
String[] lookupData = new String[] {
String.valueOf(time),
user,
String.valueOf(location.getBlockX()),
String.valueOf(location.getBlockY()),
String.valueOf(location.getBlockZ()),
String.valueOf(resultType),
String.valueOf(legacyData),
String.valueOf(action),
"0",
String.valueOf(wid),
blockData
};
String[] lookupData = new String[] { String.valueOf(time), user,
String.valueOf(location.getBlockX()), String.valueOf(location.getBlockY()),
String.valueOf(location.getBlockZ()), String.valueOf(resultType),
String.valueOf(legacyData), String.valueOf(action), "0", String.valueOf(wid), blockData };
String[] lineData = Util.toStringArray(lookupData);
result.add(lineData);
}
}
Collections.reverse(result);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -16,37 +16,52 @@ public class SessionLookup {
public static final int ID = 0;
private SessionLookup() {
throw new IllegalStateException("API class");
}
public static List<String[]> performLookup(String user, int offset) {
List<String[]> result = new ArrayList<>();
if (!Config.getGlobal().API_ENABLED) {
return result;
}
try (Connection connection = Database.getConnection(false, 1000)) {
if (connection == null || user == null) {
return result;
}
String type = String.valueOf(ID);
int time = (int) (System.currentTimeMillis() / 1000L);
int checkTime = 0;
if (offset > 0) {
checkTime = time - offset;
}
if (ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT)) == null) {
UserStatement.loadId(connection, user, null);
}
int userId = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
try (Statement statement = connection.createStatement()) {
String query = "SELECT time,user,wid,x,y,z,action FROM " + ConfigHandler.prefix
+ "session WHERE user = '" + userId + "' AND time > '" + checkTime + "' ORDER BY rowid DESC";
ResultSet results = statement.executeQuery(query);
while (results.next()) {
String resultTime = results.getString("time");
int resultUserId = results.getInt("user");
String resultWorldId = results.getString("wid");
@@ -56,21 +71,31 @@ public class SessionLookup {
String resultAction = results.getString("action");
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(connection, resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String[] lookupData = new String[] {
resultTime, resultUser, resultX, resultY, resultZ, resultWorldId, type, resultAction
};
String[] lookupData = new String[] { resultTime, resultUser, resultX, resultY, resultZ,
resultWorldId, type, resultAction };
result.add(lookupData);
}
results.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -43,7 +43,9 @@ public class BukkitAdapter implements BukkitInterface {
public static final int BUKKIT_V1_20 = 20;
public static void loadAdapter() {
switch (ConfigHandler.SERVER_VERSION) {
case BUKKIT_V1_13:
case BUKKIT_V1_14:
case BUKKIT_V1_15:
@@ -62,54 +64,69 @@ public class BukkitAdapter implements BukkitInterface {
default:
BukkitAdapter.ADAPTER = new Bukkit_v1_19();
break;
}
}
@Override
public String parseLegacyName(String name) {
return name;
}
@Override
public int getLegacyBlockId(Material material) {
return -1;
}
@Override
public boolean getEntityMeta(LivingEntity entity, List<Object> info) {
return false;
}
@Override
public boolean setEntityMeta(Entity entity, Object value, int count) {
return false;
}
@Override
public boolean getItemMeta(
ItemMeta itemMeta, List<Map<String, Object>> list, List<List<Map<String, Object>>> metadata, int slot) {
public boolean getItemMeta(ItemMeta itemMeta, List<Map<String, Object>> list,
List<List<Map<String, Object>>> metadata, int slot)
{
return false;
}
@Override
public boolean setItemMeta(Material rowType, ItemStack itemstack, List<Map<String, Object>> map) {
return false;
}
@Override
public boolean isAttached(Block block, Block scanBlock, BlockData blockData, int scanMin) {
if (blockData instanceof Directional && blockData instanceof FaceAttachable) {
Directional directional = (Directional) blockData;
FaceAttachable faceAttachable = (FaceAttachable) blockData;
boolean scanButton = false;
switch (faceAttachable.getAttachedFace()) {
case WALL:
scanButton = (scanMin < 5
&& scanBlock
.getRelative(directional.getFacing().getOppositeFace())
.getLocation()
.equals(block.getLocation()));
scanButton = (scanMin < 5 && scanBlock.getRelative(directional.getFacing().getOppositeFace())
.getLocation().equals(block.getLocation()));
break;
case FLOOR:
scanButton = (scanMin == 5);
@@ -119,95 +136,132 @@ public class BukkitAdapter implements BukkitInterface {
break;
default:
break;
}
return scanButton;
}
return true; // unvalidated attachments default to true
}
@Override
public int getMinHeight(World world) {
return 0;
}
@Override
public Material getBucketContents(Material material) {
return Material.AIR;
}
@Override
public boolean isItemFrame(Material material) {
return (material == Material.ITEM_FRAME);
}
@Override
public Material getFrameType(Entity entity) {
return Material.ITEM_FRAME;
}
@Override
public Material getFrameType(EntityType type) {
return type == EntityType.ITEM_FRAME ? Material.ITEM_FRAME : null;
}
@Override
public Class<?> getFrameClass(Material material) {
return ItemFrame.class;
}
@Override
public boolean isGlowing(Sign sign, boolean isFront) {
return false;
}
@Override
public boolean isWaxed(Sign sign) {
return false;
}
@Override
public boolean isInvisible(Material material) {
return Util.isAir(material);
}
@Override
public ItemStack adjustIngredient(MerchantRecipe recipe, ItemStack itemStack) {
return null;
}
@Override
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
return;
}
@Override
public void setColor(Sign sign, boolean isFront, int color) {
if (!isFront) {
return;
}
sign.setColor(DyeColor.getByColor(Color.fromRGB(color)));
}
@Override
public void setWaxed(Sign sign, boolean isWaxed) {
return;
}
@Override
public int getColor(Sign sign, boolean isFront) {
if (isFront) {
return sign.getColor().getColor().asRGB();
}
return 0;
}
@Override
public Material getPlantSeeds(Material material) {
switch (material) {
case WHEAT:
material = Material.WHEAT_SEEDS;
break;
@@ -221,99 +275,143 @@ public class BukkitAdapter implements BukkitInterface {
material = Material.BEETROOT_SEEDS;
break;
default:
}
return material;
}
@Override
public boolean isDecoratedPot(Material material) {
return false;
}
@Override
public boolean isSuspiciousBlock(Material material) {
return false;
}
@Override
public boolean isSign(Material material) {
return Tag.SIGNS.isTagged(material);
}
@Override
public boolean isChiseledBookshelf(Material material) {
return false;
}
@Override
public boolean isBookshelfBook(Material material) {
return false;
}
@Override
public ItemStack getChiseledBookshelfBook(BlockState blockState, PlayerInteractEvent event) {
return null;
}
@Override
public String getLine(Sign sign, int line) {
if (line < 4) {
return sign.getLine(line);
} else {
return "";
}
}
@Override
public void setLine(Sign sign, int line, String string) {
if (string == null) {
string = "";
}
if (line < 4) {
sign.setLine(line, string);
}
}
@Override
public boolean isSignFront(SignChangeEvent event) {
return true;
}
@Override
public ItemStack getArrowMeta(Arrow arrow, ItemStack itemStack) {
PotionData data = arrow.getBasePotionData();
if (data.getType() != PotionType.valueOf("UNCRAFTABLE")) {
itemStack = new ItemStack(Material.TIPPED_ARROW);
PotionMeta meta = (PotionMeta) itemStack.getItemMeta();
meta.setBasePotionData(data);
for (PotionEffect effect : arrow.getCustomEffects()) {
meta.addCustomEffect(effect, false);
}
itemStack.setItemMeta(meta);
}
return itemStack;
}
@Override
public EntityType getEntityType(Material material) {
switch (material) {
case END_CRYSTAL:
return EntityType.valueOf("ENDER_CRYSTAL");
default:
return EntityType.UNKNOWN;
}
}
@Override
public Object getRegistryKey(Object value) {
return value;
}
@Override
public Object getRegistryValue(String key, Object tClass) {
return null;
}
}
@@ -36,8 +36,8 @@ public interface BukkitInterface {
public boolean setEntityMeta(Entity entity, Object value, int count);
public boolean getItemMeta(
ItemMeta itemMeta, List<Map<String, Object>> list, List<List<Map<String, Object>>> metadata, int slot);
public boolean getItemMeta(ItemMeta itemMeta, List<Map<String, Object>> list,
List<List<Map<String, Object>>> metadata, int slot);
public boolean setItemMeta(Material rowType, ItemStack itemstack, List<Map<String, Object>> map);
@@ -90,4 +90,5 @@ public interface BukkitInterface {
public Object getRegistryKey(Object value);
public Object getRegistryValue(String key, Object tClass);
}
@@ -28,317 +28,179 @@ import org.bukkit.inventory.meta.ItemMeta;
public class Bukkit_v1_17 extends BukkitAdapter implements BukkitInterface {
public Bukkit_v1_17() {
BlockGroup.TRACK_ANY = new HashSet<>(Arrays.asList(
Material.PISTON_HEAD,
Material.LEVER,
Material.BELL,
Material.SMALL_AMETHYST_BUD,
Material.MEDIUM_AMETHYST_BUD,
Material.LARGE_AMETHYST_BUD,
Material.AMETHYST_CLUSTER,
Material.GLOW_LICHEN));
BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(
Material.TORCH,
Material.REDSTONE_TORCH,
Material.BAMBOO,
Material.BAMBOO_SAPLING,
Material.CORNFLOWER,
Material.LILY_OF_THE_VALLEY,
Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH,
Material.SCAFFOLDING,
Material.OAK_SAPLING,
Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING,
Material.JUNGLE_SAPLING,
Material.ACACIA_SAPLING,
Material.DARK_OAK_SAPLING,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.FERN,
Material.DEAD_BUSH,
Material.DANDELION,
Material.POPPY,
Material.BLUE_ORCHID,
Material.ALLIUM,
Material.AZURE_BLUET,
Material.RED_TULIP,
Material.ORANGE_TULIP,
Material.WHITE_TULIP,
Material.PINK_TULIP,
Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM,
Material.RED_MUSHROOM,
Material.REDSTONE_WIRE,
Material.WHEAT,
Material.ACACIA_SIGN,
Material.BIRCH_SIGN,
Material.DARK_OAK_SIGN,
Material.JUNGLE_SIGN,
Material.OAK_SIGN,
Material.SPRUCE_SIGN,
Material.WHITE_BANNER,
Material.ORANGE_BANNER,
Material.MAGENTA_BANNER,
Material.LIGHT_BLUE_BANNER,
Material.YELLOW_BANNER,
Material.LIME_BANNER,
Material.PINK_BANNER,
Material.GRAY_BANNER,
Material.LIGHT_GRAY_BANNER,
Material.CYAN_BANNER,
Material.PURPLE_BANNER,
Material.BLUE_BANNER,
Material.BROWN_BANNER,
Material.GREEN_BANNER,
Material.RED_BANNER,
Material.BLACK_BANNER,
Material.RAIL,
Material.IRON_DOOR,
Material.SNOW,
Material.CACTUS,
Material.SUGAR_CANE,
Material.REPEATER,
Material.PUMPKIN_STEM,
Material.MELON_STEM,
Material.CARROT,
Material.POTATO,
Material.COMPARATOR,
Material.ACTIVATOR_RAIL,
Material.SUNFLOWER,
Material.LILAC,
Material.TALL_GRASS,
Material.LARGE_FERN,
Material.ROSE_BUSH,
Material.PEONY,
Material.NETHER_WART,
Material.CHORUS_PLANT,
Material.CHORUS_FLOWER,
Material.KELP,
Material.SOUL_TORCH,
Material.TWISTING_VINES,
Material.CRIMSON_FUNGUS,
Material.WARPED_FUNGUS,
Material.CRIMSON_ROOTS,
Material.WARPED_ROOTS,
Material.NETHER_SPROUTS,
Material.CRIMSON_SIGN,
Material.WARPED_SIGN,
Material.AZALEA,
Material.FLOWERING_AZALEA,
Material.SMALL_DRIPLEAF,
Material.BIG_DRIPLEAF));
BlockGroup.TRACK_TOP_BOTTOM =
new HashSet<>(Arrays.asList(Material.POINTED_DRIPSTONE, Material.BIG_DRIPLEAF_STEM));
BlockGroup.TRACK_BOTTOM = new HashSet<>(Arrays.asList(
Material.WEEPING_VINES, Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.HANGING_ROOTS));
BlockGroup.TRACK_ANY = new HashSet<>(Arrays.asList(Material.PISTON_HEAD, Material.LEVER, Material.BELL,
Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD,
Material.AMETHYST_CLUSTER, Material.GLOW_LICHEN));
BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO,
Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING,
Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION,
Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP,
Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.REDSTONE_WIRE, Material.WHEAT,
Material.ACACIA_SIGN, Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN,
Material.OAK_SIGN, Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER,
Material.MAGENTA_BANNER, Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER,
Material.PINK_BANNER, Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER,
Material.PURPLE_BANNER, Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER,
Material.RED_BANNER, Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW,
Material.CACTUS, Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM,
Material.CARROT, Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER,
Material.LILAC, Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY,
Material.NETHER_WART, Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH,
Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS,
Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN,
Material.AZALEA, Material.FLOWERING_AZALEA, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF));
BlockGroup.TRACK_TOP_BOTTOM = new HashSet<>(
Arrays.asList(Material.POINTED_DRIPSTONE, Material.BIG_DRIPLEAF_STEM));
BlockGroup.TRACK_BOTTOM = new HashSet<>(Arrays.asList(Material.WEEPING_VINES, Material.CAVE_VINES,
Material.CAVE_VINES_PLANT, Material.HANGING_ROOTS));
BlockGroup.VINES = new HashSet<>(
Arrays.asList(Material.VINE, Material.WEEPING_VINES, Material.TWISTING_VINES, Material.CAVE_VINES));
BlockGroup.CANDLES = new HashSet<>(Arrays.asList(
Material.CANDLE,
Material.BLACK_CANDLE,
Material.BLUE_CANDLE,
Material.BROWN_CANDLE,
Material.CYAN_CANDLE,
Material.GRAY_CANDLE,
Material.GREEN_CANDLE,
Material.LIGHT_BLUE_CANDLE,
Material.LIGHT_GRAY_CANDLE,
Material.LIME_CANDLE,
Material.MAGENTA_CANDLE,
Material.ORANGE_CANDLE,
Material.PINK_CANDLE,
Material.PURPLE_CANDLE,
Material.RED_CANDLE,
Material.WHITE_CANDLE,
Material.YELLOW_CANDLE,
Material.CANDLE_CAKE,
Material.BLACK_CANDLE_CAKE,
Material.BLUE_CANDLE_CAKE,
Material.BROWN_CANDLE_CAKE,
Material.CYAN_CANDLE_CAKE,
Material.GRAY_CANDLE_CAKE,
Material.GREEN_CANDLE_CAKE,
Material.LIGHT_BLUE_CANDLE_CAKE,
Material.LIGHT_GRAY_CANDLE_CAKE,
Material.LIME_CANDLE_CAKE,
Material.MAGENTA_CANDLE_CAKE,
Material.ORANGE_CANDLE_CAKE,
Material.PINK_CANDLE_CAKE,
Material.PURPLE_CANDLE_CAKE,
Material.RED_CANDLE_CAKE,
Material.WHITE_CANDLE_CAKE,
Material.YELLOW_CANDLE_CAKE));
BlockGroup.AMETHYST = new HashSet<>(Arrays.asList(
Material.SMALL_AMETHYST_BUD,
Material.MEDIUM_AMETHYST_BUD,
Material.LARGE_AMETHYST_BUD,
Material.AMETHYST_CLUSTER));
BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(
Material.TORCH,
Material.WALL_TORCH,
Material.REDSTONE_WIRE,
Material.RAIL,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.FURNACE,
Material.BLAST_FURNACE,
Material.SMOKER,
Material.LEVER,
Material.REDSTONE_TORCH,
Material.REDSTONE_WALL_TORCH,
Material.GLOWSTONE,
Material.JACK_O_LANTERN,
Material.REPEATER,
Material.REDSTONE_LAMP,
Material.BEACON,
Material.COMPARATOR,
Material.DAYLIGHT_DETECTOR,
Material.REDSTONE_BLOCK,
Material.HOPPER,
Material.CHEST,
Material.TRAPPED_CHEST,
Material.ACTIVATOR_RAIL,
Material.SOUL_TORCH,
Material.SOUL_WALL_TORCH,
Material.SHROOMLIGHT,
Material.RESPAWN_ANCHOR,
Material.CRYING_OBSIDIAN,
Material.TARGET,
Material.SMALL_AMETHYST_BUD,
Material.MEDIUM_AMETHYST_BUD,
Material.LARGE_AMETHYST_BUD,
Material.AMETHYST_CLUSTER,
Material.CAVE_VINES,
Material.CAVE_VINES_PLANT,
Material.GLOW_LICHEN,
Material.LIGHT,
BlockGroup.CANDLES = new HashSet<>(Arrays.asList(Material.CANDLE, Material.BLACK_CANDLE, Material.BLUE_CANDLE,
Material.BROWN_CANDLE, Material.CYAN_CANDLE, Material.GRAY_CANDLE, Material.GREEN_CANDLE,
Material.LIGHT_BLUE_CANDLE, Material.LIGHT_GRAY_CANDLE, Material.LIME_CANDLE, Material.MAGENTA_CANDLE,
Material.ORANGE_CANDLE, Material.PINK_CANDLE, Material.PURPLE_CANDLE, Material.RED_CANDLE,
Material.WHITE_CANDLE, Material.YELLOW_CANDLE, Material.CANDLE_CAKE, Material.BLACK_CANDLE_CAKE,
Material.BLUE_CANDLE_CAKE, Material.BROWN_CANDLE_CAKE, Material.CYAN_CANDLE_CAKE,
Material.GRAY_CANDLE_CAKE, Material.GREEN_CANDLE_CAKE, Material.LIGHT_BLUE_CANDLE_CAKE,
Material.LIGHT_GRAY_CANDLE_CAKE, Material.LIME_CANDLE_CAKE, Material.MAGENTA_CANDLE_CAKE,
Material.ORANGE_CANDLE_CAKE, Material.PINK_CANDLE_CAKE, Material.PURPLE_CANDLE_CAKE,
Material.RED_CANDLE_CAKE, Material.WHITE_CANDLE_CAKE, Material.YELLOW_CANDLE_CAKE));
BlockGroup.AMETHYST = new HashSet<>(Arrays.asList(Material.SMALL_AMETHYST_BUD, Material.MEDIUM_AMETHYST_BUD,
Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER));
BlockGroup.UPDATE_STATE = new HashSet<>(Arrays.asList(Material.TORCH, Material.WALL_TORCH,
Material.REDSTONE_WIRE, Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FURNACE,
Material.BLAST_FURNACE, Material.SMOKER, Material.LEVER, Material.REDSTONE_TORCH,
Material.REDSTONE_WALL_TORCH, Material.GLOWSTONE, Material.JACK_O_LANTERN, Material.REPEATER,
Material.REDSTONE_LAMP, Material.BEACON, Material.COMPARATOR, Material.DAYLIGHT_DETECTOR,
Material.REDSTONE_BLOCK, Material.HOPPER, Material.CHEST, Material.TRAPPED_CHEST,
Material.ACTIVATOR_RAIL, Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.SHROOMLIGHT,
Material.RESPAWN_ANCHOR, Material.CRYING_OBSIDIAN, Material.TARGET, Material.SMALL_AMETHYST_BUD,
Material.MEDIUM_AMETHYST_BUD, Material.LARGE_AMETHYST_BUD, Material.AMETHYST_CLUSTER,
Material.CAVE_VINES, Material.CAVE_VINES_PLANT, Material.GLOW_LICHEN, Material.LIGHT,
Material.LAVA_CAULDRON));
BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(
Material.AIR,
Material.CAVE_AIR,
Material.BARRIER,
Material.CORNFLOWER,
Material.LILY_OF_THE_VALLEY,
Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH,
Material.OAK_SAPLING,
Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING,
Material.JUNGLE_SAPLING,
Material.ACACIA_SAPLING,
Material.DARK_OAK_SAPLING,
Material.WATER,
Material.LAVA,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.FERN,
Material.DEAD_BUSH,
Material.DANDELION,
Material.POPPY,
Material.BLUE_ORCHID,
Material.ALLIUM,
Material.AZURE_BLUET,
Material.RED_TULIP,
Material.ORANGE_TULIP,
Material.WHITE_TULIP,
Material.PINK_TULIP,
Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM,
Material.RED_MUSHROOM,
Material.TORCH,
Material.WALL_TORCH,
Material.REDSTONE_WIRE,
Material.LADDER,
Material.RAIL,
Material.LEVER,
Material.REDSTONE_TORCH,
Material.REDSTONE_WALL_TORCH,
Material.SNOW,
Material.SUGAR_CANE,
Material.NETHER_PORTAL,
Material.REPEATER,
Material.KELP,
Material.CHORUS_FLOWER,
Material.CHORUS_PLANT,
Material.SOUL_TORCH,
Material.SOUL_WALL_TORCH,
Material.LIGHT,
Material.SMALL_DRIPLEAF,
Material.BIG_DRIPLEAF,
Material.BIG_DRIPLEAF_STEM,
Material.GLOW_LICHEN,
Material.HANGING_ROOTS));
BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER,
Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH,
Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING,
Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER, Material.LAVA,
Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH, Material.DANDELION,
Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET, Material.RED_TULIP,
Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP, Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH, Material.WALL_TORCH,
Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER, Material.REDSTONE_TORCH,
Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE, Material.NETHER_PORTAL,
Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT, Material.SOUL_TORCH,
Material.SOUL_WALL_TORCH, Material.LIGHT, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF,
Material.BIG_DRIPLEAF_STEM, Material.GLOW_LICHEN, Material.HANGING_ROOTS));
BlockGroup.VERTICAL_TOP_BOTTOM = new HashSet<>(Arrays.asList(Material.BIG_DRIPLEAF_STEM));
}
@Override
public String parseLegacyName(String name) {
switch (name) {
case "GRASS_PATH":
name = "DIRT_PATH";
break;
default:
break;
}
return name;
}
@Override
public int getLegacyBlockId(Material material) {
switch (material) {
case DIRT_PATH:
return Util.getBlockId("GRASS_PATH", false);
default:
return -1;
}
}
@Override
public boolean getEntityMeta(LivingEntity entity, List<Object> info) {
if (entity instanceof Axolotl) {
Axolotl axolotl = (Axolotl) entity;
info.add(axolotl.getVariant());
} else if (entity instanceof Goat) {
Goat goat = (Goat) entity;
info.add(goat.isScreaming());
} else if (super.getEntityMeta(entity, info)) {
return true;
} else {
return false;
}
return true;
}
@Override
public boolean setEntityMeta(Entity entity, Object value, int count) {
if (entity instanceof Axolotl) {
Axolotl axolotl = (Axolotl) entity;
if (count == 0) {
org.bukkit.entity.Axolotl.Variant set = (org.bukkit.entity.Axolotl.Variant) value;
axolotl.setVariant(set);
}
} else if (entity instanceof Goat) {
Goat goat = (Goat) entity;
if (count == 0) {
boolean set = (Boolean) value;
goat.setScreaming(set);
}
} else if (super.setEntityMeta(entity, value, count)) {
return true;
} else {
return false;
}
return true;
}
@Override
public boolean getItemMeta(
ItemMeta itemMeta, List<Map<String, Object>> list, List<List<Map<String, Object>>> metadata, int slot) {
public boolean getItemMeta(ItemMeta itemMeta, List<Map<String, Object>> list,
List<List<Map<String, Object>>> metadata, int slot)
{
if (itemMeta instanceof BundleMeta) {
BundleMeta meta = (BundleMeta) itemMeta;
BundleMeta subMeta = (BundleMeta) meta.clone();
meta.setItems(null);
@@ -346,120 +208,177 @@ public class Bukkit_v1_17 extends BukkitAdapter implements BukkitInterface {
metadata.add(list);
if (subMeta.hasItems()) {
list = new ArrayList<>();
for (ItemStack itemStack : subMeta.getItems()) {
Map<String, Object> itemMap = Util.serializeItemStack(itemStack, null, slot);
if (itemMap.size() > 0) {
list.add(itemMap);
}
}
metadata.add(list);
}
} else if (super.getItemMeta(itemMeta, list, metadata, slot)) {
return true;
} else {
return false;
}
return true;
}
@Override
public boolean setItemMeta(Material rowType, ItemStack itemstack, List<Map<String, Object>> map) {
if ((rowType == Material.BUNDLE)) {
BundleMeta meta = (BundleMeta) itemstack.getItemMeta();
for (Map<String, Object> itemData : map) {
ItemStack itemStack = Util.unserializeItemStack(itemData);
if (itemStack != null) {
meta.addItem(itemStack);
}
}
itemstack.setItemMeta(meta);
} else if (super.setItemMeta(rowType, itemstack, map)) {
return true;
} else {
return false;
}
return true;
}
@Override
public boolean isAttached(Block block, Block scanBlock, BlockData blockData, int scanMin) {
if (blockData instanceof PointedDripstone) {
PointedDripstone pointedDripstone = (PointedDripstone) blockData;
BlockFace blockFace = pointedDripstone.getVerticalDirection();
boolean adjacent = scanBlock
.getRelative(blockFace.getOppositeFace())
.getLocation()
boolean adjacent = scanBlock.getRelative(blockFace.getOppositeFace()).getLocation()
.equals(block.getLocation());
if (!adjacent) {
return false;
}
} else if (!super.isAttached(block, scanBlock, blockData, scanMin)) {
return false;
}
return true;
}
@Override
public int getMinHeight(World world) {
return world.getMinHeight();
}
@Override
public Material getBucketContents(Material material) {
return (material == Material.POWDER_SNOW_BUCKET ? Material.POWDER_SNOW : Material.AIR);
}
@Override
public boolean isItemFrame(Material material) {
return (material == Material.ITEM_FRAME || material == Material.GLOW_ITEM_FRAME);
}
@Override
public Material getFrameType(Entity entity) {
return (entity instanceof GlowItemFrame) ? Material.GLOW_ITEM_FRAME : Material.ITEM_FRAME;
}
@Override
public Material getFrameType(EntityType type) {
switch (type) {
case ITEM_FRAME:
return Material.ITEM_FRAME;
case GLOW_ITEM_FRAME:
return Material.GLOW_ITEM_FRAME;
default:
return null;
}
}
@Override
public Class<?> getFrameClass(Material material) {
return (material == Material.GLOW_ITEM_FRAME) ? GlowItemFrame.class : ItemFrame.class;
}
@Override
public boolean isGlowing(Sign sign, boolean isFront) {
if (!isFront) {
return false;
}
return sign.isGlowingText();
}
@Override
public void setGlowing(Sign sign, boolean isFront, boolean isGlowing) {
if (!isFront) {
return;
}
sign.setGlowingText(isGlowing);
}
@Override
public boolean isInvisible(Material material) {
return material.isAir() || material == Material.LIGHT;
}
}
@@ -9,20 +9,31 @@ public class Bukkit_v1_18 extends Bukkit_v1_17 implements BukkitInterface {
@Override
public ItemStack adjustIngredient(MerchantRecipe recipe, ItemStack itemStack) {
try {
if (hasAdjust == null) {
hasAdjust = true;
MerchantRecipe.class.getMethod("adjust", ItemStack.class); // Bukkit 1.18.1+
} else if (Boolean.FALSE.equals(hasAdjust)) {
return null;
}
ItemStack adjustedStack = itemStack.clone();
recipe.adjust(adjustedStack);
return adjustedStack;
} catch (Exception e) {
hasAdjust = false;
return null;
}
}
}
@@ -14,384 +14,191 @@ import org.bukkit.entity.Tadpole;
public class Bukkit_v1_19 extends Bukkit_v1_18 implements BukkitInterface {
public Bukkit_v1_19() {
BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(
Material.TORCH,
Material.REDSTONE_TORCH,
Material.BAMBOO,
Material.BAMBOO_SAPLING,
Material.CORNFLOWER,
Material.LILY_OF_THE_VALLEY,
Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH,
Material.SCAFFOLDING,
Material.OAK_SAPLING,
Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING,
Material.JUNGLE_SAPLING,
Material.MANGROVE_PROPAGULE,
Material.ACACIA_SAPLING,
Material.DARK_OAK_SAPLING,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.FERN,
Material.DEAD_BUSH,
Material.DANDELION,
Material.POPPY,
Material.BLUE_ORCHID,
Material.ALLIUM,
Material.AZURE_BLUET,
Material.RED_TULIP,
Material.ORANGE_TULIP,
Material.WHITE_TULIP,
Material.PINK_TULIP,
Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM,
Material.RED_MUSHROOM,
Material.REDSTONE_WIRE,
Material.WHEAT,
Material.MANGROVE_SIGN,
Material.ACACIA_SIGN,
Material.BIRCH_SIGN,
Material.DARK_OAK_SIGN,
Material.JUNGLE_SIGN,
Material.OAK_SIGN,
Material.SPRUCE_SIGN,
Material.WHITE_BANNER,
Material.ORANGE_BANNER,
Material.MAGENTA_BANNER,
Material.LIGHT_BLUE_BANNER,
Material.YELLOW_BANNER,
Material.LIME_BANNER,
Material.PINK_BANNER,
Material.GRAY_BANNER,
Material.LIGHT_GRAY_BANNER,
Material.CYAN_BANNER,
Material.PURPLE_BANNER,
Material.BLUE_BANNER,
Material.BROWN_BANNER,
Material.GREEN_BANNER,
Material.RED_BANNER,
Material.BLACK_BANNER,
Material.RAIL,
Material.IRON_DOOR,
Material.SNOW,
Material.CACTUS,
Material.SUGAR_CANE,
Material.REPEATER,
Material.PUMPKIN_STEM,
Material.MELON_STEM,
Material.CARROT,
Material.POTATO,
Material.COMPARATOR,
Material.ACTIVATOR_RAIL,
Material.SUNFLOWER,
Material.LILAC,
Material.TALL_GRASS,
Material.LARGE_FERN,
Material.ROSE_BUSH,
Material.PEONY,
Material.NETHER_WART,
Material.CHORUS_PLANT,
Material.CHORUS_FLOWER,
Material.KELP,
Material.SOUL_TORCH,
Material.TWISTING_VINES,
Material.CRIMSON_FUNGUS,
Material.WARPED_FUNGUS,
Material.CRIMSON_ROOTS,
Material.WARPED_ROOTS,
Material.NETHER_SPROUTS,
Material.CRIMSON_SIGN,
Material.WARPED_SIGN,
Material.AZALEA,
Material.FLOWERING_AZALEA,
Material.SMALL_DRIPLEAF,
Material.BIG_DRIPLEAF));
BlockGroup.TRACK_SIDE = new HashSet<>(Arrays.asList(
Material.WALL_TORCH,
Material.REDSTONE_WALL_TORCH,
Material.RAIL,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.ACTIVATOR_RAIL,
Material.WHITE_BED,
Material.ORANGE_BED,
Material.MAGENTA_BED,
Material.LIGHT_BLUE_BED,
Material.YELLOW_BED,
Material.LIME_BED,
Material.PINK_BED,
Material.GRAY_BED,
Material.LIGHT_GRAY_BED,
Material.CYAN_BED,
Material.PURPLE_BED,
Material.BLUE_BED,
Material.BROWN_BED,
Material.GREEN_BED,
Material.RED_BED,
Material.BLACK_BED,
Material.LADDER,
Material.MANGROVE_WALL_SIGN,
Material.ACACIA_WALL_SIGN,
Material.BIRCH_WALL_SIGN,
Material.DARK_OAK_WALL_SIGN,
Material.JUNGLE_WALL_SIGN,
Material.OAK_WALL_SIGN,
Material.SPRUCE_WALL_SIGN,
Material.VINE,
Material.COCOA,
Material.TRIPWIRE_HOOK,
Material.WHITE_WALL_BANNER,
Material.ORANGE_WALL_BANNER,
Material.MAGENTA_WALL_BANNER,
Material.LIGHT_BLUE_WALL_BANNER,
Material.YELLOW_WALL_BANNER,
Material.LIME_WALL_BANNER,
Material.PINK_WALL_BANNER,
Material.GRAY_WALL_BANNER,
Material.LIGHT_GRAY_WALL_BANNER,
Material.CYAN_WALL_BANNER,
Material.PURPLE_WALL_BANNER,
Material.BLUE_WALL_BANNER,
Material.BROWN_WALL_BANNER,
Material.GREEN_WALL_BANNER,
Material.RED_WALL_BANNER,
Material.BLACK_WALL_BANNER,
Material.SOUL_WALL_TORCH,
Material.CRIMSON_WALL_SIGN,
Material.WARPED_WALL_SIGN));
BlockGroup.DOORS = new HashSet<>(Arrays.asList(
Material.OAK_DOOR,
Material.SPRUCE_DOOR,
Material.BIRCH_DOOR,
Material.JUNGLE_DOOR,
Material.MANGROVE_DOOR,
Material.ACACIA_DOOR,
Material.DARK_OAK_DOOR,
Material.CRIMSON_DOOR,
Material.WARPED_DOOR));
BlockGroup.BUTTONS = new HashSet<>(Arrays.asList(
Material.STONE_BUTTON,
Material.OAK_BUTTON,
Material.MANGROVE_BUTTON,
Material.ACACIA_BUTTON,
Material.BIRCH_BUTTON,
Material.DARK_OAK_BUTTON,
Material.JUNGLE_BUTTON,
Material.SPRUCE_BUTTON,
Material.POLISHED_BLACKSTONE_BUTTON,
Material.CRIMSON_BUTTON,
Material.WARPED_BUTTON));
BlockGroup.PRESSURE_PLATES = new HashSet<>(Arrays.asList(
Material.STONE_PRESSURE_PLATE,
Material.MANGROVE_PRESSURE_PLATE,
Material.ACACIA_PRESSURE_PLATE,
Material.BIRCH_PRESSURE_PLATE,
Material.DARK_OAK_PRESSURE_PLATE,
Material.HEAVY_WEIGHTED_PRESSURE_PLATE,
Material.JUNGLE_PRESSURE_PLATE,
Material.LIGHT_WEIGHTED_PRESSURE_PLATE,
Material.OAK_PRESSURE_PLATE,
Material.SPRUCE_PRESSURE_PLATE,
Material.CRIMSON_PRESSURE_PLATE,
Material.WARPED_PRESSURE_PLATE,
BlockGroup.TRACK_TOP = new HashSet<>(Arrays.asList(Material.TORCH, Material.REDSTONE_TORCH, Material.BAMBOO,
Material.BAMBOO_SAPLING, Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH, Material.SCAFFOLDING, Material.OAK_SAPLING, Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING, Material.MANGROVE_PROPAGULE, Material.ACACIA_SAPLING,
Material.DARK_OAK_SAPLING, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN,
Material.DEAD_BUSH, Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM,
Material.AZURE_BLUET, Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP,
Material.PINK_TULIP, Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM,
Material.REDSTONE_WIRE, Material.WHEAT, Material.MANGROVE_SIGN, Material.ACACIA_SIGN,
Material.BIRCH_SIGN, Material.DARK_OAK_SIGN, Material.JUNGLE_SIGN, Material.OAK_SIGN,
Material.SPRUCE_SIGN, Material.WHITE_BANNER, Material.ORANGE_BANNER, Material.MAGENTA_BANNER,
Material.LIGHT_BLUE_BANNER, Material.YELLOW_BANNER, Material.LIME_BANNER, Material.PINK_BANNER,
Material.GRAY_BANNER, Material.LIGHT_GRAY_BANNER, Material.CYAN_BANNER, Material.PURPLE_BANNER,
Material.BLUE_BANNER, Material.BROWN_BANNER, Material.GREEN_BANNER, Material.RED_BANNER,
Material.BLACK_BANNER, Material.RAIL, Material.IRON_DOOR, Material.SNOW, Material.CACTUS,
Material.SUGAR_CANE, Material.REPEATER, Material.PUMPKIN_STEM, Material.MELON_STEM, Material.CARROT,
Material.POTATO, Material.COMPARATOR, Material.ACTIVATOR_RAIL, Material.SUNFLOWER, Material.LILAC,
Material.TALL_GRASS, Material.LARGE_FERN, Material.ROSE_BUSH, Material.PEONY, Material.NETHER_WART,
Material.CHORUS_PLANT, Material.CHORUS_FLOWER, Material.KELP, Material.SOUL_TORCH,
Material.TWISTING_VINES, Material.CRIMSON_FUNGUS, Material.WARPED_FUNGUS, Material.CRIMSON_ROOTS,
Material.WARPED_ROOTS, Material.NETHER_SPROUTS, Material.CRIMSON_SIGN, Material.WARPED_SIGN,
Material.AZALEA, Material.FLOWERING_AZALEA, Material.SMALL_DRIPLEAF, Material.BIG_DRIPLEAF));
BlockGroup.TRACK_SIDE = new HashSet<>(Arrays.asList(Material.WALL_TORCH, Material.REDSTONE_WALL_TORCH,
Material.RAIL, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.ACTIVATOR_RAIL,
Material.WHITE_BED, Material.ORANGE_BED, Material.MAGENTA_BED, Material.LIGHT_BLUE_BED,
Material.YELLOW_BED, Material.LIME_BED, Material.PINK_BED, Material.GRAY_BED, Material.LIGHT_GRAY_BED,
Material.CYAN_BED, Material.PURPLE_BED, Material.BLUE_BED, Material.BROWN_BED, Material.GREEN_BED,
Material.RED_BED, Material.BLACK_BED, Material.LADDER, Material.MANGROVE_WALL_SIGN,
Material.ACACIA_WALL_SIGN, Material.BIRCH_WALL_SIGN, Material.DARK_OAK_WALL_SIGN,
Material.JUNGLE_WALL_SIGN, Material.OAK_WALL_SIGN, Material.SPRUCE_WALL_SIGN, Material.VINE,
Material.COCOA, Material.TRIPWIRE_HOOK, Material.WHITE_WALL_BANNER, Material.ORANGE_WALL_BANNER,
Material.MAGENTA_WALL_BANNER, Material.LIGHT_BLUE_WALL_BANNER, Material.YELLOW_WALL_BANNER,
Material.LIME_WALL_BANNER, Material.PINK_WALL_BANNER, Material.GRAY_WALL_BANNER,
Material.LIGHT_GRAY_WALL_BANNER, Material.CYAN_WALL_BANNER, Material.PURPLE_WALL_BANNER,
Material.BLUE_WALL_BANNER, Material.BROWN_WALL_BANNER, Material.GREEN_WALL_BANNER,
Material.RED_WALL_BANNER, Material.BLACK_WALL_BANNER, Material.SOUL_WALL_TORCH,
Material.CRIMSON_WALL_SIGN, Material.WARPED_WALL_SIGN));
BlockGroup.DOORS = new HashSet<>(Arrays.asList(Material.OAK_DOOR, Material.SPRUCE_DOOR, Material.BIRCH_DOOR,
Material.JUNGLE_DOOR, Material.MANGROVE_DOOR, Material.ACACIA_DOOR, Material.DARK_OAK_DOOR,
Material.CRIMSON_DOOR, Material.WARPED_DOOR));
BlockGroup.BUTTONS = new HashSet<>(Arrays.asList(Material.STONE_BUTTON, Material.OAK_BUTTON,
Material.MANGROVE_BUTTON, Material.ACACIA_BUTTON, Material.BIRCH_BUTTON, Material.DARK_OAK_BUTTON,
Material.JUNGLE_BUTTON, Material.SPRUCE_BUTTON, Material.POLISHED_BLACKSTONE_BUTTON,
Material.CRIMSON_BUTTON, Material.WARPED_BUTTON));
BlockGroup.PRESSURE_PLATES = new HashSet<>(Arrays.asList(Material.STONE_PRESSURE_PLATE,
Material.MANGROVE_PRESSURE_PLATE, Material.ACACIA_PRESSURE_PLATE, Material.BIRCH_PRESSURE_PLATE,
Material.DARK_OAK_PRESSURE_PLATE, Material.HEAVY_WEIGHTED_PRESSURE_PLATE,
Material.JUNGLE_PRESSURE_PLATE, Material.LIGHT_WEIGHTED_PRESSURE_PLATE, Material.OAK_PRESSURE_PLATE,
Material.SPRUCE_PRESSURE_PLATE, Material.CRIMSON_PRESSURE_PLATE, Material.WARPED_PRESSURE_PLATE,
Material.POLISHED_BLACKSTONE_PRESSURE_PLATE));
BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList(
Material.SPRUCE_FENCE_GATE,
Material.BIRCH_FENCE_GATE,
Material.JUNGLE_FENCE_GATE,
Material.DARK_OAK_FENCE_GATE,
Material.MANGROVE_FENCE_GATE,
Material.ACACIA_FENCE_GATE,
Material.DISPENSER,
Material.NOTE_BLOCK,
Material.CHEST,
Material.FURNACE,
Material.LEVER,
Material.REPEATER,
Material.MANGROVE_TRAPDOOR,
Material.ACACIA_TRAPDOOR,
Material.BIRCH_TRAPDOOR,
Material.DARK_OAK_TRAPDOOR,
Material.JUNGLE_TRAPDOOR,
Material.SPRUCE_TRAPDOOR,
Material.OAK_TRAPDOOR,
Material.OAK_FENCE_GATE,
Material.BREWING_STAND,
Material.ANVIL,
Material.CHIPPED_ANVIL,
Material.DAMAGED_ANVIL,
Material.ENDER_CHEST,
Material.TRAPPED_CHEST,
Material.COMPARATOR,
Material.HOPPER,
Material.DROPPER,
Material.SHULKER_BOX,
Material.BLACK_SHULKER_BOX,
Material.BLUE_SHULKER_BOX,
Material.BROWN_SHULKER_BOX,
Material.CYAN_SHULKER_BOX,
Material.GRAY_SHULKER_BOX,
Material.GREEN_SHULKER_BOX,
Material.LIGHT_BLUE_SHULKER_BOX,
Material.LIME_SHULKER_BOX,
Material.MAGENTA_SHULKER_BOX,
Material.ORANGE_SHULKER_BOX,
Material.PINK_SHULKER_BOX,
Material.PURPLE_SHULKER_BOX,
Material.RED_SHULKER_BOX,
Material.LIGHT_GRAY_SHULKER_BOX,
Material.WHITE_SHULKER_BOX,
Material.YELLOW_SHULKER_BOX,
Material.BARREL,
Material.BLAST_FURNACE,
Material.GRINDSTONE,
Material.LOOM,
Material.SMOKER,
Material.CRAFTING_TABLE,
Material.CARTOGRAPHY_TABLE,
Material.ENCHANTING_TABLE,
Material.SMITHING_TABLE,
Material.STONECUTTER,
Material.CRIMSON_FENCE_GATE,
Material.WARPED_FENCE_GATE,
Material.CRIMSON_TRAPDOOR,
Material.WARPED_TRAPDOOR));
BlockGroup.SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(
Material.LEVER,
Material.MANGROVE_TRAPDOOR,
Material.ACACIA_TRAPDOOR,
Material.BIRCH_TRAPDOOR,
Material.DARK_OAK_TRAPDOOR,
Material.JUNGLE_TRAPDOOR,
Material.SPRUCE_TRAPDOOR,
Material.OAK_TRAPDOOR,
Material.OAK_FENCE_GATE,
Material.SPRUCE_FENCE_GATE,
Material.BIRCH_FENCE_GATE,
Material.JUNGLE_FENCE_GATE,
Material.DARK_OAK_FENCE_GATE,
Material.MANGROVE_FENCE_GATE,
Material.ACACIA_FENCE_GATE,
Material.CRIMSON_FENCE_GATE,
Material.WARPED_FENCE_GATE,
Material.CRIMSON_TRAPDOOR,
Material.WARPED_TRAPDOOR));
BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(
Material.AIR,
Material.CAVE_AIR,
Material.BARRIER,
Material.CORNFLOWER,
Material.LILY_OF_THE_VALLEY,
Material.WITHER_ROSE,
Material.SWEET_BERRY_BUSH,
Material.OAK_SAPLING,
Material.SPRUCE_SAPLING,
Material.BIRCH_SAPLING,
Material.JUNGLE_SAPLING,
Material.MANGROVE_PROPAGULE,
Material.ACACIA_SAPLING,
Material.DARK_OAK_SAPLING,
Material.WATER,
Material.LAVA,
Material.POWERED_RAIL,
Material.DETECTOR_RAIL,
Material.FERN,
Material.DEAD_BUSH,
Material.DANDELION,
Material.POPPY,
Material.BLUE_ORCHID,
Material.ALLIUM,
Material.AZURE_BLUET,
Material.RED_TULIP,
Material.ORANGE_TULIP,
Material.WHITE_TULIP,
Material.PINK_TULIP,
Material.OXEYE_DAISY,
Material.BROWN_MUSHROOM,
Material.RED_MUSHROOM,
Material.TORCH,
Material.WALL_TORCH,
Material.REDSTONE_WIRE,
Material.LADDER,
Material.RAIL,
Material.LEVER,
Material.REDSTONE_TORCH,
Material.REDSTONE_WALL_TORCH,
Material.SNOW,
Material.SUGAR_CANE,
Material.NETHER_PORTAL,
Material.REPEATER,
Material.KELP,
Material.CHORUS_FLOWER,
Material.CHORUS_PLANT,
Material.SOUL_TORCH,
Material.SOUL_WALL_TORCH,
Material.LIGHT,
Material.SMALL_DRIPLEAF,
Material.BIG_DRIPLEAF,
Material.BIG_DRIPLEAF_STEM,
Material.GLOW_LICHEN,
Material.HANGING_ROOTS));
BlockGroup.INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.SPRUCE_FENCE_GATE, Material.BIRCH_FENCE_GATE,
Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE, Material.MANGROVE_FENCE_GATE,
Material.ACACIA_FENCE_GATE, Material.DISPENSER, Material.NOTE_BLOCK, Material.CHEST, Material.FURNACE,
Material.LEVER, Material.REPEATER, Material.MANGROVE_TRAPDOOR, Material.ACACIA_TRAPDOOR,
Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR, Material.SPRUCE_TRAPDOOR,
Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.BREWING_STAND, Material.ANVIL,
Material.CHIPPED_ANVIL, Material.DAMAGED_ANVIL, Material.ENDER_CHEST, Material.TRAPPED_CHEST,
Material.COMPARATOR, Material.HOPPER, Material.DROPPER, Material.SHULKER_BOX,
Material.BLACK_SHULKER_BOX, Material.BLUE_SHULKER_BOX, Material.BROWN_SHULKER_BOX,
Material.CYAN_SHULKER_BOX, Material.GRAY_SHULKER_BOX, Material.GREEN_SHULKER_BOX,
Material.LIGHT_BLUE_SHULKER_BOX, Material.LIME_SHULKER_BOX, Material.MAGENTA_SHULKER_BOX,
Material.ORANGE_SHULKER_BOX, Material.PINK_SHULKER_BOX, Material.PURPLE_SHULKER_BOX,
Material.RED_SHULKER_BOX, Material.LIGHT_GRAY_SHULKER_BOX, Material.WHITE_SHULKER_BOX,
Material.YELLOW_SHULKER_BOX, Material.BARREL, Material.BLAST_FURNACE, Material.GRINDSTONE,
Material.LOOM, Material.SMOKER, Material.CRAFTING_TABLE, Material.CARTOGRAPHY_TABLE,
Material.ENCHANTING_TABLE, Material.SMITHING_TABLE, Material.STONECUTTER, Material.CRIMSON_FENCE_GATE,
Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR));
BlockGroup.SAFE_INTERACT_BLOCKS = new HashSet<>(Arrays.asList(Material.LEVER, Material.MANGROVE_TRAPDOOR,
Material.ACACIA_TRAPDOOR, Material.BIRCH_TRAPDOOR, Material.DARK_OAK_TRAPDOOR, Material.JUNGLE_TRAPDOOR,
Material.SPRUCE_TRAPDOOR, Material.OAK_TRAPDOOR, Material.OAK_FENCE_GATE, Material.SPRUCE_FENCE_GATE,
Material.BIRCH_FENCE_GATE, Material.JUNGLE_FENCE_GATE, Material.DARK_OAK_FENCE_GATE,
Material.MANGROVE_FENCE_GATE, Material.ACACIA_FENCE_GATE, Material.CRIMSON_FENCE_GATE,
Material.WARPED_FENCE_GATE, Material.CRIMSON_TRAPDOOR, Material.WARPED_TRAPDOOR));
BlockGroup.NON_ATTACHABLE = new HashSet<>(Arrays.asList(Material.AIR, Material.CAVE_AIR, Material.BARRIER,
Material.CORNFLOWER, Material.LILY_OF_THE_VALLEY, Material.WITHER_ROSE, Material.SWEET_BERRY_BUSH,
Material.OAK_SAPLING, Material.SPRUCE_SAPLING, Material.BIRCH_SAPLING, Material.JUNGLE_SAPLING,
Material.MANGROVE_PROPAGULE, Material.ACACIA_SAPLING, Material.DARK_OAK_SAPLING, Material.WATER,
Material.LAVA, Material.POWERED_RAIL, Material.DETECTOR_RAIL, Material.FERN, Material.DEAD_BUSH,
Material.DANDELION, Material.POPPY, Material.BLUE_ORCHID, Material.ALLIUM, Material.AZURE_BLUET,
Material.RED_TULIP, Material.ORANGE_TULIP, Material.WHITE_TULIP, Material.PINK_TULIP,
Material.OXEYE_DAISY, Material.BROWN_MUSHROOM, Material.RED_MUSHROOM, Material.TORCH,
Material.WALL_TORCH, Material.REDSTONE_WIRE, Material.LADDER, Material.RAIL, Material.LEVER,
Material.REDSTONE_TORCH, Material.REDSTONE_WALL_TORCH, Material.SNOW, Material.SUGAR_CANE,
Material.NETHER_PORTAL, Material.REPEATER, Material.KELP, Material.CHORUS_FLOWER, Material.CHORUS_PLANT,
Material.SOUL_TORCH, Material.SOUL_WALL_TORCH, Material.LIGHT, Material.SMALL_DRIPLEAF,
Material.BIG_DRIPLEAF, Material.BIG_DRIPLEAF_STEM, Material.GLOW_LICHEN, Material.HANGING_ROOTS));
BlockGroup.SCULK = new HashSet<>(
Arrays.asList(Material.SCULK, Material.SCULK_VEIN, Material.SCULK_SENSOR, Material.SCULK_SHRIEKER));
}
@Override
public boolean getEntityMeta(LivingEntity entity, List<Object> info) {
if (entity instanceof Frog) {
Frog frog = (Frog) entity;
info.add(BukkitAdapter.ADAPTER.getRegistryKey(frog.getVariant()));
} else if (entity instanceof Tadpole) {
Tadpole tadpole = (Tadpole) entity;
info.add(tadpole.getAge());
} else if (entity instanceof Goat) {
Goat goat = (Goat) entity;
info.add(goat.isScreaming());
info.add(goat.hasLeftHorn());
info.add(goat.hasRightHorn());
} else if (super.getEntityMeta(entity, info)) {
return true;
} else {
return false;
}
return true;
}
@Override
public boolean setEntityMeta(Entity entity, Object value, int count) {
if (entity instanceof Frog) {
Frog frog = (Frog) entity;
if (count == 0) {
if (value instanceof String) {
value = BukkitAdapter.ADAPTER.getRegistryValue((String) value, Frog.Variant.class);
}
Frog.Variant set = (Frog.Variant) value;
frog.setVariant(set);
}
} else if (entity instanceof Tadpole) {
Tadpole tadpole = (Tadpole) entity;
if (count == 0) {
int set = (int) value;
tadpole.setAge(set);
}
} else if (entity instanceof Goat) {
Goat goat = (Goat) entity;
boolean set = (Boolean) value;
if (count == 0) {
goat.setScreaming(set);
} else if (count == 1) {
goat.setLeftHorn(set);
} else if (count == 2) {
goat.setRightHorn(set);
}
} else if (super.setEntityMeta(entity, value, count)) {
return true;
} else {
return false;
}
return true;
}
}
@@ -11,9 +11,13 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class ApplyCommand {
protected static void runCommand(CommandSender user, Command command, boolean permission, String[] args) {
try {
if (ConfigHandler.lastRollback.get(user.getName()) != null) {
List<Object> list = ConfigHandler.lastRollback.get(user.getName());
long startTime = (Long) list.get(0);
long endTime = (Long) list.get(1);
@@ -21,28 +25,41 @@ public class ApplyCommand {
Location location = (Location) list.get(3);
boolean valid = false;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("#preview")) {
valid = true;
args[i] = args[i].replaceAll("#preview", "");
}
}
if (!valid) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST));
} else {
ConfigHandler.lastRollback.remove(user.getName());
RollbackRestoreCommand.runCommand(user, command, permission, args, location, startTime, endTime);
}
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -11,9 +11,13 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class CancelCommand {
protected static void runCommand(CommandSender user, Command command, boolean permission, String[] args) {
try {
if (ConfigHandler.lastRollback.get(user.getName()) != null) {
List<Object> list = ConfigHandler.lastRollback.get(user.getName());
long startTime = (Long) list.get(0);
long endTime = (Long) list.get(1);
@@ -21,28 +25,41 @@ public class CancelCommand {
Location location = (Location) list.get(3);
boolean valid = false;
for (int i = 0; i < args.length; i++) {
if (args[i].equals("#preview")) {
valid = true;
args[i] = args[i].replaceAll("#preview", "#preview_cancel");
}
}
if (!valid) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST));
} else {
ConfigHandler.lastRollback.remove(user.getName());
RollbackRestoreCommand.runCommand(user, command, permission, args, location, startTime, endTime);
}
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_ROLLBACK, Selector.FIRST));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
File diff suppressed because it is too large. Load diff
@@ -12,74 +12,94 @@ import org.bukkit.command.ConsoleCommandSender;
public class ConsumerCommand {
private ConsumerCommand() {
throw new IllegalStateException("Command class");
}
protected static void runCommand(final CommandSender player, boolean permission, String[] args) {
if (!permission) {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
return;
}
if (!(player instanceof ConsoleCommandSender)) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_CONSOLE));
return;
}
if (ConfigHandler.converterRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.UPGRADE_IN_PROGRESS));
return;
}
if (ConfigHandler.purgeRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PURGE_IN_PROGRESS));
return;
}
if (args.length == 2) {
String action = args[1].toLowerCase(Locale.ROOT);
boolean pauseCommand = (action.equals("pause") || action.equals("disable") || action.equals("stop"));
boolean resumeCommand = (action.equals("resume") || action.equals("enable") || action.equals("start"));
if (pauseCommand || resumeCommand) {
if (ConfigHandler.pauseConsumer) {
if (pauseCommand) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_ERROR, Selector.FIRST)); // already paused
} else {
ConfigHandler.pauseConsumer = false;
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.SECOND)); // now started
}
} else {
if (resumeCommand) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_ERROR, Selector.SECOND)); // already running
} else {
ConfigHandler.pauseConsumer = true;
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.FIRST)); // now paused
}
}
return;
}
}
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
} else {
if (resumeCommand) {
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_ERROR, Selector.SECOND)); // already running
} else {
ConfigHandler.pauseConsumer = true;
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.CONSUMER_TOGGLED, Selector.FIRST)); // now paused
}
}
return;
}
}
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_PARAMETERS, Color.WHITE, "/co consumer <pause|resume>"));
}
}
@@ -8,24 +8,28 @@ import net.coreprotect.utility.Color;
import org.bukkit.command.CommandSender;
public class HelpCommand {
protected static void runCommand(CommandSender player, boolean permission, String[] args) {
int resultc = args.length;
if (permission) {
if (resultc > 1) {
String helpcommand_original = args[1];
String helpcommand = args[1].toLowerCase(Locale.ROOT);
helpcommand = helpcommand.replaceAll("[^a-zA-Z]", "");
Chat.sendMessage(
player,
Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.HELP_HEADER, "CoreProtect")
+ Color.WHITE + " -----");
Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA
+ Phrase.build(Phrase.HELP_HEADER, "CoreProtect") + Color.WHITE + " -----");
if (helpcommand.equals("help")) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "/co help " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_LIST));
} else if (helpcommand.equals("inspect")
|| helpcommand.equals("inspector")
|| helpcommand.equals("in")) {
} else if (helpcommand.equals("inspect") || helpcommand.equals("inspector")
|| helpcommand.equals("in"))
{
Chat.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.HELP_INSPECT_1));
Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_2));
Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_3));
@@ -33,258 +37,188 @@ public class HelpCommand {
Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_5));
Chat.sendMessage(player, "* " + Phrase.build(Phrase.HELP_INSPECT_6));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_INSPECT_7));
} else if (helpcommand.equals("params")
|| helpcommand.equals("param")
|| helpcommand.equals("parameters")
|| helpcommand.equals("parameter")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup " + Color.GREY + "<params> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_1, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
} else if (helpcommand.equals("params") || helpcommand.equals("param")
|| helpcommand.equals("parameters") || helpcommand.equals("parameter"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup " + Color.GREY + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_PARAMS_1, Selector.FIRST));
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_2, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_3, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_4, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_5, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_6, Selector.FIRST));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_7, Selector.FIRST));
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_PARAMETER, "/co help <param>"));
} else if (helpcommand.equals("rollback")
|| helpcommand.equals("rollbacks")
|| helpcommand.equals("rb")
|| helpcommand.equals("ro")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co rollback " + Color.GREY + "<params> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_1, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
} else if (helpcommand.equals("rollback") || helpcommand.equals("rollbacks") || helpcommand.equals("rb")
|| helpcommand.equals("ro"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co rollback " + Color.GREY + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_PARAMS_1, Selector.SECOND));
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_2, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_3, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_4, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_5, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_6, Selector.SECOND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_7, Selector.SECOND));
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_PARAMETER, "/co help <param>"));
} else if (helpcommand.equals("restore")
|| helpcommand.equals("restores")
|| helpcommand.equals("re")
|| helpcommand.equals("rs")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co restore " + Color.GREY + "<params> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_1, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
} else if (helpcommand.equals("restore") || helpcommand.equals("restores") || helpcommand.equals("re")
|| helpcommand.equals("rs"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co restore " + Color.GREY + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_PARAMS_1, Selector.THIRD));
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "u:<users> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_2, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "t:<time> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_3, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "r:<radius> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_4, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "a:<action> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_5, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "i:<include> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_6, Selector.THIRD));
Chat.sendMessage(
player,
Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "| " + Color.GREY + "e:<exclude> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PARAMS_7, Selector.THIRD));
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_PARAMETER, "/co help <param>"));
} else if (helpcommand.equals("lookup") || helpcommand.equals("lookups") || helpcommand.equals("l")) {
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup <params>");
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co l <params> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co l <params> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_LOOKUP_1));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup <page> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup <page> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_LOOKUP_2));
Chat.sendMessage(
player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_PARAMETER, "/co help params"));
Chat.sendMessage(player,
Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_PARAMETER, "/co help params"));
} else if (helpcommand.equals("purge") || helpcommand.equals("purges")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co purge t:<time> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co purge t:<time> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_PURGE_1));
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.GREY + Color.ITALIC + "" + Phrase.build(Phrase.HELP_PURGE_2, "/co purge t:30d"));
} else if (helpcommand.equals("reload")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co reload " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co reload " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_RELOAD_COMMAND));
} else if (helpcommand.equals("status")) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "/co status " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_STATUS));
} else if (helpcommand.equals("teleport")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co teleport <world> <x> <y> <z> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co teleport <world> <x> <y> <z> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_TELEPORT));
} else if (helpcommand.equals("u")
|| helpcommand.equals("user")
|| helpcommand.equals("users")
|| helpcommand.equals("uuser")
|| helpcommand.equals("uusers")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup u:<users> " + Color.WHITE + "- "
} else if (helpcommand.equals("u") || helpcommand.equals("user") || helpcommand.equals("users")
|| helpcommand.equals("uuser") || helpcommand.equals("uusers"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup u:<users> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_USER_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_USER_2));
} else if (helpcommand.equals("t") || helpcommand.equals("time") || helpcommand.equals("ttime")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup t:<time> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup t:<time> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_TIME_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_TIME_2));
} else if (helpcommand.equals("r") || helpcommand.equals("radius") || helpcommand.equals("rradius")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup r:<radius> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup r:<radius> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_RADIUS_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_RADIUS_2));
} else if (helpcommand.equals("a")
|| helpcommand.equals("action")
|| helpcommand.equals("actions")
|| helpcommand.equals("aaction")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup a:<action> " + Color.WHITE + "- "
} else if (helpcommand.equals("a") || helpcommand.equals("action") || helpcommand.equals("actions")
|| helpcommand.equals("aaction"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup a:<action> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_ACTION_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_ACTION_2));
} else if (helpcommand.equals("i")
|| helpcommand.equals("include")
|| helpcommand.equals("iinclude")
|| helpcommand.equals("b")
|| helpcommand.equals("block")
|| helpcommand.equals("blocks")
|| helpcommand.equals("bblock")
|| helpcommand.equals("bblocks")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup i:<include> " + Color.WHITE + "- "
} else if (helpcommand.equals("i") || helpcommand.equals("include") || helpcommand.equals("iinclude")
|| helpcommand.equals("b") || helpcommand.equals("block") || helpcommand.equals("blocks")
|| helpcommand.equals("bblock") || helpcommand.equals("bblocks"))
{
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup i:<include> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_INCLUDE_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_INCLUDE_2));
Chat.sendMessage(
player,
Color.GREY
+ Color.ITALIC
Chat.sendMessage(player, Color.GREY + Color.ITALIC
+ Phrase.build(Phrase.LINK_WIKI_BLOCK, "https://coreprotect.net/wiki-blocks"));
Chat.sendMessage(
player,
Color.GREY
+ Color.ITALIC
Chat.sendMessage(player, Color.GREY + Color.ITALIC
+ Phrase.build(Phrase.LINK_WIKI_ENTITY, "https://coreprotect.net/wiki-entities"));
} else if (helpcommand.equals("e") || helpcommand.equals("exclude") || helpcommand.equals("eexclude")) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co lookup e:<exclude> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co lookup e:<exclude> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_EXCLUDE_1));
Chat.sendMessage(player, Color.GREY + Color.ITALIC + Phrase.build(Phrase.HELP_EXCLUDE_2));
Chat.sendMessage(
player,
Color.GREY
+ Color.ITALIC
Chat.sendMessage(player, Color.GREY + Color.ITALIC
+ Phrase.build(Phrase.LINK_WIKI_BLOCK, "https://coreprotect.net/wiki-blocks"));
} else {
Chat.sendMessage(
player,
Color.WHITE
+ Phrase.build(
Phrase.HELP_NO_INFO, Color.WHITE, "/co help " + helpcommand_original));
Chat.sendMessage(player, Color.WHITE
+ Phrase.build(Phrase.HELP_NO_INFO, Color.WHITE, "/co help " + helpcommand_original));
}
} else {
Chat.sendMessage(
player,
Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.HELP_HEADER, "CoreProtect")
+ Color.WHITE + " -----");
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co help " + Color.GREY + "<command> " + Color.WHITE + "- "
Chat.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA
+ Phrase.build(Phrase.HELP_HEADER, "CoreProtect") + Color.WHITE + " -----");
Chat.sendMessage(player, Color.DARK_AQUA + "/co help " + Color.GREY + "<command> " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "inspect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "inspect " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_INSPECT_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "rollback " + Color.DARK_AQUA + "<params> "
+ Color.WHITE + "- " + Phrase.build(Phrase.HELP_ROLLBACK_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "restore " + Color.DARK_AQUA + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_RESTORE_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "lookup " + Color.DARK_AQUA + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_LOOKUP_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "purge " + Color.DARK_AQUA + "<params> " + Color.WHITE
+ "- " + Phrase.build(Phrase.HELP_PURGE_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "reload " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "rollback " + Color.DARK_AQUA
+ "<params> " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_ROLLBACK_COMMAND));
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "restore " + Color.DARK_AQUA
+ "<params> " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_RESTORE_COMMAND));
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "lookup " + Color.DARK_AQUA
+ "<params> " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_LOOKUP_COMMAND));
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "purge " + Color.DARK_AQUA
+ "<params> " + Color.WHITE + "- " + Phrase.build(Phrase.HELP_PURGE_COMMAND));
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "reload " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_RELOAD_COMMAND));
Chat.sendMessage(
player,
Color.DARK_AQUA + "/co " + Color.GREY + "status " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "/co " + Color.GREY + "status " + Color.WHITE + "- "
+ Phrase.build(Phrase.HELP_STATUS_COMMAND));
}
} else {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
}
}
}
@@ -8,52 +8,68 @@ import net.coreprotect.utility.Color;
import org.bukkit.command.CommandSender;
public class InspectCommand {
protected static void runCommand(CommandSender player, boolean permission, String[] args) {
if (permission) {
int command = -1;
ConfigHandler.inspecting.putIfAbsent(player.getName(), false);
if (args.length > 1) {
String action = args[1];
if (action.equalsIgnoreCase("on")) {
command = 1;
} else if (action.equalsIgnoreCase("off")) {
command = 0;
}
}
if (!ConfigHandler.inspecting.get(player.getName())) {
if (command == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_ERROR, Selector.SECOND)); // already disabled
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_TOGGLED, Selector.FIRST)); // now enabled
ConfigHandler.inspecting.put(player.getName(), true);
}
} else {
if (command == 1) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_ERROR, Selector.FIRST)); // already enabled
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_TOGGLED, Selector.SECOND)); // now disabled
ConfigHandler.inspecting.put(player.getName(), false);
}
}
} else {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
if (command == 1) {
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_ERROR, Selector.FIRST)); // already enabled
} else {
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INSPECTOR_TOGGLED, Selector.SECOND)); // now disabled
ConfigHandler.inspecting.put(player.getName(), false);
}
}
} else {
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
}
}
}
File diff suppressed because it is too large. Load diff
@@ -8,17 +8,27 @@ import net.coreprotect.utility.Color;
import org.bukkit.command.CommandSender;
public class NetworkDebugCommand {
protected static void runCommand(CommandSender player, boolean permission, String[] args) {
if (!permission || !Config.getGlobal().NETWORK_DEBUG) {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
return;
}
try {
PluginChannelListener.getInstance().sendTest(player, args.length == 2 ? args[1] : "");
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -31,6 +31,7 @@ import org.bukkit.entity.Player;
public class PurgeCommand extends Consumer {
protected static void runCommand(final CommandSender player, boolean permission, String[] args) {
int resultc = args.length;
Location location = CommandHandler.parseLocation(player, args);
final Integer[] argRadius = CommandHandler.parseRadius(args, player, location);
@@ -45,71 +46,92 @@ public class PurgeCommand extends Consumer {
long endTime = argTime[1] > 0 ? argTime[1] : argTime[0];
if (argBlocks == null || argExclude == null || argExcludeUsers == null) {
return;
}
if (ConfigHandler.converterRunning || ConfigHandler.migrationRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.UPGRADE_IN_PROGRESS));
return;
}
if (ConfigHandler.purgeRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PURGE_IN_PROGRESS));
return;
}
if (!permission) {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
return;
}
if (resultc <= 1) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_PARAMETERS, "/co purge t:<time>"));
return;
}
if (endTime <= 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_PARAMETERS, "/co purge t:<time>"));
return;
}
if (argRadius != null) {
Chat.sendMessage(player, new ChatMessage(Phrase.build(Phrase.INVALID_WORLD)).build());
return;
}
if (argWid == -1) {
String worldName = CommandHandler.parseWorldName(args, false);
Chat.sendMessage(player, new ChatMessage(Phrase.build(Phrase.WORLD_NOT_FOUND, worldName)).build());
return;
}
if (player instanceof Player && endTime < 2592000) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.PURGE_MINIMUM_TIME, "30", Selector.FIRST)); // 30 days
return;
} else if (endTime < 86400) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.PURGE_MINIMUM_TIME, "24", Selector.SECOND)); // 24 hours
return;
}
for (int action : argAction) {
if (!supportedActions.contains(action)) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ACTION_NOT_SUPPORTED));
// Functions.sendMessage(player, new ChatMessage("Please specify a valid purge action.").build());
// Functions.sendMessage(player, new ChatMessage("Please specify a valid purge
// action.").build());
return;
}
}
StringBuilder restrict = new StringBuilder();
@@ -121,67 +143,94 @@ public class PurgeCommand extends Consumer {
int restrictCount = 0;
if (argBlocks.size() > 0) {
StringBuilder includeListMaterial = new StringBuilder();
StringBuilder includeListEntity = new StringBuilder();
for (Object restrictTarget : argBlocks) {
String targetName = "";
if (restrictTarget instanceof Material) {
targetName = ((Material) restrictTarget).name();
if (includeListMaterial.length() == 0) {
includeListMaterial = includeListMaterial.append(Util.getBlockId(targetName, false));
} else {
includeListMaterial.append(",").append(Util.getBlockId(targetName, false));
}
/* Include legacy IDs */
int legacyId = BukkitAdapter.ADAPTER.getLegacyBlockId((Material) restrictTarget);
if (legacyId > 0) {
includeListMaterial.append(",").append(legacyId);
}
targetName = ((Material) restrictTarget).name().toLowerCase(Locale.ROOT);
item = (!item ? !(((Material) restrictTarget).isBlock()) : item);
hasBlock = true;
} else if (restrictTarget instanceof EntityType) {
targetName = ((EntityType) restrictTarget).name();
if (includeListEntity.length() == 0) {
includeListEntity = includeListEntity.append(Util.getEntityId(targetName, false));
} else {
includeListEntity.append(",").append(Util.getEntityId(targetName, false));
}
targetName = ((EntityType) restrictTarget).name().toLowerCase(Locale.ROOT);
entity = true;
}
if (restrictCount == 0) {
restrict = restrict.append("" + targetName + "");
} else {
restrict.append(", ").append(targetName);
}
restrictCount++;
}
includeBlock = includeListMaterial.toString();
includeEntity = includeListEntity.toString();
}
if (entity) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.ACTION_NOT_SUPPORTED));
return;
}
boolean optimizeCheck = false;
for (String arg : args) {
if (arg.trim().equalsIgnoreCase("#optimize")) {
optimizeCheck = true;
break;
}
}
final StringBuilder restrictTargets = restrict;
@@ -194,7 +243,9 @@ public class PurgeCommand extends Consumer {
@Override
public void run() {
try {
long timestamp = (System.currentTimeMillis() / 1000L);
long timeStart = startTime > 0 ? (timestamp - startTime) : 0;
long timeEnd = timestamp - endTime;
@@ -202,34 +253,42 @@ public class PurgeCommand extends Consumer {
Connection connection = null;
for (int i = 0; i <= 5; i++) {
connection = Database.getConnection(false, 500);
if (connection != null) {
break;
}
Thread.sleep(1000);
}
if (connection == null) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.DATABASE_BUSY));
return;
}
if (argWid > 0) {
String worldName = CommandHandler.parseWorldName(args, false);
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_STARTED, worldName));
} else {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_STARTED, "#global"));
}
if (hasBlockRestriction) {
Chat.sendGlobalMessage(
player,
Phrase.build(
Phrase.ROLLBACK_INCLUDE,
restrictTargets.toString(),
Selector.FIRST,
Selector.FIRST,
(restrictCountFinal == 1 ? Selector.FIRST : Selector.SECOND))); // include
Chat.sendGlobalMessage(player,
Phrase.build(Phrase.ROLLBACK_INCLUDE, restrictTargets.toString(), Selector.FIRST,
Selector.FIRST, (restrictCountFinal == 1 ? Selector.FIRST : Selector.SECOND))); // include
}
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_NOTICE_1));
@@ -237,8 +296,11 @@ public class PurgeCommand extends Consumer {
ConfigHandler.purgeRunning = true;
while (!Consumer.pausedSuccess) {
Thread.sleep(1);
}
Consumer.isPaused = true;
String query = "";
@@ -247,215 +309,309 @@ public class PurgeCommand extends Consumer {
String purgePrefix = "tmp_" + ConfigHandler.prefix;
if (!Config.getGlobal().MYSQL) {
query = "ATTACH DATABASE '" + ConfigHandler.path + ConfigHandler.sqlite + ".tmp' AS tmp_db";
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
purgePrefix = "tmp_db." + ConfigHandler.prefix;
}
Integer[] lastVersion = Patch.getDatabaseVersion(connection, true);
boolean newVersion = Util.newVersion(lastVersion, Util.getInternalPluginVersion());
if (newVersion && !ConfigHandler.EDITION_BRANCH.contains("-dev")) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_FAILED));
Consumer.isPaused = false;
ConfigHandler.purgeRunning = false;
return;
}
if (!Config.getGlobal().MYSQL) {
for (String table : ConfigHandler.databaseTables) {
try {
query = "DROP TABLE IF EXISTS " + purgePrefix + table + "";
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Database.createDatabaseTables(purgePrefix, null, Config.getGlobal().MYSQL, true);
}
List<String> purgeTables = Arrays.asList(
"sign", "container", "item", "skull", "session", "chat", "command", "entity", "block");
List<String> worldTables =
Arrays.asList("sign", "container", "item", "session", "chat", "command", "block");
List<String> purgeTables = Arrays.asList("sign", "container", "item", "skull", "session", "chat",
"command", "entity", "block");
List<String> worldTables = Arrays.asList("sign", "container", "item", "session", "chat", "command",
"block");
List<String> restrictTables = Arrays.asList("block");
List<String> excludeTables = Arrays.asList("database_lock"); // don't insert data into these tables
for (String table : ConfigHandler.databaseTables) {
String tableName = table.replaceAll("_", " ");
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_PROCESSING, tableName));
if (!Config.getGlobal().MYSQL) {
String columns = "";
ResultSet rs =
connection.createStatement().executeQuery("SELECT * FROM " + purgePrefix + table);
ResultSet rs = connection.createStatement()
.executeQuery("SELECT * FROM " + purgePrefix + table);
ResultSetMetaData resultSetMetaData = rs.getMetaData();
int columnCount = resultSetMetaData.getColumnCount();
for (int i = 1; i <= columnCount; i++) {
String name = resultSetMetaData.getColumnName(i);
if (columns.length() == 0) {
columns = name;
} else {
columns = columns + "," + name;
}
}
rs.close();
boolean error = false;
if (!excludeTables.contains(table)) {
try {
boolean purge = true;
String timeLimit = "";
if (purgeTables.contains(table)) {
String blockRestriction = "(";
if (hasBlockRestriction && restrictTables.contains(table)) {
blockRestriction = "type NOT IN(" + includeBlockFinal + ") OR (type IN("
+ includeBlockFinal + ") AND ";
} else if (hasBlockRestriction) {
purge = false;
}
if (argWid > 0 && worldTables.contains(table)) {
timeLimit = " WHERE (" + blockRestriction + "wid = '" + argWid
+ "' AND (time >= '" + timeEnd + "' OR time < '" + timeStart
+ "'))) OR (wid != '" + argWid + "')";
} else if (argWid == 0 && purge) {
timeLimit = " WHERE " + blockRestriction + "(time >= '" + timeEnd
+ "' OR time < '" + timeStart + "'))";
}
}
query = "INSERT INTO " + purgePrefix + table + " SELECT " + columns + " FROM "
+ ConfigHandler.prefix + table + timeLimit;
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
} catch (Exception e) {
error = true;
e.printStackTrace();
}
}
if (error) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_ERROR, tableName));
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_REPAIRING));
try {
query = "DELETE FROM " + purgePrefix + table;
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
query = "REINDEX " + ConfigHandler.prefix + table;
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
String index = " NOT INDEXED";
query = "INSERT INTO " + purgePrefix + table + " SELECT " + columns + " FROM "
+ ConfigHandler.prefix + table + index;
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
abort = true;
break;
}
try {
boolean purge = purgeTables.contains(table);
String blockRestriction = "";
if (hasBlockRestriction && restrictTables.contains(table)) {
blockRestriction = "type IN(" + includeBlockFinal + ") AND ";
} else if (hasBlockRestriction) {
purge = false;
}
String worldRestriction = "";
if (argWid > 0 && worldTables.contains(table)) {
worldRestriction = " AND wid = '" + argWid + "'";
} else if (argWid > 0) {
purge = false;
}
if (purge) {
query = "DELETE FROM " + purgePrefix + table + " WHERE " + blockRestriction
+ "time < '" + timeEnd + "' AND time >= '" + timeStart + "'"
+ worldRestriction;
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
if (purgeTables.contains(table)) {
int oldCount = 0;
try {
query = "SELECT COUNT(*) as count FROM " + ConfigHandler.prefix + table
+ " LIMIT 0, 1";
preparedStmt = connection.prepareStatement(query);
ResultSet resultSet = preparedStmt.executeQuery();
while (resultSet.next()) {
oldCount = resultSet.getInt("count");
}
resultSet.close();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
int new_count = 0;
try {
query = "SELECT COUNT(*) as count FROM " + purgePrefix + table + " LIMIT 0, 1";
preparedStmt = connection.prepareStatement(query);
ResultSet resultSet = preparedStmt.executeQuery();
while (resultSet.next()) {
new_count = resultSet.getInt("count");
}
resultSet.close();
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
removed = removed + (oldCount - new_count);
}
}
if (Config.getGlobal().MYSQL) {
try {
boolean purge = purgeTables.contains(table);
String blockRestriction = "";
if (hasBlockRestriction && restrictTables.contains(table)) {
blockRestriction = "type IN(" + includeBlockFinal + ") AND ";
} else if (hasBlockRestriction) {
purge = false;
}
String worldRestriction = "";
if (argWid > 0 && worldTables.contains(table)) {
worldRestriction = " AND wid = '" + argWid + "'";
} else if (argWid > 0) {
purge = false;
}
if (purge) {
query = "DELETE FROM " + ConfigHandler.prefix + table + " WHERE " + blockRestriction
+ "time < '" + timeEnd + "' AND time >= '" + timeStart + "'"
+ worldRestriction;
@@ -463,68 +619,91 @@ public class PurgeCommand extends Consumer {
preparedStmt.execute();
removed = removed + preparedStmt.getUpdateCount();
preparedStmt.close();
}
} catch (Exception e) {
if (!ConfigHandler.serverRunning) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_FAILED));
return;
}
e.printStackTrace();
}
}
}
if (Config.getGlobal().MYSQL && optimize) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_OPTIMIZING));
for (String table : ConfigHandler.databaseTables) {
query = "OPTIMIZE LOCAL TABLE " + ConfigHandler.prefix + table + "";
preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
}
}
connection.close();
if (abort) {
if (!Config.getGlobal().MYSQL) {
(new File(ConfigHandler.path + ConfigHandler.sqlite + ".tmp")).delete();
}
ConfigHandler.loadDatabase();
Chat.sendGlobalMessage(player, Color.RED + Phrase.build(Phrase.PURGE_ABORTED));
Consumer.isPaused = false;
ConfigHandler.purgeRunning = false;
return;
}
if (!Config.getGlobal().MYSQL) {
(new File(ConfigHandler.path + ConfigHandler.sqlite)).delete();
(new File(ConfigHandler.path + ConfigHandler.sqlite + ".tmp"))
.renameTo(new File(ConfigHandler.path + ConfigHandler.sqlite));
}
ConfigHandler.loadDatabase();
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_SUCCESS));
Chat.sendGlobalMessage(
player,
Phrase.build(
Phrase.PURGE_ROWS,
NumberFormat.getInstance().format(removed),
Chat.sendGlobalMessage(player,
Phrase.build(Phrase.PURGE_ROWS, NumberFormat.getInstance().format(removed),
(removed == 1 ? Selector.FIRST : Selector.SECOND)));
} catch (Exception e) {
Chat.sendGlobalMessage(player, Phrase.build(Phrase.PURGE_FAILED));
e.printStackTrace();
}
Consumer.isPaused = false;
ConfigHandler.purgeRunning = false;
}
}
Runnable runnable = new BasicThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
@@ -9,70 +9,96 @@ import net.coreprotect.utility.Color;
import org.bukkit.command.CommandSender;
public class ReloadCommand {
protected static void runCommand(final CommandSender player, boolean permission, String[] args) {
if (permission) {
if (ConfigHandler.converterRunning) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.UPGRADE_IN_PROGRESS));
return;
}
if (ConfigHandler.purgeRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PURGE_IN_PROGRESS));
return;
}
if (ConfigHandler.lookupThrottle.get(player.getName()) != null) {
Object[] lookupThrottle = ConfigHandler.lookupThrottle.get(player.getName());
if ((boolean) lookupThrottle[0] || ((System.currentTimeMillis() - (long) lookupThrottle[1])) < 100) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DATABASE_BUSY));
return;
}
}
ConfigHandler.lookupThrottle.put(player.getName(), new Object[] { true, System.currentTimeMillis() });
class BasicThread implements Runnable {
@Override
public void run() {
try {
if (Consumer.isPaused) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.RELOAD_STARTED));
}
while (Consumer.isPaused) {
Thread.sleep(1);
}
Consumer.isPaused = true;
ConfigHandler.performInitialization(false);
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.RELOAD_SUCCESS));
Thread networkHandler = new Thread(new NetworkHandler(false, false));
networkHandler.start();
} catch (Exception e) {
e.printStackTrace();
}
Consumer.isPaused = false;
ConfigHandler.lookupThrottle.put(
player.getName(), new Object[] {false, System.currentTimeMillis()});
ConfigHandler.lookupThrottle.put(player.getName(),
new Object[]
{ false, System.currentTimeMillis() });
}
}
Runnable runnable = new BasicThread();
Thread thread = new Thread(runnable);
thread.start();
} else {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
}
}
}
@@ -30,14 +30,11 @@ import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
public class RollbackRestoreCommand {
protected static void runCommand(
CommandSender player,
Command command,
boolean permission,
String[] args,
Location argLocation,
long forceStart,
long forceEnd) {
protected static void runCommand(CommandSender player, Command command, boolean permission, String[] args,
Location argLocation, long forceStart, long forceEnd)
{
Location lo = (argLocation != null ? argLocation : CommandHandler.parseLocation(player, args));
List<String> argUuids = new ArrayList<>();
List<String> argUsers = CommandHandler.parseUsers(args);
@@ -59,273 +56,346 @@ public class RollbackRestoreCommand {
String corecommand = args[0].toLowerCase(Locale.ROOT);
if (argBlocks == null || argExclude == null || argExcludeUsers == null) {
return;
}
/* check for invalid block/entity combinations (include) */
boolean hasBlock = false;
boolean hasEntity = false;
for (Object arg : argBlocks) {
if (arg instanceof Material) {
hasBlock = true;
} else if (arg instanceof EntityType) {
hasEntity = true;
if (argAction.size() == 0) {
argAction.add(3);
} else if (!argAction.contains(3)) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INVALID_INCLUDE_COMBO));
return;
}
}
}
/* check for invalid block/entity combinations (exclude) */
for (Object arg : argExclude.keySet()) {
if (arg instanceof Material) {
hasBlock = true;
} else if (arg instanceof EntityType) {
hasEntity = true;
if (argAction.size() == 0) {
argAction.add(3);
} else if (!argAction.contains(3)) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INVALID_INCLUDE_COMBO));
return;
}
}
}
if (hasBlock && hasEntity) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INVALID_INCLUDE_COMBO));
return;
}
if (count) {
LookupCommand.runCommand(player, command, permission, args);
return;
}
if (ConfigHandler.converterRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.UPGRADE_IN_PROGRESS));
return;
}
if (ConfigHandler.purgeRunning) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PURGE_IN_PROGRESS));
return;
}
if (argWid == -1) {
String worldName = CommandHandler.parseWorldName(args, true);
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.WORLD_NOT_FOUND, worldName));
return;
}
if (preview > 0 && (!(player instanceof Player))) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PREVIEW_IN_GAME));
return;
}
if (argAction.contains(-1)) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INVALID_ACTION));
return;
}
if (worldedit && argRadius == null) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INVALID_SELECTION, "WorldEdit"));
return;
}
if (argRadius != null && argRadius[0] == -1) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.INVALID_RADIUS));
return;
}
if (ConfigHandler.activeRollbacks.get(player.getName()) != null) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.ROLLBACK_IN_PROGRESS));
return;
}
if (ConfigHandler.lookupThrottle.get(player.getName()) != null) {
Object[] lookupThrottle = ConfigHandler.lookupThrottle.get(player.getName());
if ((boolean) lookupThrottle[0] || ((System.currentTimeMillis() - (long) lookupThrottle[1])) < 100) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.DATABASE_BUSY));
return;
}
}
if (preview > 1 && forceStart <= 0) {
preview = 1;
}
if (permission) {
int a = 0;
if (corecommand.equals("restore") || corecommand.equals("rs") || corecommand.equals("re")) {
a = 1;
}
final int finalAction = a;
int DEFAULT_RADIUS = Config.getGlobal().DEFAULT_RADIUS;
if ((player instanceof Player || player instanceof BlockCommandSender)
&& argRadius == null
&& DEFAULT_RADIUS > 0
&& !forceglobal
&& !argAction.contains(11)) {
if ((player instanceof Player || player instanceof BlockCommandSender) && argRadius == null
&& DEFAULT_RADIUS > 0 && !forceglobal && !argAction.contains(11))
{
Location location = lo;
int xmin = location.getBlockX() - DEFAULT_RADIUS;
int xmax = location.getBlockX() + DEFAULT_RADIUS;
int zmin = location.getBlockZ() - DEFAULT_RADIUS;
int zmax = location.getBlockZ() + DEFAULT_RADIUS;
argRadius = new Integer[] { DEFAULT_RADIUS, xmin, xmax, null, null, zmin, zmax, 0 };
}
// if (arg_radius==-2)arg_radius = -1;
int g = 1;
if (argUsers.contains("#global")) {
if (argRadius == null) {
g = 0;
}
}
if (argUsers.size() == 0 && (argWid > 0 || forceglobal) && argRadius == null) {
if (finalAction == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ROLLBACK_USER, Selector.FIRST));
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ROLLBACK_USER, Selector.SECOND));
}
return;
}
if (argAction.contains(4) && argAction.contains(11)) { // a:inventory
if (argUsers.size() == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ACTION_USER));
return;
}
argExclude.put(Material.FIRE, false);
argExclude.put(Material.WATER, false);
argExclude.put(Material.FARMLAND, false);
argExcludeUsers.add("#hopper");
} else if (!argAction.contains(4)
&& Config.getGlobal().EXCLUDE_TNT
&& !argExclude.containsKey(Material.TNT)
&& !argBlocks.contains(Material.TNT)) {
} else if (!argAction.contains(4) && Config.getGlobal().EXCLUDE_TNT && !argExclude.containsKey(Material.TNT)
&& !argBlocks.contains(Material.TNT))
{
argExclude.put(Material.TNT, true);
}
if (g == 1 && (argUsers.size() > 0 || (argUsers.size() == 0 && argRadius != null))) {
Integer MAX_RADIUS = Config.getGlobal().MAX_RADIUS;
if (argRadius != null) {
int radiusValue = argRadius[0];
if (radiusValue > MAX_RADIUS && MAX_RADIUS > 0) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.MAXIMUM_RADIUS,
MAX_RADIUS.toString(),
+ Phrase.build(Phrase.MAXIMUM_RADIUS, MAX_RADIUS.toString(),
(finalAction == 0 ? Selector.SECOND : Selector.THIRD)));
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.GLOBAL_ROLLBACK,
"r:#global",
+ Phrase.build(Phrase.GLOBAL_ROLLBACK, "r:#global",
(finalAction == 0 ? Selector.FIRST : Selector.SECOND)));
return;
}
}
if (argAction.size() > 0) {
if (argAction.contains(4)) {
if (argUsers.contains("#global") || (argUsers.size() == 0 && argRadius == null)) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ACTION_USER));
return;
} else if (preview > 0) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.PREVIEW_TRANSACTION,
+ Phrase.build(Phrase.PREVIEW_TRANSACTION,
!argAction.contains(11) ? Selector.FIRST : Selector.SECOND));
return;
}
}
if (argAction.contains(8)
|| (argAction.contains(11) && !argAction.contains(4))
|| (!argAction.contains(0)
&& !argAction.contains(1)
&& !argAction.contains(3)
&& !argAction.contains(4))) {
if (argAction.contains(8) || (argAction.contains(11) && !argAction.contains(4))
|| (!argAction.contains(0) && !argAction.contains(1) && !argAction.contains(3)
&& !argAction.contains(4)))
{
if (finalAction == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ACTION_NOT_SUPPORTED));
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ACTION_NOT_SUPPORTED));
}
return;
}
}
if (argUsers.size() == 0) {
argUsers.add("#global");
}
List<String> rollbackusers = argUsers;
int c = 0;
for (String ruser : rollbackusers) {
List<Player> players = Bukkit.getServer().matchPlayer(ruser); // here
for (Player p : players) {
if (p.getName().equalsIgnoreCase(ruser)) {
ruser = p.getName();
rollbackusers.set(c, ruser);
}
}
c++;
if (argAction.contains(4) && argAction.contains(11)) {
Player onlineUser = Bukkit.getServer().getPlayer(ruser);
if (onlineUser == null || !onlineUser.isOnline()) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.USER_OFFLINE, ruser));
return;
}
}
}
int wid = 0;
@@ -333,33 +403,45 @@ public class RollbackRestoreCommand {
int y = 0;
int z = 0;
if (rollbackusers.contains("#container")) {
if (argAction.contains(11)) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INVALID_USERNAME, "#container"));
return;
}
boolean valid = false;
if (ConfigHandler.lookupType.get(player.getName()) != null) {
int lookupType = ConfigHandler.lookupType.get(player.getName());
if (lookupType == 1) {
valid = true;
} else if (lookupType == 5) {
if (ConfigHandler.lookupUlist.get(player.getName()).contains("#container")) {
valid = true;
}
}
}
if (valid) {
if (preview > 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.PREVIEW_TRANSACTION, Selector.FIRST));
return;
} else {
String lcommand = ConfigHandler.lookupCommand.get(player.getName());
String[] data = lcommand.split("\\.");
x = Integer.parseInt(data[0]);
@@ -372,11 +454,13 @@ public class RollbackRestoreCommand {
lo = new Location(Bukkit.getServer().getWorld(Util.getWorldName(wid)), x, y, z);
Block block = lo.getBlock();
if (block.getState() instanceof Chest) {
BlockFace[] blockFaces = new BlockFace[] {
BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST
};
BlockFace[] blockFaces = new BlockFace[] { BlockFace.NORTH, BlockFace.EAST,
BlockFace.SOUTH, BlockFace.WEST };
for (BlockFace face : blockFaces) {
if (block.getRelative(face, 1).getState() instanceof Chest) {
Block relative = block.getRelative(face, 1);
int x2 = relative.getX();
int z2 = relative.getZ();
@@ -385,32 +469,43 @@ public class RollbackRestoreCommand {
lo.setX(newX);
lo.setZ(newZ);
break;
}
}
}
}
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.INVALID_CONTAINER));
return;
}
}
final List<String> rollbackusers2 = rollbackusers;
if (startTime > 0) {
long unixtimestamp = (System.currentTimeMillis() / 1000L);
long timeStart = unixtimestamp - startTime;
long timeEnd = endTime > 0 ? (unixtimestamp - endTime) : 0;
if (forceStart > 0) {
timeStart = forceStart;
timeEnd = forceEnd;
}
final long finalTimeStart = timeStart;
final long finalTimeEnd = timeEnd;
final Integer[] radius = argRadius;
try {
final CommandSender player2 = player;
final int noisy = argNoisy;
final String rtime = ts;
@@ -427,213 +522,257 @@ public class RollbackRestoreCommand {
ConfigHandler.activeRollbacks.put(player.getName(), true);
class BasicThread2 implements Runnable {
@Override
public void run() {
try (Connection connection = Database.getConnection(false, 1000)) {
ConfigHandler.lookupThrottle.put(
player.getName(), new Object[] {true, System.currentTimeMillis()});
ConfigHandler.lookupThrottle.put(player.getName(),
new Object[]
{ true, System.currentTimeMillis() });
int action = finalAction;
Location location = locationFinal;
if (connection != null) {
Statement statement = connection.createStatement();
String baduser = "";
boolean exists = false;
for (String check : rollbackusers2) {
if (!check.equals("#global") && !check.equals("#container")) {
exists = PlayerLookup.playerExists(connection, check);
if (!exists) {
baduser = check;
break;
}
} else {
exists = true;
}
}
if (exists) {
for (String check : euserlist) {
if (!check.equals("#global") && !check.equals("#hopper")) {
exists = PlayerLookup.playerExists(connection, check);
if (!exists) {
baduser = check;
break;
}
} else if (check.equals("#global")) {
baduser = "#global";
exists = false;
}
}
}
if (exists) {
boolean restrictWorld = false;
if (radius != null) {
restrictWorld = true;
}
if (location == null) {
restrictWorld = false;
}
if (finalArgWid > 0) {
restrictWorld = true;
location = new Location(
Bukkit.getServer().getWorld(Util.getWorldName(finalArgWid)),
0,
0,
0);
Bukkit.getServer().getWorld(Util.getWorldName(finalArgWid)), 0,
0, 0);
}
boolean verbose = false;
if (noisy == 1) {
verbose = true;
}
String users = "";
for (String value : rollbackusers2) {
if (users.length() == 0) {
users = "" + value + "";
} else {
users = users + ", " + value;
}
}
if (users.equals("#global") && restrictWorld) {
// chat output only, don't pass into any functions
users = "#"
+ location.getWorld().getName();
users = "#" + location.getWorld().getName();
}
if (finalPreview == 2) {
Chat.sendMessage(
player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.PREVIEW_CANCELLING));
Chat.sendMessage(player2, Color.DARK_AQUA + "CoreProtect " + Color.WHITE
+ "- " + Phrase.build(Phrase.PREVIEW_CANCELLING));
} else if (finalPreview == 1) {
Chat.sendMessage(
player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_STARTED,
users,
Selector.THIRD));
Chat.sendMessage(player2, Color.DARK_AQUA + "CoreProtect " + Color.WHITE
+ "- "
+ Phrase.build(Phrase.ROLLBACK_STARTED, users, Selector.THIRD));
} else if (action == 0) {
Chat.sendMessage(
player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_STARTED,
users,
Selector.FIRST));
Chat.sendMessage(player2, Color.DARK_AQUA + "CoreProtect " + Color.WHITE
+ "- "
+ Phrase.build(Phrase.ROLLBACK_STARTED, users, Selector.FIRST));
} else {
Chat.sendMessage(
player2,
Chat.sendMessage(player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_STARTED,
users,
+ Phrase.build(Phrase.ROLLBACK_STARTED, users,
Selector.SECOND));
}
if (finalArgAction.contains(5)) {
ContainerRollback.performContainerRollbackRestore(
statement,
player2,
uuidList,
rollbackusers2,
rtime,
blist,
elist,
euserlist,
finalArgAction,
location,
radius,
finalTimeStart,
finalTimeEnd,
restrictWorld,
false,
verbose,
action);
ContainerRollback.performContainerRollbackRestore(statement, player2,
uuidList, rollbackusers2, rtime, blist, elist, euserlist,
finalArgAction, location, radius, finalTimeStart, finalTimeEnd,
restrictWorld, false, verbose, action);
} else {
Rollback.performRollbackRestore(
statement,
player2,
uuidList,
rollbackusers2,
rtime,
blist,
elist,
euserlist,
finalArgAction,
location,
radius,
finalTimeStart,
finalTimeEnd,
restrictWorld,
false,
verbose,
action,
finalPreview);
Rollback.performRollbackRestore(statement, player2, uuidList,
rollbackusers2, rtime, blist, elist, euserlist, finalArgAction,
location, radius, finalTimeStart, finalTimeEnd, restrictWorld,
false, verbose, action, finalPreview);
}
if (finalPreview < 2) {
List<Object> list = new ArrayList<>();
list.add(finalTimeStart);
list.add(finalTimeEnd);
list.add(finalArgs);
list.add(locationFinal);
ConfigHandler.lastRollback.put(player2.getName(), list);
}
} else {
Chat.sendMessage(
player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.USER_NOT_FOUND, baduser));
Chat.sendMessage(player2, Color.DARK_AQUA + "CoreProtect " + Color.WHITE
+ "- " + Phrase.build(Phrase.USER_NOT_FOUND, baduser));
}
statement.close();
} else {
Chat.sendMessage(
player2,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player2, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.DATABASE_BUSY));
}
} catch (Exception e) {
e.printStackTrace();
}
if (ConfigHandler.activeRollbacks.get(player2.getName()) != null) {
ConfigHandler.activeRollbacks.remove(player2.getName());
}
ConfigHandler.lookupThrottle.put(
player2.getName(), new Object[] {false, System.currentTimeMillis()});
ConfigHandler.lookupThrottle.put(player2.getName(),
new Object[]
{ false, System.currentTimeMillis() });
}
}
Runnable runnable = new BasicThread2();
Thread thread = new Thread(runnable);
thread.start();
} catch (Exception e) {
e.printStackTrace();
}
} else {
if (finalAction == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_LOOKUP_TIME, Selector.SECOND));
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_LOOKUP_TIME, Selector.THIRD));
}
}
} else {
if (finalAction == 0) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ROLLBACK_RADIUS, Selector.FIRST)); // rollback
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_ROLLBACK_RADIUS, Selector.SECOND)); // restore
}
}
} else {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
}
}
}
@@ -18,205 +18,234 @@ import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
public class StatusCommand {
private static ConcurrentHashMap<String, Boolean> alert = new ConcurrentHashMap<>();
protected static void runCommand(CommandSender player, boolean permission, String[] args) {
if (!permission) {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
return;
}
class BasicThread implements Runnable {
@Override
public void run() {
try {
CoreProtect instance = CoreProtect.getInstance();
PluginDescriptionFile pdfFile = instance.getDescription();
String versionCheck = "";
if (Config.getGlobal().CHECK_UPDATES) {
String latestVersion = NetworkHandler.latestVersion();
if (latestVersion != null) {
versionCheck = " (" + Phrase.build(Phrase.LATEST_VERSION, "v" + latestVersion) + ")";
}
}
Chat.sendMessage(
player,
}
Chat.sendMessage(player,
Color.WHITE + "----- " + Color.DARK_AQUA + "CoreProtect"
+ (Util.isCommunityEdition() ? " " + ConfigHandler.COMMUNITY_EDITION : "")
+ Color.WHITE + " -----");
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_VERSION,
Color.WHITE,
+ Phrase.build(Phrase.STATUS_VERSION, Color.WHITE,
ConfigHandler.EDITION_NAME + " v" + pdfFile.getVersion() + ".")
+ versionCheck);
String donationKey = NetworkHandler.donationKey();
if (donationKey != null) {
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_LICENSE,
Color.WHITE,
Phrase.build(Phrase.VALID_DONATION_KEY))
+ " (" + donationKey + ")");
Chat.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.STATUS_LICENSE, Color.WHITE,
Phrase.build(Phrase.VALID_DONATION_KEY)) + " (" + donationKey + ")");
} else {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_LICENSE,
Color.WHITE,
+ Phrase.build(Phrase.STATUS_LICENSE, Color.WHITE,
Phrase.build(Phrase.INVALID_DONATION_KEY))
+ Color.GREY + Color.ITALIC + " (" + Phrase.build(Phrase.CHECK_CONFIG) + ")");
}
/*
Items processed (since server start)
Items processed (last 60 minutes)
* Items processed (since server start) Items processed (last 60 minutes)
*/
// Using MySQL/SQLite (Database Size: 587MB)
String firstVersion = Patch.getFirstVersion();
if (firstVersion.length() > 0) {
firstVersion = " (" + Phrase.build(Phrase.FIRST_VERSION, firstVersion) + ")";
}
if (Config.getGlobal().MYSQL) {
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_DATABASE, Color.WHITE, "MySQL")
+ firstVersion);
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_DATABASE, Color.WHITE, "MySQL") + firstVersion);
} else {
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_DATABASE, Color.WHITE, "SQLite")
+ firstVersion);
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_DATABASE, Color.WHITE, "SQLite") + firstVersion);
}
if (ConfigHandler.worldeditEnabled) {
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_INTEGRATION, Color.WHITE, "WorldEdit", Selector.FIRST));
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_INTEGRATION, Color.WHITE, "WorldEdit", Selector.FIRST));
} else if (instance.getServer().getPluginManager().getPlugin("WorldEdit") != null) {
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_INTEGRATION, Color.WHITE, "WorldEdit", Selector.SECOND));
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.STATUS_INTEGRATION, Color.WHITE, "WorldEdit", Selector.SECOND));
}
try {
int consumerCount = 0;
int currentConsumerSize = Process.getCurrentConsumerSize();
if (currentConsumerSize == 0) {
consumerCount = Consumer.getConsumerSize(0) + Consumer.getConsumerSize(1);
} else {
int consumerId = (Consumer.currentConsumer == 1) ? 1 : 0;
consumerCount = Consumer.getConsumerSize(consumerId) + currentConsumerSize;
}
if (consumerCount >= 1 && (player instanceof Player)) {
if (Config.getConfig(((Player) player).getWorld()).PLAYER_COMMANDS) {
consumerCount = consumerCount - 1;
}
}
Chat.sendMessage(
player,
Color.DARK_AQUA
+ Phrase.build(
Phrase.STATUS_CONSUMER,
Color.WHITE,
}
Chat.sendMessage(player,
Color.DARK_AQUA + Phrase.build(Phrase.STATUS_CONSUMER, Color.WHITE,
String.format("%,d", consumerCount),
(consumerCount == 1 ? Selector.FIRST : Selector.SECOND)));
} catch (Exception e) {
e.printStackTrace();
}
try {
String cpuInfo = "";
if (ConfigHandler.processorInfo != null) {
String modelName = ConfigHandler.processorInfo
.getProcessorIdentifier()
.getName();
String modelName = ConfigHandler.processorInfo.getProcessorIdentifier().getName();
if (modelName.contains(" CPU")) {
String[] split = modelName.split(" CPU")[0].split(" ");
modelName = split[split.length - 1];
} else if (modelName.contains(" Processor")) {
String[] split = modelName.split(" Processor")[0].split(" ");
modelName = split[split.length - 1];
}
String cpuSpeed = String.valueOf(ConfigHandler.processorInfo.getMaxFreq());
cpuSpeed = String.format("%.2f", Long.valueOf(cpuSpeed) / 1000000000.0);
cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " " + cpuSpeed + "GHz "
+ modelName + ".";
} else {
cpuInfo = "x" + Runtime.getRuntime().availableProcessors() + " "
+ Phrase.build(Phrase.CPU_CORES);
}
int mb = 1024 * 1024;
Runtime runtime = Runtime.getRuntime();
String usedRAM = String.format(
"%.2f", Double.valueOf((runtime.totalMemory() - runtime.freeMemory()) / mb) / 1000.0);
String usedRAM = String.format("%.2f",
Double.valueOf((runtime.totalMemory() - runtime.freeMemory()) / mb) / 1000.0);
String totalRAM = String.format("%.2f", Double.valueOf(runtime.maxMemory() / mb) / 1000.0);
String systemInformation = Phrase.build(Phrase.RAM_STATS, usedRAM, totalRAM);
if (cpuInfo.length() > 0) {
systemInformation = cpuInfo + " (" + systemInformation + ")";
}
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + Phrase.build(Phrase.STATUS_SYSTEM, Color.WHITE, systemInformation));
} catch (Exception e) {
e.printStackTrace();
}
// Functions.sendMessage(player, Color.DARK_AQUA + "Website: " + Color.WHITE +
// "www.coreprotect.net/updates/");
// Functions.sendMessage(player, Color.DARK_AQUA + Phrase.build(Phrase.LINK_DISCORD, Color.WHITE +
// Functions.sendMessage(player, Color.DARK_AQUA +
// Phrase.build(Phrase.LINK_DISCORD, Color.WHITE +
// "www.coreprotect.net/discord/").replaceFirst(":", ":" + Color.WHITE));
Chat.sendMessage(
player,
Color.DARK_AQUA
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.LINK_DISCORD, Color.WHITE, "www.coreprotect.net/discord/"));
Chat.sendMessage(
player,
Color.DARK_AQUA
Chat.sendMessage(player, Color.DARK_AQUA
+ Phrase.build(Phrase.LINK_PATREON, Color.WHITE, "www.patreon.com/coreprotect/"));
if (player.isOp() && alert.get(player.getName()) == null) {
alert.put(player.getName(), true);
if (instance.getServer().getPluginManager().getPlugin("CoreEdit") == null) {
Thread.sleep(500);
/*
Functions.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA + "Recommended Plugin " + Color.WHITE + "-----");
Functions.sendMessage(player, Color.DARK_AQUA + "Notice: " + Color.WHITE + "Enjoy CoreProtect? Check out CoreEdit!");
Functions.sendMessage(player, Color.DARK_AQUA + "Download: " + Color.WHITE + "www.coreedit.net/download/");
* Functions.sendMessage(player, Color.WHITE + "----- " + Color.DARK_AQUA +
* "Recommended Plugin " + Color.WHITE + "-----"); Functions.sendMessage(player,
* Color.DARK_AQUA + "Notice: " + Color.WHITE +
* "Enjoy CoreProtect? Check out CoreEdit!"); Functions.sendMessage(player,
* Color.DARK_AQUA + "Download: " + Color.WHITE + "www.coreedit.net/download/");
*/
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Runnable runnable = new BasicThread();
Thread thread = new Thread(runnable);
thread.start();
}
}
@@ -19,94 +19,97 @@ import org.bukkit.util.StringUtil;
public class TabHandler implements TabCompleter {
// private static String[] COMMANDS = new String[] { "help", "inspect", "rollback", "restore", "lookup", "purge",
// private static String[] COMMANDS = new String[] { "help", "inspect",
// "rollback", "restore", "lookup", "purge",
// "reload", "status", "near", "undo" }; // max 10!
private static String[] HELP = new String[] {
"inspect",
"rollback",
"restore",
"lookup",
"purge",
"teleport",
"status",
"params",
"users",
"time",
"radius",
"action",
"include",
"exclude"
};
private static String[] PARAMS =
new String[] {"user:", "time:", "radius:", "action:", "include:", "exclude:", "#container"};
private static String[] ACTIONS = new String[] {
"block",
"+block",
"-block",
"click",
"kill",
"+container",
"-container",
"container",
"chat",
"command",
"+inventory",
"-inventory",
"inventory",
"item",
"+item",
"-item",
"sign",
"session",
"+session",
"-session",
"username"
};
private static String[] HELP = new String[] { "inspect", "rollback", "restore", "lookup", "purge", "teleport",
"status", "params", "users", "time", "radius", "action", "include", "exclude" };
private static String[] PARAMS = new String[] { "user:", "time:", "radius:", "action:", "include:", "exclude:",
"#container" };
private static String[] ACTIONS = new String[] { "block", "+block", "-block", "click", "kill", "+container",
"-container", "container", "chat", "command", "+inventory", "-inventory", "inventory", "item", "+item",
"-item", "sign", "session", "+session", "-session", "username" };
private static String[] NUMBERS = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
private static String[] TIMES = new String[] { "w", "d", "h", "m", "s" };
private static ArrayList<String> materials = null;
@Override
public List<String> onTabComplete(CommandSender sender, Command cmd, String label, String[] args) {
if (!(sender instanceof Player) || args.length == 0) {
return null;
}
if (args.length == 1) {
String argument = args[0].toLowerCase(Locale.ROOT);
List<String> completions = new ArrayList<>();
if (sender.hasPermission("coreprotect.help")) {
completions.add("help");
}
if (sender.hasPermission("coreprotect.inspect")) {
completions.add("inspect");
}
if (sender.hasPermission("coreprotect.rollback")) {
completions.add("rollback");
}
if (sender.hasPermission("coreprotect.restore")) {
completions.add("restore");
}
if (sender.hasPermission("coreprotect.lookup")) {
completions.add("lookup");
}
if (sender.hasPermission("coreprotect.purge")) {
completions.add("purge");
}
if (sender.hasPermission("coreprotect.reload")) {
completions.add("reload");
}
if (sender.hasPermission("coreprotect.status")) {
completions.add("status");
}
if (sender.hasPermission("coreprotect.lookup.near")) {
completions.add("near");
}
if (sender.hasPermission("coreprotect.restore")) {
completions.add("undo");
}
return StringUtil.copyPartialMatches(argument, completions, new ArrayList<>(completions.size()));
} else if (args.length > 1) {
String argument0 = args[0].toLowerCase(Locale.ROOT);
String argument1 = args[1].toLowerCase(Locale.ROOT);
String currentArg = args[args.length - 1].toLowerCase(Locale.ROOT).trim();
@@ -126,416 +129,547 @@ public class TabHandler implements TabCompleter {
boolean pageLookup = false;
if (ConfigHandler.lookupType.get(sender.getName()) != null
&& ConfigHandler.lookupPage.get(sender.getName()) != null) {
&& ConfigHandler.lookupPage.get(sender.getName()) != null)
{
pageLookup = true;
}
for (int i = 1; i < args.length; i++) {
String arg = args[i].toLowerCase(Locale.ROOT);
if (arg.equals("#container")) {
hasContainer = true;
} else if (arg.equals("#count") || arg.equals("#sum")) {
hasCount = true;
} else if (arg.equals("#preview")) {
hasPreview = true;
} else if ((!arg.contains(":") && !args[i - 1].contains(":") && args.length > (i + 1))
|| arg.contains("u:")
|| arg.contains("user:")
|| arg.contains("users:")
|| arg.contains("p:")) {
|| arg.contains("u:") || arg.contains("user:") || arg.contains("users:") || arg.contains("p:"))
{
hasUser = true;
} else if (arg.contains("page:")) {
hasPage = true;
} else if (arg.contains("a:") || arg.contains("action:")) {
hasAction = true;
} else if (arg.contains("i:")
|| arg.contains("include:")
|| arg.contains("item:")
|| arg.contains("items:")
|| arg.contains("b:")
|| arg.contains("block:")
|| arg.contains("blocks:")) {
} else if (arg.contains("i:") || arg.contains("include:") || arg.contains("item:")
|| arg.contains("items:") || arg.contains("b:") || arg.contains("block:")
|| arg.contains("blocks:"))
{
hasInclude = true;
} else if (arg.contains("t:") || arg.contains("time:")) {
hasTime = true;
} else if (arg.contains("e:") || arg.contains("exclude:")) {
hasExclude = true;
} else if (arg.contains("r:") || arg.contains("radius:")) {
hasRadius = true;
}
}
if (!hasContainer) {
if (ConfigHandler.lookupType.get(sender.getName()) != null) {
int lookupType = ConfigHandler.lookupType.get(sender.getName());
if (lookupType == 1) {
validContainer = true;
} else if (lookupType == 5) {
if (ConfigHandler.lookupUlist.get(sender.getName()).contains("#container")) {
validContainer = true;
}
}
}
}
if ((lastArg.equals("a:") || lastArg.equals("action:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore"))) {
}
}
}
if ((lastArg.equals("a:") || lastArg.equals("action:")) && (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback") || sender.hasPermission("coreprotect.restore")))
{
List<String> completions = new ArrayList<>(Arrays.asList(ACTIONS));
return StringUtil.copyPartialMatches(currentArg, completions, new ArrayList<>(completions.size()));
} else if ((currentArg.startsWith("a:") || currentArg.startsWith("action:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore"))) {
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore")))
{
String arg = "";
String[] split = currentArg.split(":", 2);
String filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
List<String> completions = new ArrayList<>(Arrays.asList(ACTIONS));
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + completions.get(index));
}
return StringUtil.copyPartialMatches(filter + arg, completions, new ArrayList<>(completions.size()));
} else if ((lastArg.equals("u:")
|| lastArg.equals("user:")
|| lastArg.equals("users:")
} else if ((lastArg.equals("u:") || lastArg.equals("user:") || lastArg.equals("users:")
|| lastArg.equals("p:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore"))) {
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore")))
{
return null;
} else if ((currentArg.startsWith("u:")
|| currentArg.startsWith("user:")
|| currentArg.startsWith("users:")
} else if ((currentArg.startsWith("u:") || currentArg.startsWith("user:") || currentArg.startsWith("users:")
|| currentArg.startsWith("p:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore"))) {
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore")))
{
String arg = "";
String[] split = currentArg.split(":", 2);
String filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
List<String> completions =
Bukkit.getOnlinePlayers().stream().map(Player::getName).collect(Collectors.toList());
List<String> completions = Bukkit.getOnlinePlayers().stream().map(Player::getName)
.collect(Collectors.toList());
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + completions.get(index));
}
return StringUtil.copyPartialMatches(filter + arg, completions, new ArrayList<>(completions.size()));
} else if ((lastArg.equals("t:")
|| lastArg.equals("time:")
|| currentArg.startsWith("t:")
} else if ((lastArg.equals("t:") || lastArg.equals("time:") || currentArg.startsWith("t:")
|| currentArg.startsWith("time:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore")
|| sender.hasPermission("coreprotect.purge"))) {
|| sender.hasPermission("coreprotect.purge")))
{
String filter = lastArg;
String arg = "";
if (currentArg.contains(":")) {
String[] split = currentArg.split(":", 2);
filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
} else {
filter = "";
arg = currentArg;
}
List<String> completions = new ArrayList<>();
if (arg.chars().allMatch(Character::isDigit)) {
boolean addNumbers = true;
if (currentArg.length() > 0) {
char lastChar = currentArg.charAt(currentArg.length() - 1);
if (Character.isDigit(lastChar)) {
completions.addAll(Arrays.asList(TIMES));
addNumbers = false;
}
}
if (addNumbers) {
completions.addAll(Arrays.asList(NUMBERS));
}
}
completions = new ArrayList<>(completions);
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + arg + completions.get(index));
}
return StringUtil.copyPartialMatches(filter + arg, completions, new ArrayList<>(completions.size()));
} else if ((lastArg.equals("page:") || currentArg.startsWith("page:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.lookup.near")
|| sender.hasPermission("coreprotect.inspect"))) {
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.lookup.near")
|| sender.hasPermission("coreprotect.inspect")))
{
String filter = lastArg;
String arg = "";
if (currentArg.contains(":")) {
String[] split = currentArg.split(":", 2);
filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
} else {
filter = "";
arg = currentArg;
}
if (arg.chars().allMatch(Character::isDigit)) {
List<String> completions = new ArrayList<>(Arrays.asList(NUMBERS));
if (arg.length() < 1) {
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + arg + completions.get(index));
}
if (arg.length() == 0) {
completions.remove(0);
}
}
return StringUtil.copyPartialMatches(
filter + arg, completions, new ArrayList<>(completions.size()));
return StringUtil.copyPartialMatches(filter + arg, completions,
new ArrayList<>(completions.size()));
}
} else if ((lastArg.equals("r:")
|| lastArg.equals("radius:")
|| currentArg.startsWith("r:")
} else if ((lastArg.equals("r:") || lastArg.equals("radius:") || currentArg.startsWith("r:")
|| currentArg.startsWith("radius:"))
&& (sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
&& (sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore")
|| sender.hasPermission("coreprotect.purge"))) {
|| sender.hasPermission("coreprotect.purge")))
{
String filter = lastArg;
String arg = "";
if (currentArg.contains(":")) {
String[] split = currentArg.split(":", 2);
filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
} else {
filter = "";
arg = currentArg;
}
if (!argument0.equals("purge") && arg.chars().allMatch(Character::isDigit)) {
List<String> completions = new ArrayList<>(Arrays.asList(NUMBERS));
if (arg.length() < 2) {
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + arg + completions.get(index));
}
}
return StringUtil.copyPartialMatches(
filter + arg, completions, new ArrayList<>(completions.size()));
return StringUtil.copyPartialMatches(filter + arg, completions,
new ArrayList<>(completions.size()));
} else if (argument0.equals("purge") || arg.startsWith("#")) {
ArrayList<String> params = new ArrayList<>();
params.add("#global");
if (!argument0.equals("purge")
&& sender.getServer().getPluginManager().getPlugin("WorldEdit") != null) {
&& sender.getServer().getPluginManager().getPlugin("WorldEdit") != null)
{
params.add("#worldedit");
}
List<World> worlds = sender.getServer().getWorlds();
for (World world : worlds) {
params.add("#" + world.getName());
}
List<String> completions = new ArrayList<>(params);
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + completions.get(index));
}
return StringUtil.copyPartialMatches(
filter + arg, completions, new ArrayList<>(completions.size()));
return StringUtil.copyPartialMatches(filter + arg, completions,
new ArrayList<>(completions.size()));
}
} else if ((sender.hasPermission("coreprotect.lookup")
|| sender.hasPermission("coreprotect.rollback")
} else if ((sender.hasPermission("coreprotect.lookup") || sender.hasPermission("coreprotect.rollback")
|| sender.hasPermission("coreprotect.restore"))
&& (lastArg.equals("i:")
|| lastArg.equals("include:")
|| lastArg.equals("item:")
|| lastArg.equals("items:")
|| lastArg.equals("b:")
|| lastArg.equals("block:")
|| lastArg.equals("blocks:")
|| currentArg.startsWith("i:")
|| currentArg.startsWith("include:")
|| currentArg.startsWith("item:")
|| currentArg.startsWith("items:")
|| currentArg.startsWith("b:")
|| currentArg.startsWith("block:")
|| currentArg.startsWith("blocks:")
|| lastArg.equals("e:")
|| lastArg.equals("exclude:")
|| currentArg.startsWith("e:")
|| currentArg.startsWith("exclude:"))) {
&& (lastArg.equals("i:") || lastArg.equals("include:") || lastArg.equals("item:")
|| lastArg.equals("items:") || lastArg.equals("b:") || lastArg.equals("block:")
|| lastArg.equals("blocks:") || currentArg.startsWith("i:")
|| currentArg.startsWith("include:") || currentArg.startsWith("item:")
|| currentArg.startsWith("items:") || currentArg.startsWith("b:")
|| currentArg.startsWith("block:") || currentArg.startsWith("blocks:")
|| lastArg.equals("e:") || lastArg.equals("exclude:") || currentArg.startsWith("e:")
|| currentArg.startsWith("exclude:")))
{
String filter = lastArg;
String arg = "";
if (currentArg.contains(":")) {
String[] split = currentArg.split(":", 2);
filter = split[0] + ":";
if (split.length > 1) {
arg = split[1];
}
} else {
filter = "";
arg = currentArg;
}
if (materials == null) {
List<Material> addList = Arrays.asList(Material.ARMOR_STAND);
List<Material> excludeList = Arrays.asList();
Set<String> materialList = new HashSet<>();
Material[] materialValues = Material.values();
for (Material material : materialValues) {
if (material.isBlock() || material.isItem()) {
materialList.add(material.name().toLowerCase(Locale.ROOT));
}
}
for (Material exclude : excludeList) {
materialList.remove(exclude.name().toLowerCase(Locale.ROOT));
}
for (Material add : addList) {
materialList.add(add.name().toLowerCase(Locale.ROOT));
}
// add custom tags
for (String tag : CommandHandler.getTags().keySet()) {
materialList.add(tag);
}
materials = new ArrayList<>(materialList);
}
List<String> completions = new ArrayList<>(materials);
for (int index = 0; index < completions.size(); index++) {
completions.set(index, filter + completions.get(index));
}
return StringUtil.copyPartialMatches(filter + arg, completions, new ArrayList<>(completions.size()));
} else if (args.length == 2) {
if (argument0.equals("help") && sender.hasPermission("coreprotect.help")) {
List<String> completions = new ArrayList<>(Arrays.asList(HELP));
return StringUtil.copyPartialMatches(argument1, completions, new ArrayList<>(completions.size()));
} else if (argument0.equals("purge") && sender.hasPermission("coreprotect.purge")) {
List<String> completions = new ArrayList<>(Arrays.asList("t:", "r:", "i:"));
return StringUtil.copyPartialMatches(argument1, completions, new ArrayList<>(completions.size()));
} else if ((sender.hasPermission("coreprotect.lookup")
&& (argument0.equals("l") || argument0.equals("lookup")))
|| (sender.hasPermission("coreprotect.rollback")
&& (argument0.equals("rollback") || argument0.equals("rb") || argument0.equals("ro")))
|| (sender.hasPermission("coreprotect.restore")
&& (argument0.equals("restore") || argument0.equals("rs") || argument0.equals("re")))) {
List<String> completions = new ArrayList<>(filterParams(
true,
argument0,
argument1,
hasUser,
hasAction,
hasInclude,
hasExclude,
hasRadius,
hasTime,
hasContainer,
hasCount,
hasPreview,
pageLookup,
validContainer));
&& (argument0.equals("restore") || argument0.equals("rs") || argument0.equals("re"))))
{
List<String> completions = new ArrayList<>(filterParams(true, argument0, argument1, hasUser,
hasAction, hasInclude, hasExclude, hasRadius, hasTime, hasContainer, hasCount, hasPreview,
pageLookup, validContainer));
completions.addAll(Bukkit.getOnlinePlayers().stream()
.filter(player ->
player.getName().toLowerCase(Locale.ROOT).startsWith(argument1))
.map(Player::getName)
.collect(Collectors.toList()));
.filter(player -> player.getName().toLowerCase(Locale.ROOT).startsWith(argument1))
.map(Player::getName).collect(Collectors.toList()));
return StringUtil.copyPartialMatches(argument1, completions, new ArrayList<>(completions.size()));
}
} else if (args.length == 3 && argument0.equals("purge") && sender.hasPermission("coreprotect.purge")) {
if (argument1.startsWith("t:")) {
List<String> completions = new ArrayList<>(Arrays.asList("r:", "i:"));
return StringUtil.copyPartialMatches(
args[2].toLowerCase(Locale.ROOT), completions, new ArrayList<>(completions.size()));
return StringUtil.copyPartialMatches(args[2].toLowerCase(Locale.ROOT), completions,
new ArrayList<>(completions.size()));
} else if (argument1.startsWith("r:") || argument1.startsWith("i:")) {
List<String> completions = new ArrayList<>(Arrays.asList("t:"));
return StringUtil.copyPartialMatches(
args[2].toLowerCase(Locale.ROOT), completions, new ArrayList<>(completions.size()));
return StringUtil.copyPartialMatches(args[2].toLowerCase(Locale.ROOT), completions,
new ArrayList<>(completions.size()));
}
return Arrays.asList("");
} else if ((sender.hasPermission("coreprotect.lookup")
&& (argument0.equals("l") || argument0.equals("lookup")))
|| (sender.hasPermission("coreprotect.rollback")
&& (argument0.equals("rollback") || argument0.equals("rb") || argument0.equals("ro")))
|| (sender.hasPermission("coreprotect.restore")
&& (argument0.equals("restore") || argument0.equals("rs") || argument0.equals("re")))) {
&& (argument0.equals("restore") || argument0.equals("rs") || argument0.equals("re"))))
{
if ((!argument0.equals("l") && !argument0.equals("lookup")) || !hasPage) {
ArrayList<String> params = filterParams(
false,
argument0,
currentArg,
hasUser,
hasAction,
hasInclude,
hasExclude,
hasRadius,
hasTime,
hasContainer,
hasCount,
hasPreview,
pageLookup,
ArrayList<String> params = filterParams(false, argument0, currentArg, hasUser, hasAction,
hasInclude, hasExclude, hasRadius, hasTime, hasContainer, hasCount, hasPreview, pageLookup,
validContainer);
List<String> completions = new ArrayList<>(params);
return StringUtil.copyPartialMatches(currentArg, completions, new ArrayList<>(completions.size()));
}
}
}
return Arrays.asList("");
}
private ArrayList<String> filterParams(
boolean firstParam,
String lastArgument,
String argument,
boolean hasUser,
boolean hasAction,
boolean hasInclude,
boolean hasExclude,
boolean hasRadius,
boolean hasTime,
boolean hasContainer,
boolean hasCount,
boolean hasPreview,
boolean pageLookup,
boolean validContainer) {
private ArrayList<String> filterParams(boolean firstParam, String lastArgument, String argument, boolean hasUser,
boolean hasAction, boolean hasInclude, boolean hasExclude, boolean hasRadius, boolean hasTime,
boolean hasContainer, boolean hasCount, boolean hasPreview, boolean pageLookup, boolean validContainer)
{
ArrayList<String> params = new ArrayList<>();
for (String param : PARAMS) {
if (param.equals("user:") && !hasUser) {
params.add(param);
} else if (param.equals("action:") && !hasAction) {
params.add(param);
} else if (param.equals("include:") && !hasInclude) {
params.add(param);
} else if (param.equals("exclude:") && !hasExclude) {
params.add(param);
} else if (param.equals("radius:") && !hasRadius) {
params.add(param);
} else if (param.equals("time:") && !hasTime) {
params.add(param);
} else if (param.equals("#container") && !hasContainer && !hasRadius && validContainer) {
params.add(param);
}
}
if (firstParam && pageLookup && (lastArgument.equals("l") || lastArgument.equals("lookup"))) {
params.add("page:");
} else if (!firstParam && argument.startsWith("#")) {
if (!hasCount) {
params.add("#count");
}
if (!hasPreview) {
params.add("#preview");
}
}
return params;
}
}
@@ -18,50 +18,61 @@ import org.bukkit.entity.Player;
public class TeleportCommand {
protected static void runCommand(CommandSender player, boolean permission, String[] args) {
int resultc = args.length;
if (!permission) {
Chat.sendMessage(
player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.NO_PERMISSION));
return;
}
if (!(player instanceof Player)) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.TELEPORT_PLAYERS));
return;
}
if (ConfigHandler.teleportThrottle.get(player.getName()) != null) {
Object[] lookupThrottle = ConfigHandler.teleportThrottle.get(player.getName());
if ((boolean) lookupThrottle[0] || ((System.currentTimeMillis() - (long) lookupThrottle[1])) < 500) {
Chat.sendMessage(
player,
Chat.sendMessage(player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.COMMAND_THROTTLED));
return;
}
}
if (resultc < 3) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_PARAMETERS, "/co teleport <world> <x> <y> <z>"));
return;
}
String worldName = args[1];
int wid = Util.matchWorld(worldName);
if (wid == -1 && resultc >= 5) {
Chat.sendMessage(player, new ChatMessage(Phrase.build(Phrase.WORLD_NOT_FOUND, worldName)).build());
return;
}
Location location = ((Player) player).getLocation().clone();
World world = location.getWorld();
if (wid > -1) {
world = Bukkit.getServer().getWorld(Util.getWorldName(wid));
}
String x = null;
@@ -69,25 +80,40 @@ public class TeleportCommand {
String z = null;
for (int i = 1; i < args.length; i++) {
if (i == 1 && wid > -1) {
continue;
}
if (x == null) {
x = args[i].replaceAll("[^0-9.\\-]", "");
} else if (z == null) {
z = args[i].replaceAll("[^0-9.\\-]", "");
} else if (y == null) {
y = z;
z = args[i].replaceAll("[^0-9.\\-]", "");
}
}
if (y == null) {
if (location.getBlockY() > 63) {
location.setY(63);
}
y = Double.toString(location.getY());
}
String xValidate = x.replaceAll("[^.\\-]", "");
@@ -96,12 +122,13 @@ public class TeleportCommand {
if ((x.length() == 0 || x.length() >= 12 || x.equals(xValidate))
|| (y.length() == 0 || y.length() >= 12 || y.equals(yValidate))
|| (z.length() == 0 || z.length() >= 12 || z.equals(zValidate))) {
Chat.sendMessage(
player,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
|| (z.length() == 0 || z.length() >= 12 || z.equals(zValidate)))
{
Chat.sendMessage(player, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.MISSING_PARAMETERS, "/co teleport <world> <x> <y> <z>"));
return;
}
location.setWorld(world);
@@ -111,18 +138,21 @@ public class TeleportCommand {
int chunkX = location.getBlockX() >> 4;
int chunkZ = location.getBlockZ() >> 4;
Scheduler.runTask(
CoreProtect.getInstance(),
() -> {
Scheduler.runTask(CoreProtect.getInstance(), () -> {
if (!location.getWorld().isChunkLoaded(chunkX, chunkZ)) {
location.getWorld().getChunkAt(location);
}
// Teleport the player to a safe location
Teleport.performSafeTeleport(((Player) player), location, true);
},
location);
}, location);
ConfigHandler.teleportThrottle.put(player.getName(), new Object[] { false, System.currentTimeMillis() });
}
}
@@ -11,40 +11,64 @@ import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
public class UndoCommand {
protected static void runCommand(CommandSender user, Command command, boolean permission, String[] args) {
try {
if (ConfigHandler.lastRollback.get(user.getName()) != null) {
List<Object> list = ConfigHandler.lastRollback.get(user.getName());
long startTime = (Long) list.get(0);
long endTime = (Long) list.get(1);
args = (String[]) list.get(2);
Location location = (Location) list.get(3);
for (String arg : args) {
if (arg.equals("#preview")) {
CancelCommand.runCommand(user, command, permission, args);
return;
}
}
boolean valid = true;
if (args[0].equals("rollback") || args[0].equals("rb") || args[0].equals("ro")) {
args[0] = "restore";
} else if (args[0].equals("restore") || args[0].equals("rs") || args[0].equals("re")) {
args[0] = "rollback";
} else {
valid = false;
}
if (valid) {
ConfigHandler.lastRollback.remove(user.getName());
RollbackRestoreCommand.runCommand(user, command, permission, args, location, startTime, endTime);
}
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_ROLLBACK, Selector.SECOND));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -12,16 +12,20 @@ import org.bukkit.entity.Player;
public class WorldEditHandler {
protected static Integer[] runWorldEditCommand(CommandSender user) {
Integer[] result = null;
try {
WorldEditPlugin worldEdit = WorldEditLogger.getWorldEdit(user.getServer());
if (worldEdit != null && user instanceof Player) {
LocalSession session = worldEdit.getSession((Player) user);
World world = session.getSelectionWorld();
if (world != null) {
Region region = session.getSelection(world);
if (region != null
&& world.getName().equals(((Player) user).getWorld().getName())) {
if (region != null && world.getName().equals(((Player) user).getWorld().getName())) {
BlockVector3 block = region.getMinimumPoint();
int x = block.x();
int y = block.y();
@@ -31,11 +35,17 @@ public class WorldEditHandler {
int length = region.getLength();
int max = width;
if (height > max) {
max = height;
}
if (length > max) {
max = length;
}
int xMin = x;
int xMax = x + (width - 1);
int yMin = y;
@@ -43,12 +53,21 @@ public class WorldEditHandler {
int zMin = z;
int zMax = z + (length - 1);
result = new Integer[] { max, xMin, xMax, yMin, yMax, zMin, zMax, 1 };
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
+213 -146
View File
@@ -1,30 +1,29 @@
package net.coreprotect.config;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.Bukkit;
import org.bukkit.World;
import net.coreprotect.CoreProtect;
import net.coreprotect.language.Language;
import net.coreprotect.thread.Scheduler;
import org.bukkit.Bukkit;
import org.bukkit.World;
public class Config extends Language {
private static final Map<String, String[]> HEADERS = new HashMap<>();
private static final Map<String, String> DEFAULT_VALUES = new LinkedHashMap<>();
private static final Map<String, Config> CONFIG_BY_WORLD_NAME = new HashMap<>();
private static final String DEFAULT_FILE_HEADER = "# CoreProtect Config";
public static final String LINE_SEPARATOR = "\n";
private static final Config GLOBAL = new Config();
@@ -91,6 +90,7 @@ public class Config extends Language {
public int MAX_RADIUS;
static {
DEFAULT_VALUES.put("donation-key", "");
DEFAULT_VALUES.put("use-mysql", "false");
DEFAULT_VALUES.put("table-prefix", "co_");
@@ -140,112 +140,118 @@ public class Config extends Language {
DEFAULT_VALUES.put("username-changes", "true");
DEFAULT_VALUES.put("worldedit", "true");
HEADERS.put(
"donation-key",
new String[] {"# CoreProtect is donationware. Obtain a donation key from coreprotect.net/donate/"});
HEADERS.put("use-mysql", new String[] {
"# MySQL is optional and not required.",
"# If you prefer to use MySQL, enable the following and fill out the fields."
});
HEADERS.put("language", new String[] {
"# If modified, will automatically attempt to translate languages phrases.",
"# List of language codes: https://coreprotect.net/languages/"
});
HEADERS.put("check-updates", new String[] {
"# If enabled, CoreProtect will check for updates when your server starts up.",
"# If an update is available, you'll be notified via your server console.",
});
HEADERS.put("api-enabled", new String[] {
"# If enabled, other plugins will be able to utilize the CoreProtect API.",
});
HEADERS.put("verbose", new String[] {
"# If enabled, extra data is displayed during rollbacks and restores.",
"# Can be manually triggered by adding \"#verbose\" to your rollback command."
});
HEADERS.put("default-radius", new String[] {
"# If no radius is specified in a rollback or restore, this value will be",
"# used as the radius. Set to \"0\" to disable automatically adding a radius."
});
HEADERS.put("max-radius", new String[] {
"# The maximum radius that can be used in a command. Set to \"0\" to disable.",
"# To run a rollback or restore without a radius, you can use \"r:#global\"."
});
HEADERS.put(
"rollback-items",
new String[] {"# If enabled, items taken from containers (etc) will be included in rollbacks."});
HEADERS.put(
"rollback-entities",
new String[] {"# If enabled, entities, such as killed animals, will be included in rollbacks."});
HEADERS.put(
"skip-generic-data",
new String[] {"# If enabled, generic data, like zombies burning in daylight, won't be logged."});
HEADERS.put("donation-key",
new String[]
{ "# CoreProtect is donationware. Obtain a donation key from coreprotect.net/donate/" });
HEADERS.put("use-mysql",
new String[]
{ "# MySQL is optional and not required.",
"# If you prefer to use MySQL, enable the following and fill out the fields." });
HEADERS.put("language",
new String[]
{ "# If modified, will automatically attempt to translate languages phrases.",
"# List of language codes: https://coreprotect.net/languages/" });
HEADERS.put("check-updates",
new String[]
{ "# If enabled, CoreProtect will check for updates when your server starts up.",
"# If an update is available, you'll be notified via your server console.", });
HEADERS.put("api-enabled",
new String[]
{ "# If enabled, other plugins will be able to utilize the CoreProtect API.", });
HEADERS.put("verbose",
new String[]
{ "# If enabled, extra data is displayed during rollbacks and restores.",
"# Can be manually triggered by adding \"#verbose\" to your rollback command." });
HEADERS.put("default-radius",
new String[]
{ "# If no radius is specified in a rollback or restore, this value will be",
"# used as the radius. Set to \"0\" to disable automatically adding a radius." });
HEADERS.put("max-radius",
new String[]
{ "# The maximum radius that can be used in a command. Set to \"0\" to disable.",
"# To run a rollback or restore without a radius, you can use \"r:#global\"." });
HEADERS.put("rollback-items",
new String[]
{ "# If enabled, items taken from containers (etc) will be included in rollbacks." });
HEADERS.put("rollback-entities",
new String[]
{ "# If enabled, entities, such as killed animals, will be included in rollbacks." });
HEADERS.put("skip-generic-data",
new String[]
{ "# If enabled, generic data, like zombies burning in daylight, won't be logged." });
HEADERS.put("block-place", new String[] { "# Logs blocks placed by players." });
HEADERS.put("block-break", new String[] { "# Logs blocks broken by players." });
HEADERS.put("natural-break", new String[] {
"# Logs blocks that break off of other blocks; for example, a sign or torch",
HEADERS.put("natural-break",
new String[]
{ "# Logs blocks that break off of other blocks; for example, a sign or torch",
"# falling off of a dirt block that a player breaks. This is required for",
"# beds/doors to properly rollback."
});
HEADERS.put(
"block-movement", new String[] {"# Properly track block movement, such as sand or gravel falling."});
"# beds/doors to properly rollback." });
HEADERS.put("block-movement",
new String[]
{ "# Properly track block movement, such as sand or gravel falling." });
HEADERS.put("pistons", new String[] { "# Properly track blocks moved by pistons." });
HEADERS.put("block-burn", new String[] { "# Logs blocks that burn up in a fire." });
HEADERS.put(
"block-ignite", new String[] {"# Logs when a block naturally ignites, such as from fire spreading."});
HEADERS.put("block-ignite",
new String[]
{ "# Logs when a block naturally ignites, such as from fire spreading." });
HEADERS.put("explosions", new String[] { "# Logs explosions, such as TNT and Creepers." });
HEADERS.put(
"entity-change",
new String[] {"# Track when an entity changes a block, such as an Enderman destroying blocks."});
HEADERS.put("entity-change",
new String[]
{ "# Track when an entity changes a block, such as an Enderman destroying blocks." });
HEADERS.put("entity-kills", new String[] { "# Logs killed entities, such as killed cows and enderman." });
HEADERS.put(
"sign-text", new String[] {"# Logs text on signs. If disabled, signs will be blank when rolled back."});
HEADERS.put(
"buckets",
new String[] {"# Logs lava and water sources placed/removed by players who are using buckets."});
HEADERS.put("sign-text",
new String[]
{ "# Logs text on signs. If disabled, signs will be blank when rolled back." });
HEADERS.put("buckets",
new String[]
{ "# Logs lava and water sources placed/removed by players who are using buckets." });
HEADERS.put("leaf-decay", new String[] { "# Logs natural tree leaf decay." });
HEADERS.put(
"tree-growth",
new String[] {"# Logs tree growth. Trees are linked to the player who planted the sapling."});
HEADERS.put("tree-growth",
new String[]
{ "# Logs tree growth. Trees are linked to the player who planted the sapling." });
HEADERS.put("mushroom-growth", new String[] { "# Logs mushroom growth." });
HEADERS.put("vine-growth", new String[] { "# Logs natural vine growth." });
HEADERS.put("sculk-spread", new String[] { "# Logs the spread of sculk blocks from sculk catalysts." });
HEADERS.put("portals", new String[] { "# Logs when portals such as Nether portals generate naturally." });
HEADERS.put("water-flow", new String[] {
"# Logs water flow. If water destroys other blocks, such as torches,",
"# this allows it to be properly rolled back."
});
HEADERS.put("lava-flow", new String[] {
"# Logs lava flow. If lava destroys other blocks, such as torches,",
"# this allows it to be properly rolled back."
});
HEADERS.put("liquid-tracking", new String[] {
"# Allows liquid to be properly tracked and linked to players.",
HEADERS.put("water-flow",
new String[]
{ "# Logs water flow. If water destroys other blocks, such as torches,",
"# this allows it to be properly rolled back." });
HEADERS.put("lava-flow",
new String[]
{ "# Logs lava flow. If lava destroys other blocks, such as torches,",
"# this allows it to be properly rolled back." });
HEADERS.put("liquid-tracking",
new String[]
{ "# Allows liquid to be properly tracked and linked to players.",
"# For example, if a player places water which flows and destroys torches,",
"# it can all be properly restored by rolling back that single player."
});
HEADERS.put("item-transactions", new String[] {
"# Track item transactions, such as when a player takes items from", "# a chest, furnace, or dispenser."
});
"# it can all be properly restored by rolling back that single player." });
HEADERS.put("item-transactions",
new String[]
{ "# Track item transactions, such as when a player takes items from",
"# a chest, furnace, or dispenser." });
HEADERS.put("item-drops", new String[] { "# Logs items dropped by players." });
HEADERS.put("item-pickups", new String[] { "# Logs items picked up by players." });
HEADERS.put("hopper-transactions", new String[] {
"# Track all hopper transactions, such as when a hopper removes items from a",
"# chest, furnace, or dispenser."
});
HEADERS.put("player-interactions", new String[] {
"# Track player interactions, such as when a player opens a door, presses",
"# a button, or opens a chest. Player interactions can't be rolled back."
});
HEADERS.put("hopper-transactions",
new String[]
{ "# Track all hopper transactions, such as when a hopper removes items from a",
"# chest, furnace, or dispenser." });
HEADERS.put("player-interactions",
new String[]
{ "# Track player interactions, such as when a player opens a door, presses",
"# a button, or opens a chest. Player interactions can't be rolled back." });
HEADERS.put("player-messages", new String[] { "# Logs messages that players send in the chat." });
HEADERS.put("player-commands", new String[] { "# Logs all commands used by players." });
HEADERS.put("player-sessions", new String[] { "# Logs the logins and logouts of players." });
HEADERS.put("username-changes", new String[] { "# Logs when a player changes their Minecraft username." });
HEADERS.put(
"worldedit",
new String[] {"# Logs changes made via the plugin \"WorldEdit\" if it's in use on your server."});
HEADERS.put("worldedit",
new String[]
{ "# Logs changes made via the plugin \"WorldEdit\" if it's in use on your server." });
}
private void readValues() {
this.ENABLE_SSL = this.getBoolean("enable-ssl", false);
this.DISABLE_WAL = this.getBoolean("disable-wal", false);
this.HOVER_EVENTS = this.getBoolean("hover-events", true);
@@ -304,95 +310,140 @@ public class Config extends Language {
this.PLAYER_SESSIONS = this.getBoolean("player-sessions");
this.USERNAME_CHANGES = this.getBoolean("username-changes");
this.WORLDEDIT = this.getBoolean("worldedit");
}
public static void init() throws IOException {
parseConfig(loadFiles(ConfigFile.CONFIG));
// pass variables to ConfigFile.parseConfig(ConfigFile.loadFiles());
}
public static Config getGlobal() {
return GLOBAL;
}
// returns a world specific config if it exists, otherwise the global config
public static Config getConfig(final World world) {
return getConfig(world.getName());
}
public static Config getConfig(final String worldName) {
Config ret = CONFIG_BY_WORLD_NAME.get(worldName);
if (ret == null) {
ret = CONFIG_BY_WORLD_NAME.getOrDefault(worldName, GLOBAL);
CONFIG_BY_WORLD_NAME.put(worldName, ret);
}
return ret;
}
public Config() {
this.config = new LinkedHashMap<>();
}
public void setDefaults(final Config defaults) {
this.defaults = defaults;
}
private String get(final String key, final String dfl) {
String configured = this.config.get(key);
if (configured == null) {
if (dfl != null) {
return dfl;
}
if (this.defaults == null) {
configured = DEFAULT_VALUES.get(key);
} else {
configured = this.defaults.config.getOrDefault(key, DEFAULT_VALUES.get(key));
}
}
return configured;
}
private boolean getBoolean(final String key) {
final String configured = this.get(key, null);
return configured != null && configured.startsWith("t");
return configured != null && StringUtils.startsWith(configured, "t");
}
private boolean getBoolean(final String key, final boolean dfl) {
final String configured = this.get(key, null);
return configured == null ? dfl : configured.startsWith("t");
return configured == null ? dfl : StringUtils.startsWith(configured, "t");
}
private int getInt(final String key) {
return this.getInt(key, 0);
}
private int getInt(final String key, final int dfl) {
String configured = this.get(key, null);
if (configured == null) {
return dfl;
}
configured = configured.replaceAll("[^0-9]", "");
return configured.isEmpty() ? dfl : Integer.parseInt(configured);
return StringUtils.isEmpty(configured) ? dfl : Integer.parseInt(configured);
}
private String getString(final String key) {
final String configured = this.get(key, null);
return configured == null ? "" : configured;
}
public void clearConfig() {
this.config.clear();
}
public void loadDefaults() {
this.clearConfig();
this.readValues();
}
public void load(final InputStream in) throws IOException {
// if we fail reading, we will not corrupt our current config.
final Map<String, String> newConfig = new LinkedHashMap<>(this.config.size());
ConfigFile.load(in, newConfig, false);
@@ -401,68 +452,99 @@ public class Config extends Language {
this.config.putAll(newConfig);
this.readValues();
}
private static Map<String, byte[]> loadFiles(String fileName) throws IOException {
final CoreProtect plugin = CoreProtect.getInstance();
final File configFolder = plugin.getDataFolder();
if (!configFolder.exists()) {
configFolder.mkdirs();
}
final Map<String, byte[]> map = new HashMap<>();
final File globalFile = new File(configFolder, fileName);
if (globalFile.exists()) {
// we always add options to the global config
final byte[] data = Files.readAllBytes(globalFile.toPath());
map.put("config", data);
if (!globalFile.exists() || globalFile.length() == 0) {
try (final InputStream in = plugin.getResource(fileName)) {
if (in == null) {
throw new IOException("Missing bundled resource: " + fileName);
// can't modify GLOBAL, we're likely off-main here
final Config temp = new Config();
temp.load(new ByteArrayInputStream(data));
temp.addMissingOptions(globalFile);
} else {
final Config temp = new Config();
temp.loadDefaults();
temp.addMissingOptions(globalFile);
}
for (final File worldConfigFile :
configFolder.listFiles((File file) -> file.getName().endsWith(".yml"))) {
Files.copy(in, globalFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
}
map.put("config", Files.readAllBytes(globalFile.toPath()));
final File[] files = configFolder.listFiles((File file) -> StringUtils.endsWith(file.getName(), ".yml"));
if (files != null) {
for (final File worldConfigFile : files) {
final String name = worldConfigFile.getName();
if (name.equals(ConfigFile.CONFIG) || name.equals(ConfigFile.LANGUAGE)) {
continue;
}
map.put(StringUtils.substring(name, 0, name.length() - ".yml".length()),
Files.readAllBytes(worldConfigFile.toPath()));
}
map.put(name.substring(0, name.length() - ".yml".length()), Files.readAllBytes(worldConfigFile.toPath()));
}
return map;
}
// this should only be called on the main thread
private static void parseConfig(final Map<String, byte[]> data) {
if (!Bukkit.isPrimaryThread()) {
// we call reloads asynchronously
// for now this solution is good enough to ensure we only modify on the main thread
// for now this solution is good enough to ensure we only modify on the main
// thread
final CompletableFuture<Void> complete = new CompletableFuture<>();
Scheduler.runTask(CoreProtect.getInstance(), () -> {
try {
parseConfig(data);
} catch (final Throwable thr) {
if (thr instanceof ThreadDeath) {
throw (ThreadDeath) thr;
}
complete.completeExceptionally(thr);
return;
}
complete.complete(null);
});
complete.join();
return;
}
CONFIG_BY_WORLD_NAME.clear();
@@ -470,19 +552,30 @@ public class Config extends Language {
// we need to load global first since it is used for config defaults
final byte[] defaultData = data.get("config");
if (defaultData != null) {
try {
GLOBAL.load(new ByteArrayInputStream(defaultData));
} catch (final IOException ex) {
throw new RuntimeException(ex); // shouldn't happen
}
} else {
GLOBAL.loadDefaults();
}
for (final Map.Entry<String, byte[]> entry : data.entrySet()) {
final String worldName = entry.getKey();
if (worldName.equals("config")) {
if ("config".equals(worldName)) {
continue;
}
final byte[] fileData = entry.getValue();
@@ -490,51 +583,25 @@ public class Config extends Language {
config.setDefaults(GLOBAL);
try {
config.load(new ByteArrayInputStream(fileData));
} catch (final IOException ex) {
throw new RuntimeException(ex); // shouldn't happen
}
CONFIG_BY_WORLD_NAME.put(worldName, config);
}
}
public void addMissingOptions(final File file) throws IOException {
final boolean writeHeader = !file.exists() || file.length() == 0;
try (final FileOutputStream fout = new FileOutputStream(file, true)) {
OutputStreamWriter out = new OutputStreamWriter(new BufferedOutputStream(fout), StandardCharsets.UTF_8);
if (writeHeader) {
out.append(DEFAULT_FILE_HEADER);
out.append(LINE_SEPARATOR);
return;
}
for (final Map.Entry<String, String> entry : DEFAULT_VALUES.entrySet()) {
final String key = entry.getKey();
final String defaultValue = entry.getValue();
final String configuredValue = this.config.get(key);
if (configuredValue != null) {
continue;
}
final String[] header = HEADERS.get(key);
if (header != null) {
out.append(LINE_SEPARATOR);
for (final String headerLine : header) {
out.append(headerLine);
out.append(LINE_SEPARATOR);
}
}
out.append(key);
out.append(": ");
out.append(defaultValue);
out.append(LINE_SEPARATOR);
}
out.close();
}
}
}
@@ -38,20 +38,27 @@ public class ConfigFile extends Config {
private final HashMap<String, String> lang;
public static void init(String fileName) throws IOException {
for (Phrase phrase : Phrase.values()) {
DEFAULT_VALUES.put(phrase.name(), phrase.getPhrase());
USER_VALUES.put(phrase.name(), phrase.getUserPhrase());
}
boolean isCache = fileName.startsWith(".");
loadFiles(fileName, isCache);
}
public ConfigFile() {
this.lang = new LinkedHashMap<>();
}
public void load(final InputStream in, String fileName, boolean isCache) throws IOException {
// if we fail reading, we will not corrupt our current config.
final Map<String, String> newConfig = new LinkedHashMap<>(this.lang.size());
ConfigFile.load(in, newConfig, true);
@@ -60,35 +67,50 @@ public class ConfigFile extends Config {
this.lang.putAll(newConfig);
for (final Entry<String, String> entry : this.lang.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (DEFAULT_VALUES.containsKey(key)
&& value.length() > 0
&& (!isCache || DEFAULT_VALUES.get(key).equals(USER_VALUES.get(key)))) {
if (DEFAULT_VALUES.containsKey(key) && value.length() > 0
&& (!isCache || DEFAULT_VALUES.get(key).equals(USER_VALUES.get(key))))
{
Phrase phrase = Phrase.valueOf(key);
if (!isCache) {
Language.setUserPhrase(phrase, value);
}
Language.setTranslatedPhrase(phrase, value);
}
}
}
// this function will close in
public static void load(final InputStream in, final Map<String, String> config, boolean forceCase)
throws IOException {
throws IOException
{
try (final InputStream in0 = in) {
BufferedReader reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
for (String line = reader.readLine(); line != null; line = reader.readLine()) {
if (line.startsWith("#")) {
continue;
}
final int split = line.indexOf(':');
if (split == -1) {
continue;
}
String key = line.substring(0, split).trim();
@@ -96,37 +118,51 @@ public class ConfigFile extends Config {
// Strip out single and double quotes from the start/end of the value
if (value.length() >= 2 && value.startsWith("'") && value.endsWith("'")) {
value = value.replaceAll("^'|'$", "");
value = value.replace("''", "'");
value = value.replace("\\'", "'");
value = value.replace("\\\\", "\\");
} else if (value.length() >= 2 && value.startsWith("\"") && value.endsWith("\"")) {
value = value.replaceAll("^\"|\"$", "");
value = value.replace("\\\"", "\"");
value = value.replace("\\\\", "\\");
}
if (forceCase) {
key = key.toUpperCase(Locale.ROOT);
}
config.put(key, value);
}
reader.close();
}
}
private static Map<String, byte[]> loadFiles(String fileName, boolean isCache) throws IOException {
final CoreProtect plugin = CoreProtect.getInstance();
final File configFolder = plugin.getDataFolder();
if (!configFolder.exists()) {
configFolder.mkdirs();
}
final Map<String, byte[]> map = new HashMap<>();
final File globalFile = new File(configFolder, fileName);
if (globalFile.exists()) {
// we always add options to the global config
final byte[] data = Files.readAllBytes(globalFile.toPath());
map.put("config", data);
@@ -134,78 +170,112 @@ public class ConfigFile extends Config {
final ConfigFile temp = new ConfigFile();
temp.load(new ByteArrayInputStream(data), fileName, isCache);
temp.addMissingOptions(globalFile);
} else {
final ConfigFile temp = new ConfigFile();
temp.addMissingOptions(globalFile);
}
return map;
}
@Override
public void addMissingOptions(final File file) throws IOException {
if (file.getName().startsWith(".")) {
return;
}
final boolean writeHeader = !file.exists() || file.length() == 0;
try (final FileOutputStream fout = new FileOutputStream(file, true)) {
OutputStreamWriter out = new OutputStreamWriter(new BufferedOutputStream(fout), StandardCharsets.UTF_8);
if (writeHeader) {
out.append(DEFAULT_FILE_HEADER);
out.append(Config.LINE_SEPARATOR);
}
for (final Entry<String, String> entry : DEFAULT_VALUES.entrySet()) {
final String key = entry.getKey();
final String defaultValue = entry.getValue().replaceAll("\"", "\\\\\"");
final String configuredValue = this.lang.get(key);
if (configuredValue != null) {
continue;
}
out.append(Config.LINE_SEPARATOR);
out.append(key);
out.append(": ");
out.append("\"" + defaultValue + "\"");
}
out.close();
}
}
public static void modifyLine(String fileName, String oldLine, String newLine) {
try {
Path path = Paths.get(ConfigHandler.path + fileName);
List<String> lines = Files.readAllLines(path);
for (int i = 0; i < lines.size(); i++) {
if (lines.get(i).equalsIgnoreCase(oldLine)) {
if (newLine != null && newLine.length() > 0) {
lines.set(i, newLine);
} else {
lines.remove(i);
}
break;
}
}
if (lines.size() > 0) {
String lastLine = lines.get(
lines.size() - 1); // append the final line to prevent a line separator from being added
String lastLine = lines.get(lines.size() - 1); // append the final line to prevent a line separator from
// being added
Files.write(path, (lines.remove(lines.size() - 1).isEmpty() ? lines : lines), StandardCharsets.UTF_8);
Files.write(path, lastLine.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
lines.clear();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void sortFile(String fileName) {
try {
Path path = Paths.get(ConfigHandler.path + fileName);
List<String> lines = Files.readAllLines(path);
List<String> sort = lines.subList(2, lines.size());
@@ -214,22 +284,33 @@ public class ConfigFile extends Config {
lines.addAll(sort);
if (lines.size() > 0) {
String lastLine = lines.get(
lines.size() - 1); // append the final line to prevent a line separator from being added
String lastLine = lines.get(lines.size() - 1); // append the final line to prevent a line separator from
// being added
Files.write(path, (lines.remove(lines.size() - 1).isEmpty() ? lines : lines), StandardCharsets.UTF_8);
Files.write(path, lastLine.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
lines.clear();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void resetCache(String cacheName, String fileName) throws IOException {
File file = new File(CoreProtect.getInstance().getDataFolder(), cacheName);
if (file.length() > 0) {
new FileOutputStream(file).close();
init(fileName);
}
}
}
@@ -36,6 +36,7 @@ import org.bukkit.plugin.PluginManager;
import oshi.hardware.CentralProcessor;
public class ConfigHandler extends Queue {
public static int SERVER_VERSION = 0;
public static final int EDITION_VERSION = 2;
public static final String EDITION_BRANCH = Util.getBranch();
@@ -74,7 +75,9 @@ public class ConfigHandler extends Queue {
public static volatile int artId = 0;
private static <K, V> Map<K, V> syncMap() {
return Collections.synchronizedMap(new HashMap<>());
}
public static Map<String, Integer> worlds = syncMap();
@@ -131,50 +134,73 @@ public class ConfigHandler extends Queue {
public static List<String> databaseTables = new ArrayList<>();
private static void checkPlayers(Connection connection) {
ConfigHandler.playerIdCache.clear();
ConfigHandler.playerIdCacheReversed.clear();
for (Player player : Bukkit.getServer().getOnlinePlayers()) {
if (ConfigHandler.playerIdCache.get(player.getName().toLowerCase(Locale.ROOT)) == null) {
UserStatement.loadId(
connection, player.getName(), player.getUniqueId().toString());
UserStatement.loadId(connection, player.getName(), player.getUniqueId().toString());
}
}
}
private static void loadBlacklist() {
try {
ConfigHandler.blacklist.clear();
String blacklist = ConfigHandler.path + "blacklist.txt";
boolean exists = (new File(blacklist)).exists();
if (exists) {
RandomAccessFile blfile = new RandomAccessFile(blacklist, "rw");
long blc = blfile.length();
if (blc > 0) {
while (blfile.getFilePointer() < blfile.length()) {
String blacklistUser =
blfile.readLine().replaceAll(" ", "").toLowerCase(Locale.ROOT);
String blacklistUser = blfile.readLine().replaceAll(" ", "").toLowerCase(Locale.ROOT);
if (blacklistUser.length() > 0) {
ConfigHandler.blacklist.put(blacklistUser, true);
}
}
}
blfile.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static void loadConfig() {
try {
Config.init();
ConfigFile.init(ConfigFile.LANGUAGE); // load user phrases
ConfigFile.init(ConfigFile.LANGUAGE_CACHE); // load translation cache
// Enforce "co_" table prefix if using SQLite.
if (!Config.getGlobal().MYSQL) {
ConfigHandler.prefixConfig = Config.getGlobal().PREFIX;
Config.getGlobal().PREFIX = "co_";
}
ConfigHandler.host = Config.getGlobal().MYSQL_HOST;
@@ -186,49 +212,73 @@ public class ConfigHandler extends Queue {
ConfigHandler.prefix = Config.getGlobal().PREFIX;
ConfigHandler.loadBlacklist(); // Load the blacklist file if it exists.
} catch (Exception e) {
e.printStackTrace();
}
}
public static void loadDatabase() {
// close old pool when we reload the database, e.g. in purge command
Database.closeConnection();
if (!Config.getGlobal().MYSQL) {
try {
File tempFile = File.createTempFile("CoreProtect_" + System.currentTimeMillis(), ".tmp");
tempFile.setExecutable(true);
boolean canExecute = false;
try {
canExecute = tempFile.canExecute();
} catch (Exception exception) {
// execute access denied by security manager
}
if (!canExecute) {
File tempFolder = new File("cache");
boolean exists = tempFolder.exists();
if (!exists) {
tempFolder.mkdir();
}
System.setProperty("java.io.tmpdir", "cache");
}
tempFile.delete();
Class.forName("org.sqlite.JDBC");
} catch (Exception e) {
e.printStackTrace();
}
} else {
HikariConfig config = new HikariConfig();
try {
Class.forName("com.mysql.cj.jdbc.Driver");
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
config.setDriverClassName("com.mysql.jdbc.Driver");
}
config.setJdbcUrl(
@@ -240,7 +290,10 @@ public class ConfigHandler extends Queue {
config.addDataSourceProperty("characterEncoding", "UTF-8");
config.addDataSourceProperty("connectionTimeout", "10000");
/* https://github.com/brettwooldridge/HikariCP/wiki/MySQL-Configuration */
/* https://cdn.oreillystatic.com/en/assets/1/event/21/Connector_J%20Performance%20Gems%20Presentation.pdf */
/*
* https://cdn.oreillystatic.com/en/assets/1/event/21/Connector_J%20Performance%
* 20Gems%20Presentation.pdf
*/
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
@@ -254,13 +307,17 @@ public class ConfigHandler extends Queue {
config.addDataSourceProperty("useSSL", Config.getGlobal().ENABLE_SSL);
ConfigHandler.hikariDataSource = new HikariDataSource(config);
}
Database.createDatabaseTables(ConfigHandler.prefix, null, Config.getGlobal().MYSQL, false);
}
public static void loadTypes(Statement statement) {
try {
String query = "SELECT id,material FROM " + ConfigHandler.prefix + "material_map";
ResultSet rs = statement.executeQuery(query);
ConfigHandler.materials.clear();
@@ -268,14 +325,19 @@ public class ConfigHandler extends Queue {
materialId = 0;
while (rs.next()) {
int id = rs.getInt("id");
String material = rs.getString("material");
ConfigHandler.materials.put(material, id);
ConfigHandler.materialsReversed.put(id, material);
if (id > materialId) {
materialId = id;
}
}
rs.close();
query = "SELECT id,data FROM " + ConfigHandler.prefix + "blockdata_map";
@@ -285,14 +347,19 @@ public class ConfigHandler extends Queue {
blockdataId = 0;
while (rs.next()) {
int id = rs.getInt("id");
String data = rs.getString("data");
ConfigHandler.blockdata.put(data, id);
ConfigHandler.blockdataReversed.put(id, data);
if (id > blockdataId) {
blockdataId = id;
}
}
rs.close();
query = "SELECT id,art FROM " + ConfigHandler.prefix + "art_map";
@@ -302,14 +369,19 @@ public class ConfigHandler extends Queue {
artId = 0;
while (rs.next()) {
int id = rs.getInt("id");
String art = rs.getString("art");
ConfigHandler.art.put(art, id);
ConfigHandler.artReversed.put(id, art);
if (id > artId) {
artId = id;
}
}
rs.close();
query = "SELECT id,entity FROM " + ConfigHandler.prefix + "entity_map";
@@ -319,22 +391,33 @@ public class ConfigHandler extends Queue {
entityId = 0;
while (rs.next()) {
int id = rs.getInt("id");
String entity = rs.getString("entity");
ConfigHandler.entities.put(entity, id);
ConfigHandler.entitiesReversed.put(id, entity);
if (id > entityId) {
entityId = id;
}
}
rs.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void loadWorlds(Statement statement) {
try {
String query = "SELECT id,world FROM " + ConfigHandler.prefix + "world";
ResultSet rs = statement.executeQuery(query);
ConfigHandler.worlds.clear();
@@ -342,40 +425,57 @@ public class ConfigHandler extends Queue {
worldId = 0;
while (rs.next()) {
int id = rs.getInt("id");
String world = rs.getString("world");
ConfigHandler.worlds.put(world, id);
ConfigHandler.worldsReversed.put(id, world);
if (id > worldId) {
worldId = id;
}
}
rs.close();
List<World> worlds = Bukkit.getServer().getWorlds();
for (World world : worlds) {
String worldname = world.getName();
if (ConfigHandler.worlds.get(worldname) == null) {
int id = worldId + 1;
ConfigHandler.worlds.put(worldname, id);
ConfigHandler.worldsReversed.put(id, worldname);
worldId = id;
Queue.queueWorldInsert(id, worldname);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static boolean checkDatabaseLock(Statement statement) {
try {
if (Config.getGlobal().DATABASE_LOCK) {
boolean locked = true;
boolean lockMessage = false;
int unixtimestamp = (int) (System.currentTimeMillis() / 1000L);
int waitTime = unixtimestamp + 15;
while (locked) {
locked = false;
unixtimestamp = (int) (System.currentTimeMillis() / 1000L);
int checkTime = unixtimestamp - 15;
@@ -383,13 +483,20 @@ public class ConfigHandler extends Queue {
+ "database_lock WHERE rowid='1' AND status='1' AND time >= '" + checkTime + "' LIMIT 1";
ResultSet rs = statement.executeQuery(query);
while (rs.next()) {
if (unixtimestamp < waitTime) {
if (!lockMessage) {
Chat.sendConsoleMessage("[CoreProtect] " + Phrase.build(Phrase.DATABASE_LOCKED_1));
lockMessage = true;
}
Thread.sleep(1000);
} else {
Chat.sendConsoleMessage(
Color.RED + "[CoreProtect] " + Phrase.build(Phrase.DATABASE_LOCKED_2));
Chat.sendConsoleMessage(
@@ -397,22 +504,33 @@ public class ConfigHandler extends Queue {
Chat.sendConsoleMessage(
Color.GREY + "[CoreProtect] " + Phrase.build(Phrase.DATABASE_LOCKED_4));
return false;
}
locked = true;
}
rs.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
public static boolean performInitialization(boolean startup) {
try {
BukkitAdapter.loadAdapter();
SpigotAdapter.loadAdapter();
PaperAdapter.loadAdapter();
@@ -422,13 +540,19 @@ public class ConfigHandler extends Queue {
ConfigHandler.loadDatabase(); // Initialize MySQL and create tables if necessary.
if (startup) {
ListenerHandler.registerNetworking(); // Register channels for networking API
}
} catch (Exception e) {
e.printStackTrace();
}
try (Connection connection = Database.getConnection(true, 0)) {
Statement statement = connection.createStatement();
ConfigHandler.checkPlayers(connection);
@@ -437,39 +561,58 @@ public class ConfigHandler extends Queue {
// Initialize WorldEdit logging
if (Util.checkWorldEdit()) {
PluginManager pluginManager = Bukkit.getServer().getPluginManager();
Plugin worldEditPlugin = pluginManager.getPlugin("WorldEdit");
if (worldEditPlugin != null && worldEditPlugin.isEnabled()) {
Util.loadWorldEdit();
}
} else if (ConfigHandler.worldeditEnabled) {
Util.unloadWorldEdit();
}
ConfigHandler.serverRunning = true; // Set as running before patching
boolean validVersion = Patch.versionCheck(statement); // Minor upgrades & version check
boolean databaseLock = true;
if (startup) {
// Check that database isn't already in use
databaseLock = ConfigHandler.checkDatabaseLock(statement);
}
statement.close();
return validVersion && databaseLock;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
public static void performDisable() {
try {
Database.closeConnection();
ListenerHandler.unregisterNetworking(); // Unregister channels for networking API
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -23,66 +23,80 @@ public class Consumer extends Process implements Runnable, Thread.UncaughtExcept
protected static volatile boolean pausedSuccess = false;
public static ConcurrentHashMap<Integer, ArrayList<Object[]>> consumer = new ConcurrentHashMap<>(4, 0.75f, 2);
// public static ConcurrentHashMap<Integer, Integer[]> consumer_id = new ConcurrentHashMap<>();
// public static ConcurrentHashMap<Integer, Integer[]> consumer_id = new
// ConcurrentHashMap<>();
public static Map<Integer, Integer[]> consumer_id = Collections.synchronizedMap(new HashMap<>());
public static ConcurrentHashMap<Integer, Map<Integer, String[]>> consumerUsers =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, String[]>> consumerUsers = new ConcurrentHashMap<>(4, 0.75f,
2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, String>> consumerStrings =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, String>> consumerStrings = new ConcurrentHashMap<>(4, 0.75f,
2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, Object[]>> consumerSigns =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, Object[]>> consumerSigns = new ConcurrentHashMap<>(4, 0.75f,
2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, ItemStack[]>> consumerContainers =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, ItemStack[]>> consumerContainers = new ConcurrentHashMap<>(4,
0.75f, 2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, Object>> consumerInventories =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, Object>> consumerInventories = new ConcurrentHashMap<>(4,
0.75f, 2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, List<BlockState>>> consumerBlockList =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, List<BlockState>>> consumerBlockList = new ConcurrentHashMap<>(
4, 0.75f, 2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, List<Object[]>>> consumerObjectArrayList =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, List<Object[]>>> consumerObjectArrayList = new ConcurrentHashMap<>(
4, 0.75f, 2);
@Deprecated
public static ConcurrentHashMap<Integer, Map<Integer, List<Object>>> consumerObjectList =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, List<Object>>> consumerObjectList = new ConcurrentHashMap<>(4,
0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, Object>> consumerObjects =
new ConcurrentHashMap<>(4, 0.75f, 2);
public static ConcurrentHashMap<Integer, Map<Integer, Object>> consumerObjects = new ConcurrentHashMap<>(4, 0.75f,
2);
// ^merge maps into single object based map
private static void errorDelay() {
try {
Thread.sleep(30000); // 30 seconds
} catch (Exception e) {
e.printStackTrace();
}
}
protected static int newConsumerId(int consumer) {
int id = Consumer.consumer_id.get(consumer)[0];
Consumer.consumer_id.put(consumer, new Integer[] { id + 1, 1 });
return id;
}
public static int getConsumerSize(int id) {
if (id == 0 || id == 1) {
return Consumer.consumer.get(id).size();
}
return 0;
}
public static void initialize() {
Consumer.consumer.put(0, new ArrayList<>());
Consumer.consumer.put(1, new ArrayList<>());
Consumer.consumer_id.put(0, new Integer[] { 0, 0 });
@@ -105,65 +119,99 @@ public class Consumer extends Process implements Runnable, Thread.UncaughtExcept
Consumer.consumerObjectList.put(1, new HashMap<>());
Consumer.consumerContainers.put(0, new HashMap<>());
Consumer.consumerContainers.put(1, new HashMap<>());
}
public static boolean isRunning() {
return consumerThread != null && consumerThread.isAlive();
}
private static void pauseConsumer(int process_id) {
try {
while ((ConfigHandler.serverRunning || ConfigHandler.converterRunning || ConfigHandler.migrationRunning)
&& (Consumer.isPaused
|| ConfigHandler.pauseConsumer
|| ConfigHandler.purgeRunning
|| Consumer.consumer_id.get(process_id)[1] == 1)) {
&& (Consumer.isPaused || ConfigHandler.pauseConsumer || ConfigHandler.purgeRunning
|| Consumer.consumer_id.get(process_id)[1] == 1))
{
pausedSuccess = true;
Thread.sleep(100);
}
} catch (Exception e) {
e.printStackTrace();
}
pausedSuccess = false;
}
@Override
public void run() {
boolean lastRun = false;
while (ConfigHandler.serverRunning || ConfigHandler.converterRunning || !lastRun) {
if (!ConfigHandler.serverRunning && !ConfigHandler.converterRunning) {
lastRun = true;
}
try {
int process_id = 0;
if (currentConsumer == 0) {
currentConsumer = 1;
} else {
process_id = 1;
currentConsumer = 0;
}
Thread.sleep(500);
pauseConsumer(process_id);
Process.processConsumer(process_id, lastRun);
} catch (Exception e) {
e.printStackTrace();
errorDelay();
}
}
}
@Override
public void uncaughtException(Thread thread, Throwable e) {
e.printStackTrace();
Bukkit.getPluginManager().disablePlugin(CoreProtect.getInstance());
}
public static void startConsumer() {
if (!isRunning()) {
consumerThread = new Thread(new Consumer());
consumerThread.setUncaughtExceptionHandler(new Consumer());
consumerThread.start();
}
}
}
+274 -225
View File
@@ -28,155 +28,178 @@ import org.bukkit.inventory.ItemStack;
public class Queue {
protected static synchronized int modifyForceContainer(String id, ItemStack[] container) {
List<ItemStack[]> forceList = ConfigHandler.forceContainer.get(id);
if (forceList == null) {
return 0;
}
if (container == null) {
forceList.remove(0);
} else {
forceList.add(container);
}
return forceList.size();
}
protected static synchronized int getChestId(String id) {
int chestId = ConfigHandler.loggingChest.getOrDefault(id, -1) + 1;
ConfigHandler.loggingChest.put(id, chestId);
return chestId;
}
protected static synchronized int getItemId(String id) {
int chestId = ConfigHandler.loggingItem.getOrDefault(id, -1) + 1;
ConfigHandler.loggingItem.put(id, chestId);
return chestId;
}
private static synchronized void addConsumer(int currentConsumer, Object[] data) {
Consumer.consumer.get(currentConsumer).add(data);
}
private static synchronized void queueStandardData(
int consumerId, int currentConsumer, String[] user, Object object) {
private static synchronized void queueStandardData(int consumerId, int currentConsumer, String[] user,
Object object)
{
Consumer.consumerUsers.get(currentConsumer).put(consumerId, user);
Consumer.consumerObjects.get(currentConsumer).put(consumerId, object);
Consumer.consumer_id.put(
currentConsumer, new Integer[] {Consumer.consumer_id.get(currentConsumer)[0], 0});
Consumer.consumer_id.put(currentConsumer, new Integer[] { Consumer.consumer_id.get(currentConsumer)[0], 0 });
}
protected static void queueAdvancedBreak(
String user,
BlockState block,
Material type,
String blockData,
int data,
Material breakType,
int blockNumber) {
protected static void queueAdvancedBreak(String user, BlockState block, Material type, String blockData, int data,
Material breakType, int blockNumber)
{
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.BLOCK_BREAK, type, data, breakType, 0, blockNumber, blockData});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.BLOCK_BREAK, type, data, breakType, 0, blockNumber, blockData });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queueArtInsert(int id, String name) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.ART_INSERT, null, 0, null, 0, id, null });
queueStandardData(consumerId, currentConsumer, new String[] { null, null }, name);
}
protected static void queueBlockBreak(
String user, BlockState block, Material type, String blockData, int extraData) {
protected static void queueBlockBreak(String user, BlockState block, Material type, String blockData,
int extraData)
{
queueBlockBreak(user, block, type, blockData, null, extraData, 0);
}
protected static void queueBlockBreakValidate(
final String user,
final Block block,
final BlockState blockState,
final Material type,
final String blockData,
final int extraData,
int ticks) {
Scheduler.scheduleSyncDelayedTask(
CoreProtect.getInstance(),
() -> {
protected static void queueBlockBreakValidate(final String user, final Block block, final BlockState blockState,
final Material type, final String blockData, final int extraData, int ticks)
{
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
if (!block.getType().equals(type)) {
queueBlockBreak(user, blockState, type, blockData, null, extraData, 0);
}
} catch (Exception e) {
e.printStackTrace();
}
},
block.getLocation(),
ticks);
}
protected static void queueBlockBreak(
String user,
BlockState block,
Material type,
String blockData,
Material breakType,
int extraData,
int blockNumber) {
} catch (Exception e) {
e.printStackTrace();
}
}, block.getLocation(), ticks);
}
protected static void queueBlockBreak(String user, BlockState block, Material type, String blockData,
Material breakType, int extraData, int blockNumber)
{
if (type == Material.SPAWNER && block instanceof CreatureSpawner) { // Mob spawner
CreatureSpawner mobSpawner = (CreatureSpawner) block;
extraData = Util.getSpawnerType(mobSpawner.getSpawnedType());
} else if (type == Material.IRON_DOOR
|| BlockGroup.DOORS.contains(type)
|| type.equals(Material.SUNFLOWER)
|| type.equals(Material.LILAC)
|| type.equals(Material.TALL_GRASS)
|| type.equals(Material.LARGE_FERN)
|| type.equals(Material.ROSE_BUSH)
|| type.equals(Material.PEONY)) { // Double plant
} else if (type == Material.IRON_DOOR || BlockGroup.DOORS.contains(type) || type.equals(Material.SUNFLOWER)
|| type.equals(Material.LILAC) || type.equals(Material.TALL_GRASS) || type.equals(Material.LARGE_FERN)
|| type.equals(Material.ROSE_BUSH) || type.equals(Material.PEONY))
{ // Double plant
if (block.getBlockData() instanceof Bisected) {
if (((Bisected) block.getBlockData()).getHalf().equals(Half.TOP)) {
if (blockNumber == 5) {
return;
}
if (block.getY() > BukkitAdapter.ADAPTER.getMinHeight(block.getWorld())) {
block = block.getWorld()
.getBlockAt(block.getX(), block.getY() - 1, block.getZ())
.getState();
block = block.getWorld().getBlockAt(block.getX(), block.getY() - 1, block.getZ()).getState();
if (type != block.getType()) {
return;
}
blockData = block.getBlockData().getAsString();
}
}
}
} else if (type.name().endsWith("_BED") && block.getBlockData() instanceof Bed) {
if (((Bed) block.getBlockData()).getPart().equals(Part.HEAD)) {
return;
}
}
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.BLOCK_BREAK, type, extraData, breakType, 0, blockNumber, blockData});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.BLOCK_BREAK, type, extraData, breakType, 0, blockNumber, blockData });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queueBlockPlace(
String user,
BlockState blockLocation,
Material blockType,
BlockState blockReplaced,
Material forceType,
int forceD,
int forceData,
String blockData) {
protected static void queueBlockPlace(String user, BlockState blockLocation, Material blockType,
BlockState blockReplaced, Material forceType, int forceD, int forceData, String blockData)
{
// If force_data equals "1", current block data will be used in consumer.
Material type = blockType;
int data = 0;
@@ -184,291 +207,327 @@ public class Queue {
int replaceData = 0;
if (type == Material.SPAWNER && blockLocation instanceof CreatureSpawner) { // Mob spawner
CreatureSpawner mobSpawner = (CreatureSpawner) blockLocation;
data = Util.getSpawnerType(mobSpawner.getSpawnedType());
forceData = 1;
}
if (blockReplaced != null) {
replaceType = blockReplaced.getType();
replaceData = 0;
if ((replaceType == Material.IRON_DOOR
|| BlockGroup.DOORS.contains(replaceType)
|| replaceType.equals(Material.SUNFLOWER)
|| replaceType.equals(Material.LILAC)
|| replaceType.equals(Material.TALL_GRASS)
|| replaceType.equals(Material.LARGE_FERN)
|| replaceType.equals(Material.ROSE_BUSH)
|| replaceType.equals(Material.PEONY))
&& replaceData >= 8) { // Double plant top half
BlockState blockBelow = blockReplaced
.getWorld()
.getBlockAt(blockReplaced.getX(), blockReplaced.getY() - 1, blockReplaced.getZ())
.getState();
if ((replaceType == Material.IRON_DOOR || BlockGroup.DOORS.contains(replaceType)
|| replaceType.equals(Material.SUNFLOWER) || replaceType.equals(Material.LILAC)
|| replaceType.equals(Material.TALL_GRASS) || replaceType.equals(Material.LARGE_FERN)
|| replaceType.equals(Material.ROSE_BUSH) || replaceType.equals(Material.PEONY))
&& replaceData >= 8)
{ // Double plant top half
BlockState blockBelow = blockReplaced.getWorld()
.getBlockAt(blockReplaced.getX(), blockReplaced.getY() - 1, blockReplaced.getZ()).getState();
Material belowType = blockBelow.getType();
Queue.queueBlockBreak(
user, blockBelow, belowType, blockBelow.getBlockData().getAsString(), 0);
Queue.queueBlockBreak(user, blockBelow, belowType, blockBelow.getBlockData().getAsString(), 0);
}
}
if (forceType != null) {
type = forceType;
forceData = 1;
}
if (forceD != -1) {
data = forceD;
forceData = 1;
}
String replacedBlockData = null;
if (blockReplaced != null) {
replacedBlockData = blockReplaced.getBlockData().getAsString();
}
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] {
consumerId,
Process.BLOCK_PLACE,
type,
data,
replaceType,
replaceData,
forceData,
blockData,
replacedBlockData
});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.BLOCK_PLACE, type, data, replaceType, replaceData, forceData, blockData,
replacedBlockData });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, blockLocation);
}
protected static void queueBlockPlaceDelayed(
final String user,
final Location placed,
final Material type,
final String blockData,
final BlockState replaced,
int ticks) {
Scheduler.scheduleSyncDelayedTask(
CoreProtect.getInstance(),
() -> {
protected static void queueBlockPlaceDelayed(final String user, final Location placed, final Material type,
final String blockData, final BlockState replaced, int ticks)
{
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
queueBlockPlace(user, placed.getBlock().getState(), type, replaced, null, -1, 0, blockData);
} catch (Exception e) {
e.printStackTrace();
}
},
placed,
ticks);
}
protected static void queueBlockPlaceValidate(
final String user,
final BlockState blockLocation,
final Block block,
final BlockState blockReplaced,
final Material forceT,
final int forceD,
final int forceData,
final String blockData,
int ticks) {
Scheduler.scheduleSyncDelayedTask(
CoreProtect.getInstance(),
() -> {
}, placed, ticks);
}
protected static void queueBlockPlaceValidate(final String user, final BlockState blockLocation, final Block block,
final BlockState blockReplaced, final Material forceT, final int forceD, final int forceData,
final String blockData, int ticks)
{
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Material blockType = block.getType();
if (blockType.equals(forceT)) {
BlockState blockStateLocation = blockLocation;
if (Config.getConfig(blockLocation.getWorld()).BLOCK_MOVEMENT) {
blockStateLocation = BlockUtil.gravityScan(blockLocation.getLocation(), blockType, user)
.getState();
}
queueBlockPlace(
user,
blockStateLocation,
blockType,
blockReplaced,
forceT,
forceD,
forceData,
queueBlockPlace(user, blockStateLocation, blockType, blockReplaced, forceT, forceD, forceData,
blockData);
}
} catch (Exception e) {
e.printStackTrace();
}
},
blockLocation.getLocation(),
ticks);
}
protected static void queueBlockGravityValidate(
final String user, final Location location, final Block block, final Material blockType, int ticks) {
Scheduler.scheduleSyncDelayedTask(
CoreProtect.getInstance(),
() -> {
} catch (Exception e) {
e.printStackTrace();
}
}, blockLocation.getLocation(), ticks);
}
protected static void queueBlockGravityValidate(final String user, final Location location, final Block block,
final Material blockType, int ticks)
{
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), () -> {
try {
Block placementBlock = BlockUtil.gravityScan(location, blockType, user);
if (!block.equals(placementBlock)) {
queueBlockPlace(user, placementBlock.getState(), blockType, null, blockType, -1, 0, null);
}
} catch (Exception e) {
e.printStackTrace();
}
},
location,
ticks);
}, location, ticks);
}
protected static void queueContainerBreak(String user, Location location, Material type, ItemStack[] oldInventory) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.CONTAINER_BREAK, type, 0, null, 0, 0, null });
Consumer.consumerContainers.get(currentConsumer).put(consumerId, oldInventory);
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static synchronized void queueContainerTransaction(
String user, Location location, Material type, Object inventory, int chestId) {
protected static synchronized void queueContainerTransaction(String user, Location location, Material type,
Object inventory, int chestId)
{
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.CONTAINER_TRANSACTION, type, 0, null, 0, chestId, null});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.CONTAINER_TRANSACTION, type, 0, null, 0, chestId, null });
Consumer.consumerInventories.get(currentConsumer).put(consumerId, inventory);
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static void queueItemTransaction(String user, Location location, int time, int offset, int itemId) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.ITEM_TRANSACTION, null, offset, null, time, itemId, null});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.ITEM_TRANSACTION, null, offset, null, time, itemId, null });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static void queueEntityInsert(int id, String name) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.ENTITY_INSERT, null, 0, null, 0, id, null });
queueStandardData(consumerId, currentConsumer, new String[] { null, null }, name);
}
protected static void queueEntityKill(String user, Location location, List<Object> data, EntityType type) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.ENTITY_KILL, null, 0, null, 0, 0 });
Consumer.consumerObjectList.get(currentConsumer).put(consumerId, data);
queueStandardData(consumerId, currentConsumer, new String[] {user, null}, new Object[] {
location.getBlock().getState(), type, null
});
queueStandardData(consumerId, currentConsumer, new String[] { user, null },
new Object[]
{ location.getBlock().getState(), type, null });
}
protected static void queueEntitySpawn(String user, BlockState block, EntityType type, int data) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.ENTITY_SPAWN, null, 0, null, 0, data, null });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, new Object[] { block, type });
}
protected static void queueMaterialInsert(int id, String name) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.MATERIAL_INSERT, null, 0, null, 0, id, null });
queueStandardData(consumerId, currentConsumer, new String[] { null, null }, name);
}
protected static void queueBlockDataInsert(int id, String data) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.BLOCKDATA_INSERT, null, 0, null, 0, id, null });
queueStandardData(consumerId, currentConsumer, new String[] { null, null }, data);
}
protected static void queueNaturalBlockBreak(
String user, BlockState block, Block relative, Material type, String blockData, int data) {
protected static void queueNaturalBlockBreak(String user, BlockState block, Block relative, Material type,
String blockData, int data)
{
List<BlockState> blockStates = new ArrayList<>();
if (relative != null) {
blockStates.add(relative.getState());
}
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.NATURAL_BLOCK_BREAK, type, data, null, 0, 0, blockData});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.NATURAL_BLOCK_BREAK, type, data, null, 0, 0, blockData });
Consumer.consumerBlockList.get(currentConsumer).put(consumerId, blockStates);
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queuePlayerChat(Player player, String message, long timestamp) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_CHAT, null, 0, null, 0, 0, null });
Consumer.consumerStrings.get(currentConsumer).put(consumerId, message);
queueStandardData(consumerId, currentConsumer, new String[] {player.getName(), null}, new Object[] {
timestamp, player.getLocation().clone()
});
queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), null },
new Object[]
{ timestamp, player.getLocation().clone() });
}
protected static void queuePlayerCommand(Player player, String message, long timestamp) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_COMMAND, null, 0, null, 0, 0, null });
Consumer.consumerStrings.get(currentConsumer).put(consumerId, message);
queueStandardData(consumerId, currentConsumer, new String[] {player.getName(), null}, new Object[] {
timestamp, player.getLocation().clone()
});
queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), null },
new Object[]
{ timestamp, player.getLocation().clone() });
}
protected static void queuePlayerInteraction(String user, BlockState block, Material type) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] {consumerId, Process.PLAYER_INTERACTION, type, 0, null, 0, 0, null});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.PLAYER_INTERACTION, type, 0, null, 0, 0, null });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queuePlayerKill(String user, Location location, String player) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_KILL, null, 0, null, 0, 0, null });
queueStandardData(consumerId, currentConsumer, new String[] {user, null}, new Object[] {
location.getBlock().getState(), player
});
queueStandardData(consumerId, currentConsumer, new String[] { user, null },
new Object[]
{ location.getBlock().getState(), player });
}
protected static void queuePlayerLogin(Player player, int time, int configSessions, int configUsernames) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
String uuid = player.getUniqueId().toString();
addConsumer(currentConsumer, new Object[] {
consumerId, Process.PLAYER_LOGIN, null, configSessions, null, configUsernames, time, null
});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.PLAYER_LOGIN, null, configSessions, null, configUsernames, time, null });
Consumer.consumerStrings.get(currentConsumer).put(consumerId, uuid);
queueStandardData(
consumerId,
currentConsumer,
new String[] {player.getName(), uuid},
queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), uuid },
player.getLocation().clone());
}
protected static void queuePlayerQuit(Player player, int time) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.PLAYER_LOGOUT, null, 0, null, 0, time, null });
queueStandardData(
consumerId,
currentConsumer,
new String[] {player.getName(), null},
queueStandardData(consumerId, currentConsumer, new String[] { player.getName(), null },
player.getLocation().clone());
}
protected static void queueRollbackUpdate(
String user, Location location, List<Object[]> list, int table, int action) {
protected static void queueRollbackUpdate(String user, Location location, List<Object[]> list, int table,
int action)
{
if (location == null) {
location = new Location(Bukkit.getServer().getWorlds().get(0), 0, 0, 0);
}
int currentConsumer = Consumer.currentConsumer;
@@ -476,82 +535,72 @@ public class Queue {
addConsumer(currentConsumer, new Object[] { consumerId, table, null, 0, null, 0, action, null });
Consumer.consumerObjectArrayList.get(currentConsumer).put(consumerId, list);
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static void queueSignText(
String user,
Location location,
int action,
int color,
int colorSecondary,
boolean frontGlowing,
boolean backGlowing,
boolean isWaxed,
boolean isFront,
String line1,
String line2,
String line3,
String line4,
String line5,
String line6,
String line7,
String line8,
int offset) {
protected static void queueSignText(String user, Location location, int action, int color, int colorSecondary,
boolean frontGlowing, boolean backGlowing, boolean isWaxed, boolean isFront, String line1, String line2,
String line3, String line4, String line5, String line6, String line7, String line8, int offset)
{
/*
if (line1.length() == 0 && line2.length() == 0 && line3.length() == 0 && line4.length() == 0) {
return;
}
* if (line1.length() == 0 && line2.length() == 0 && line3.length() == 0 &&
* line4.length() == 0) { return; }
*/
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer, new Object[] {consumerId, Process.SIGN_TEXT, null, color, null, action, offset, null});
Consumer.consumerSigns.get(currentConsumer).put(consumerId, new Object[] {
colorSecondary,
Util.getSignData(frontGlowing, backGlowing),
isWaxed,
isFront,
line1,
line2,
line3,
line4,
line5,
line6,
line7,
line8
});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.SIGN_TEXT, null, color, null, action, offset, null });
Consumer.consumerSigns.get(currentConsumer).put(consumerId,
new Object[]
{ colorSecondary, Util.getSignData(frontGlowing, backGlowing), isWaxed, isFront, line1, line2, line3,
line4, line5, line6, line7, line8 });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, location);
}
protected static void queueSignUpdate(String user, BlockState block, int action, int time) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] {consumerId, Process.SIGN_UPDATE, null, action, null, 0, time, null});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.SIGN_UPDATE, null, action, null, 0, time, null });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queueSkullUpdate(String user, BlockState block, int rowId) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.SKULL_UPDATE, null, 0, null, 0, rowId, null });
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queueStructureGrow(
String user, BlockState block, List<BlockState> blockList, int replacedListSize) {
protected static void queueStructureGrow(String user, BlockState block, List<BlockState> blockList,
int replacedListSize)
{
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(
currentConsumer,
new Object[] {consumerId, Process.STRUCTURE_GROWTH, null, 0, null, 0, replacedListSize, null});
addConsumer(currentConsumer,
new Object[]
{ consumerId, Process.STRUCTURE_GROWTH, null, 0, null, 0, replacedListSize, null });
Consumer.consumerBlockList.get(currentConsumer).put(consumerId, blockList);
queueStandardData(consumerId, currentConsumer, new String[] { user, null }, block);
}
protected static void queueWorldInsert(int id, String world) {
int currentConsumer = Consumer.currentConsumer;
int consumerId = Consumer.newConsumerId(currentConsumer);
addConsumer(currentConsumer, new Object[] { consumerId, Process.WORLD_INSERT, null, 0, null, 0, id, null });
queueStandardData(consumerId, currentConsumer, new String[] { null, null }, world);
}
}
@@ -10,26 +10,39 @@ import net.coreprotect.utility.Chat;
class ArtInsertProcess {
static void process(
PreparedStatement preparedStmt, Statement statement, int batchCount, Object name, int materialId) {
static void process(PreparedStatement preparedStmt, Statement statement, int batchCount, Object name,
int materialId)
{
if (name instanceof String) {
String query =
"SELECT id FROM " + ConfigHandler.prefix + "art_map WHERE id = '" + materialId + "' LIMIT 0, 1";
String query = "SELECT id FROM " + ConfigHandler.prefix + "art_map WHERE id = '" + materialId
+ "' LIMIT 0, 1";
boolean hasMaterial = MaterialStatement.hasMaterial(statement, query);
if (!hasMaterial) {
MaterialStatement.insert(preparedStmt, batchCount, materialId, (String) name);
// validate ID maps to ensure mapping wasn't reloaded from database prior to this insertion completing
// validate ID maps to ensure mapping wasn't reloaded from database prior to
// this insertion completing
ConfigHandler.art.put((String) name, materialId);
ConfigHandler.artReversed.put(materialId, (String) name);
if (materialId > ConfigHandler.artId) {
ConfigHandler.artId = materialId;
}
} else {
Chat.console(Phrase.build(Phrase.CACHE_ERROR, "art"));
Chat.console(Phrase.build(Phrase.CACHE_RELOAD, Selector.FIRST));
ConfigHandler.loadTypes(statement);
}
}
}
}
@@ -11,36 +11,28 @@ import org.bukkit.block.Skull;
class BlockBreakProcess {
static void process(
PreparedStatement preparedStmt,
PreparedStatement preparedStmtSkulls,
int batchCount,
int processId,
int id,
Material blockType,
int blockDataId,
Material replaceType,
int forceData,
String user,
Object object,
String blockData) {
static void process(PreparedStatement preparedStmt, PreparedStatement preparedStmtSkulls, int batchCount,
int processId, int id, Material blockType, int blockDataId, Material replaceType, int forceData,
String user, Object object, String blockData)
{
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
List<Object> meta = Util.processMeta(block);
if (block instanceof Skull) {
SkullBreakLogger.log(preparedStmt, preparedStmtSkulls, batchCount, user, block);
} else {
BlockBreakLogger.log(
preparedStmt,
batchCount,
user,
block.getLocation(),
Util.getBlockId(blockType),
blockDataId,
meta,
block.getBlockData().getAsString(),
blockData);
BlockBreakLogger.log(preparedStmt, batchCount, user, block.getLocation(), Util.getBlockId(blockType),
blockDataId, meta, block.getBlockData().getAsString(), blockData);
}
}
}
}
@@ -10,26 +10,39 @@ import net.coreprotect.utility.Chat;
class BlockDataInsertProcess {
static void process(
PreparedStatement preparedStmt, Statement statement, int batchCount, Object name, int materialId) {
static void process(PreparedStatement preparedStmt, Statement statement, int batchCount, Object name,
int materialId)
{
if (name instanceof String) {
String query = "SELECT id FROM " + ConfigHandler.prefix + "blockdata_map WHERE id = '" + materialId
+ "' LIMIT 0, 1";
boolean hasMaterial = MaterialStatement.hasMaterial(statement, query);
if (!hasMaterial) {
MaterialStatement.insert(preparedStmt, batchCount, materialId, (String) name);
// validate ID maps to ensure mapping wasn't reloaded from database prior to this insertion completing
// validate ID maps to ensure mapping wasn't reloaded from database prior to
// this insertion completing
ConfigHandler.blockdata.put((String) name, materialId);
ConfigHandler.blockdataReversed.put(materialId, (String) name);
if (materialId > ConfigHandler.blockdataId) {
ConfigHandler.blockdataId = materialId;
}
} else {
Chat.console(Phrase.build(Phrase.CACHE_ERROR, "blockdata"));
Chat.console(Phrase.build(Phrase.CACHE_RELOAD, Selector.FIRST));
ConfigHandler.loadTypes(statement);
}
}
}
}
@@ -10,71 +10,41 @@ import org.bukkit.block.BlockState;
class BlockPlaceProcess {
static void process(
PreparedStatement preparedStmt,
PreparedStatement preparedStmtSkulls,
int batchCount,
Material blockType,
int blockData,
Material replaceType,
int replaceData,
int forceData,
String user,
Object object,
String newBlockData,
String replacedBlockData) {
static void process(PreparedStatement preparedStmt, PreparedStatement preparedStmtSkulls, int batchCount,
Material blockType, int blockData, Material replaceType, int replaceData, int forceData, String user,
Object object, String newBlockData, String replacedBlockData)
{
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
List<Object> meta = Util.processMeta(block);
if (blockType.equals(Material.SKELETON_SKULL)
|| blockType.equals(Material.SKELETON_WALL_SKULL)
if (blockType.equals(Material.SKELETON_SKULL) || blockType.equals(Material.SKELETON_WALL_SKULL)
|| blockType.equals(Material.WITHER_SKELETON_SKULL)
|| blockType.equals(Material.WITHER_SKELETON_WALL_SKULL)
|| blockType.equals(Material.ZOMBIE_HEAD)
|| blockType.equals(Material.ZOMBIE_WALL_HEAD)
|| blockType.equals(Material.PLAYER_HEAD)
|| blockType.equals(Material.PLAYER_WALL_HEAD)
|| blockType.equals(Material.CREEPER_HEAD)
|| blockType.equals(Material.CREEPER_WALL_HEAD)
|| blockType.equals(Material.DRAGON_HEAD)
|| blockType.equals(Material.DRAGON_WALL_HEAD)) {
SkullPlaceLogger.log(
preparedStmt,
preparedStmtSkulls,
batchCount,
user,
block,
Util.getBlockId(replaceType),
replaceData);
|| blockType.equals(Material.WITHER_SKELETON_WALL_SKULL) || blockType.equals(Material.ZOMBIE_HEAD)
|| blockType.equals(Material.ZOMBIE_WALL_HEAD) || blockType.equals(Material.PLAYER_HEAD)
|| blockType.equals(Material.PLAYER_WALL_HEAD) || blockType.equals(Material.CREEPER_HEAD)
|| blockType.equals(Material.CREEPER_WALL_HEAD) || blockType.equals(Material.DRAGON_HEAD)
|| blockType.equals(Material.DRAGON_WALL_HEAD))
{
SkullPlaceLogger.log(preparedStmt, preparedStmtSkulls, batchCount, user, block,
Util.getBlockId(replaceType), replaceData);
} else if (forceData == 1) {
BlockPlaceLogger.log(
preparedStmt,
batchCount,
user,
block,
Util.getBlockId(replaceType),
replaceData,
blockType,
blockData,
true,
meta,
newBlockData,
replacedBlockData);
BlockPlaceLogger.log(preparedStmt, batchCount, user, block, Util.getBlockId(replaceType), replaceData,
blockType, blockData, true, meta, newBlockData, replacedBlockData);
} else {
BlockPlaceLogger.log(
preparedStmt,
batchCount,
user,
block,
Util.getBlockId(replaceType),
replaceData,
blockType,
blockData,
false,
meta,
newBlockData,
replacedBlockData);
BlockPlaceLogger.log(preparedStmt, batchCount, user, block, Util.getBlockId(replaceType), replaceData,
blockType, blockData, false, meta, newBlockData, replacedBlockData);
}
}
}
}
@@ -10,22 +10,24 @@ import org.bukkit.inventory.ItemStack;
class ContainerBreakProcess {
static void process(
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
Material type,
String user,
Object object) {
static void process(PreparedStatement preparedStmt, int batchCount, int processId, int id, Material type,
String user, Object object)
{
if (object instanceof Location) {
Location location = (Location) object;
Map<Integer, ItemStack[]> containers = Consumer.consumerContainers.get(processId);
if (containers.get(id) != null) {
ItemStack[] container = containers.get(id);
ContainerBreakLogger.log(preparedStmt, batchCount, user, location, type, container);
containers.remove(id);
}
}
}
}
@@ -19,65 +19,73 @@ import org.bukkit.inventory.ItemStack;
class ContainerTransactionProcess {
static void process(
PreparedStatement preparedStmtContainer,
PreparedStatement preparedStmtItems,
int batchCount,
int processId,
int id,
Material type,
int forceData,
String user,
Object object) {
static void process(PreparedStatement preparedStmtContainer, PreparedStatement preparedStmtItems, int batchCount,
int processId, int id, Material type, int forceData, String user, Object object)
{
if (object instanceof Location) {
Location location = (Location) object;
Map<Integer, Object> inventories = Consumer.consumerInventories.get(processId);
if (inventories.get(id) != null) {
Object inventory = inventories.get(id);
String transactingChestId = location.getWorld().getUID().toString() + "." + location.getBlockX() + "."
+ location.getBlockY() + "." + location.getBlockZ();
String loggingChestId = user.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "."
+ location.getBlockY() + "." + location.getBlockZ();
if (ConfigHandler.loggingChest.get(loggingChestId) != null) {
int current_chest = ConfigHandler.loggingChest.get(loggingChestId);
if (ConfigHandler.oldContainer.get(loggingChestId) == null) {
return;
}
int force_size = 0;
if (ConfigHandler.forceContainer.get(loggingChestId) != null) {
force_size =
ConfigHandler.forceContainer.get(loggingChestId).size();
force_size = ConfigHandler.forceContainer.get(loggingChestId).size();
}
if (current_chest == forceData
|| force_size > 0) { // This prevents client side chest sorting mods from messing things up.
ContainerLogger.log(
preparedStmtContainer, preparedStmtItems, batchCount, user, type, inventory, location);
if (current_chest == forceData || force_size > 0) { // This prevents client side chest sorting mods
// from messing things up.
ContainerLogger.log(preparedStmtContainer, preparedStmtItems, batchCount, user, type, inventory,
location);
List<ItemStack[]> old = ConfigHandler.oldContainer.get(loggingChestId);
if (old.size() == 0) {
ConfigHandler.oldContainer.remove(loggingChestId);
ConfigHandler.loggingChest.remove(loggingChestId);
ConfigHandler.transactingChest.remove(transactingChestId);
}
} else if (loggingChestId.startsWith("#hopper")) {
List<Object> transactingChest = ConfigHandler.transactingChest.get(transactingChestId);
if (force_size == 0
&& ConfigHandler.oldContainer
.getOrDefault(
loggingChestId, Collections.synchronizedList(new ArrayList<>()))
.size()
== 1
&& transactingChest != null
&& transactingChest.isEmpty()) {
if (force_size == 0 && ConfigHandler.oldContainer
.getOrDefault(loggingChestId, Collections.synchronizedList(new ArrayList<>()))
.size() == 1 && transactingChest != null && transactingChest.isEmpty())
{
int loopCount = ConfigHandler.loggingChest.getOrDefault(loggingChestId, 0);
int maxInventorySize = (99 * 54);
try {
Inventory checkInventory = (Inventory) inventory;
maxInventorySize = checkInventory.getSize() * checkInventory.getMaxStackSize();
} catch (Exception e) {
// use default of 5,346
}
if (loopCount > maxInventorySize) {
ItemStack[] destinationContents = null;
ItemStack movedItem = null;
@@ -85,28 +93,46 @@ class ContainerTransactionProcess {
+ "." + location.getBlockZ();
Object[] hopperPushData = ConfigHandler.hopperSuccess.remove(hopperPush);
if (hopperPushData != null) {
destinationContents = (ItemStack[]) hopperPushData[0];
movedItem = (ItemStack) hopperPushData[1];
}
if (destinationContents != null) {
Set<ItemStack> movedItems = new HashSet<>();
Object[] lastAbort = ConfigHandler.hopperAbort.get(hopperPush);
if (lastAbort != null
&& Arrays.equals(destinationContents, (ItemStack[]) lastAbort[1])) {
&& Arrays.equals(destinationContents, (ItemStack[]) lastAbort[1]))
{
((Set<?>) lastAbort[0])
.forEach(itemStack -> movedItems.add((ItemStack) itemStack));
}
movedItems.add(movedItem);
ConfigHandler.hopperAbort.put(
hopperPush, new Object[] {movedItems, destinationContents});
ConfigHandler.hopperAbort.put(hopperPush,
new Object[]
{ movedItems, destinationContents });
}
}
}
}
}
inventories.remove(id);
}
}
}
}
@@ -10,26 +10,39 @@ import net.coreprotect.utility.Chat;
class EntityInsertProcess {
static void process(
PreparedStatement preparedStmt, Statement statement, int batchCount, Object name, int materialId) {
static void process(PreparedStatement preparedStmt, Statement statement, int batchCount, Object name,
int materialId)
{
if (name instanceof String) {
String query =
"SELECT id FROM " + ConfigHandler.prefix + "entity_map WHERE id = '" + materialId + "' LIMIT 0, 1";
String query = "SELECT id FROM " + ConfigHandler.prefix + "entity_map WHERE id = '" + materialId
+ "' LIMIT 0, 1";
boolean hasMaterial = MaterialStatement.hasMaterial(statement, query);
if (!hasMaterial) {
MaterialStatement.insert(preparedStmt, batchCount, materialId, (String) name);
// validate ID maps to ensure mapping wasn't reloaded from database prior to this insertion completing
// validate ID maps to ensure mapping wasn't reloaded from database prior to
// this insertion completing
ConfigHandler.entities.put((String) name, materialId);
ConfigHandler.entitiesReversed.put(materialId, (String) name);
if (materialId > ConfigHandler.entityId) {
ConfigHandler.entityId = materialId;
}
} else {
Chat.console(Phrase.build(Phrase.CACHE_ERROR, "entity"));
Chat.console(Phrase.build(Phrase.CACHE_RELOAD, Selector.FIRST));
ConfigHandler.loadTypes(statement);
}
}
}
}
@@ -11,24 +11,26 @@ import org.bukkit.entity.EntityType;
class EntityKillProcess {
static void process(
PreparedStatement preparedStmt,
PreparedStatement preparedStmtEntities,
int batchCount,
int processId,
int id,
Object object,
String user) {
static void process(PreparedStatement preparedStmt, PreparedStatement preparedStmtEntities, int batchCount,
int processId, int id, Object object, String user)
{
if (object instanceof Object[]) {
BlockState block = (BlockState) ((Object[]) object)[0];
EntityType type = (EntityType) ((Object[]) object)[1];
Map<Integer, List<Object>> objectLists = Consumer.consumerObjectList.get(processId);
if (objectLists.get(id) != null) {
List<Object> objectList = objectLists.get(id);
int entityId = Util.getEntityId(type);
EntityKillLogger.log(preparedStmt, preparedStmtEntities, batchCount, user, block, objectList, entityId);
objectLists.remove(id);
}
}
}
}
@@ -11,12 +11,17 @@ import org.bukkit.entity.EntityType;
class EntitySpawnProcess {
static void process(Statement statement, Object object, int rowId) {
if (object instanceof Object[]) {
BlockState block = (BlockState) ((Object[]) object)[0];
EntityType type = (EntityType) ((Object[]) object)[1];
String query = "SELECT data FROM " + ConfigHandler.prefix + "entity WHERE rowid='" + rowId + "' LIMIT 0, 1";
List<Object> data = EntityStatement.getData(statement, block, query);
EntityUtil.spawnEntity(block, type, data);
}
}
}
@@ -9,22 +9,18 @@ import org.bukkit.Location;
class ItemTransactionProcess extends Queue {
static void process(
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
int forceData,
int time,
int offset,
String user,
Object object) {
static void process(PreparedStatement preparedStmt, int batchCount, int processId, int id, int forceData, int time,
int offset, String user, Object object)
{
if (object instanceof Location) {
Location location = (Location) object;
String loggingItemId = user.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "."
+ location.getBlockY() + "." + location.getBlockZ();
if (ConfigHandler.loggingItem.get(loggingItemId) != null) {
int current_chest = ConfigHandler.loggingItem.get(loggingItemId);
if (ConfigHandler.itemsPickup.get(loggingItemId) == null
&& ConfigHandler.itemsDrop.get(loggingItemId) == null
@@ -34,12 +30,18 @@ class ItemTransactionProcess extends Queue {
&& ConfigHandler.itemsDestroy.get(loggingItemId) == null
&& ConfigHandler.itemsCreate.get(loggingItemId) == null
&& ConfigHandler.itemsSell.get(loggingItemId) == null
&& ConfigHandler.itemsBuy.get(loggingItemId) == null) {
&& ConfigHandler.itemsBuy.get(loggingItemId) == null)
{
return;
}
if (current_chest == forceData) {
int currentTime = (int) (System.currentTimeMillis() / 1000L);
if (currentTime > time) {
ItemLogger.log(preparedStmt, batchCount, location, offset, user);
ConfigHandler.itemsPickup.remove(loggingItemId);
ConfigHandler.itemsDrop.remove(loggingItemId);
@@ -51,11 +53,19 @@ class ItemTransactionProcess extends Queue {
ConfigHandler.itemsSell.remove(loggingItemId);
ConfigHandler.itemsBuy.remove(loggingItemId);
ConfigHandler.loggingItem.remove(loggingItemId);
} else {
Queue.queueItemTransaction(user, location, time, offset, forceData);
}
}
}
}
}
}
@@ -10,26 +10,39 @@ import net.coreprotect.utility.Chat;
class MaterialInsertProcess {
static void process(
PreparedStatement preparedStmt, Statement statement, int batchCount, Object name, int materialId) {
static void process(PreparedStatement preparedStmt, Statement statement, int batchCount, Object name,
int materialId)
{
if (name instanceof String) {
String query = "SELECT id FROM " + ConfigHandler.prefix + "material_map WHERE id = '" + materialId
+ "' LIMIT 0, 1";
boolean hasMaterial = MaterialStatement.hasMaterial(statement, query);
if (!hasMaterial) {
MaterialStatement.insert(preparedStmt, batchCount, materialId, (String) name);
// validate ID maps to ensure mapping wasn't reloaded from database prior to this insertion completing
// validate ID maps to ensure mapping wasn't reloaded from database prior to
// this insertion completing
ConfigHandler.materials.put((String) name, materialId);
ConfigHandler.materialsReversed.put(materialId, (String) name);
if (materialId > ConfigHandler.materialId) {
ConfigHandler.materialId = materialId;
}
} else {
Chat.console(Phrase.build(Phrase.CACHE_ERROR, "material"));
Chat.console(Phrase.build(Phrase.CACHE_RELOAD, Selector.FIRST));
ConfigHandler.loadTypes(statement);
}
}
}
}
@@ -13,40 +13,36 @@ import org.bukkit.block.BlockState;
class NaturalBlockBreakProcess {
static void process(
Statement statement,
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
String user,
Object object,
Material blockType,
int blockData,
String overrideData) {
static void process(Statement statement, PreparedStatement preparedStmt, int batchCount, int processId, int id,
String user, Object object, Material blockType, int blockData, String overrideData)
{
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
Map<Integer, List<BlockState>> blockLists = Consumer.consumerBlockList.get(processId);
if (blockLists.get(id) != null) {
List<BlockState> blockStateList = blockLists.get(id);
for (BlockState blockState : blockStateList) {
String removed = Lookup.whoRemovedCache(blockState);
if (removed.length() > 0) {
user = removed;
}
}
blockLists.remove(id);
BlockBreakLogger.log(
preparedStmt,
batchCount,
user,
block.getLocation(),
Util.getBlockId(blockType),
blockData,
null,
block.getBlockData().getAsString(),
overrideData);
BlockBreakLogger.log(preparedStmt, batchCount, user, block.getLocation(), Util.getBlockId(blockType),
blockData, null, block.getBlockData().getAsString(), overrideData);
}
}
}
}
@@ -8,22 +8,32 @@ import org.bukkit.Location;
class PlayerChatProcess {
static void process(
PreparedStatement preparedStmt, int batchCount, int processId, int id, Object object, String user) {
static void process(PreparedStatement preparedStmt, int batchCount, int processId, int id, Object object,
String user)
{
if (!(object instanceof Object[])) {
return;
}
Object[] data = (Object[]) object;
if (data[1] instanceof Location) {
Map<Integer, String> strings = Consumer.consumerStrings.get(processId);
if (strings.get(id) != null) {
String message = strings.get(id);
Long timestamp = (Long) data[0];
Location location = (Location) data[1];
ChatLogger.log(preparedStmt, batchCount, timestamp, location, user, message);
strings.remove(id);
}
}
}
}
@@ -8,22 +8,32 @@ import org.bukkit.Location;
class PlayerCommandProcess {
static void process(
PreparedStatement preparedStmt, int batchCount, int processId, int id, Object object, String user) {
static void process(PreparedStatement preparedStmt, int batchCount, int processId, int id, Object object,
String user)
{
if (!(object instanceof Object[])) {
return;
}
Object[] data = (Object[]) object;
if (data[1] instanceof Location) {
Map<Integer, String> strings = Consumer.consumerStrings.get(processId);
if (strings.get(id) != null) {
String message = strings.get(id);
Long timestamp = (Long) data[0];
Location location = (Location) data[1];
CommandLogger.log(preparedStmt, batchCount, timestamp, location, user, message);
strings.remove(id);
}
}
}
}
@@ -8,9 +8,14 @@ import org.bukkit.block.BlockState;
class PlayerInteractionProcess {
static void process(PreparedStatement preparedStmt, int batchCount, String user, Object object, Material type) {
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
PlayerInteractLogger.log(preparedStmt, batchCount, user, block, type);
}
}
}
@@ -7,10 +7,15 @@ import org.bukkit.block.BlockState;
class PlayerKillProcess {
static void process(PreparedStatement preparedStmt, int batchCount, int id, Object object, String user) {
if (object instanceof Object[]) {
BlockState block = (BlockState) ((Object[]) object)[0];
String player = (String) ((Object[]) object)[1];
PlayerKillLogger.log(preparedStmt, batchCount, user, block, player);
}
}
}
@@ -10,28 +10,30 @@ import org.bukkit.Location;
class PlayerLoginProcess {
static void process(
Connection connection,
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
Object object,
int configSessions,
int configUsernames,
int time,
String user) {
static void process(Connection connection, PreparedStatement preparedStmt, int batchCount, int processId, int id,
Object object, int configSessions, int configUsernames, int time, String user)
{
if (object instanceof Location) {
Map<Integer, String> strings = Consumer.consumerStrings.get(processId);
if (strings.get(id) != null) {
String uuid = strings.get(id);
Location location = (Location) object;
UsernameLogger.log(connection, user, uuid, configUsernames, time);
if (configSessions == 1) {
PlayerSessionLogger.log(preparedStmt, batchCount, user, location, time, 1);
}
strings.remove(id);
}
}
}
}
@@ -7,9 +7,14 @@ import org.bukkit.Location;
class PlayerLogoutProcess {
static void process(PreparedStatement preparedStmt, int batchCount, Object object, int time, String user) {
if (object instanceof Location) {
Location location = (Location) object;
PlayerSessionLogger.log(preparedStmt, batchCount, user, location, time, 0);
}
}
}
@@ -49,27 +49,41 @@ public class Process {
private static volatile int currentConsumerSize = 0;
public static int getCurrentConsumerSize() {
return currentConsumerSize;
}
protected static void updateLockTable(Statement statement, int locked) {
try {
int unixTimestamp = (int) (System.currentTimeMillis() / 1000L);
int timeSinceLastUpdate = unixTimestamp - lastLockUpdate;
if (timeSinceLastUpdate >= 15 || locked == 0) {
statement.executeUpdate("UPDATE " + ConfigHandler.prefix + "database_lock SET status = '" + locked
+ "', time = '" + unixTimestamp + "' WHERE rowid = '1'");
lastLockUpdate = unixTimestamp;
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void processConsumer(int processId, boolean lastRun) {
try (Connection connection = Database.getConnection(false, 500)) {
if (connection == null) {
return;
}
Statement statement = connection.createStatement();
@@ -83,25 +97,34 @@ public class Process {
currentConsumerSize = consumerDataSize;
if (currentConsumerSize == 0) { // No data, skip processing
updateLockTable(statement, (lastRun ? 0 : 1));
statement.close();
Consumer.consumer_id.put(processId, new Integer[] { 0, 0 });
Consumer.isPaused = false;
return;
}
Database.beginTransaction(statement, Config.getGlobal().MYSQL);
// Scan through usernames, ensure everything is loaded in memory.
for (Entry<Integer, String[]> entry : users.entrySet()) {
String[] data = entry.getValue();
if (data != null) {
String user = data[0];
String uuid = data[1];
if (user != null && ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT)) == null) {
UserStatement.loadId(connection, user, uuid);
}
}
}
updateLockTable(statement, (lastRun ? 0 : 1));
Database.commitTransaction(statement, Config.getGlobal().MYSQL);
@@ -124,8 +147,10 @@ public class Process {
// Scan through consumer data
Database.beginTransaction(statement, Config.getGlobal().MYSQL);
for (int i = 0; i < consumerDataSize; i++) {
Object[] data = consumerData.get(i);
if (data != null) {
int id = (int) data[0];
int action = (int) data[1];
Material blockType = (Material) data[2];
@@ -135,87 +160,46 @@ public class Process {
int forceData = (int) data[6];
if (users.get(id) != null && consumerObject.get(id) != null) {
String user = users.get(id)[0];
Object object = consumerObject.get(id);
try {
switch (action) {
case Process.BLOCK_BREAK:
BlockBreakProcess.process(
preparedStmtBlocks,
preparedStmtSkulls,
i,
processId,
id,
blockType,
blockData,
replaceType,
forceData,
user,
object,
BlockBreakProcess.process(preparedStmtBlocks, preparedStmtSkulls, i, processId, id,
blockType, blockData, replaceType, forceData, user, object,
(String) data[7]);
break;
case Process.BLOCK_PLACE:
BlockPlaceProcess.process(
preparedStmtBlocks,
preparedStmtSkulls,
i,
blockType,
blockData,
replaceType,
replaceData,
forceData,
user,
object,
(String) data[7],
(String) data[8]);
BlockPlaceProcess.process(preparedStmtBlocks, preparedStmtSkulls, i, blockType,
blockData, replaceType, replaceData, forceData, user, object,
(String) data[7], (String) data[8]);
break;
case Process.SIGN_TEXT:
SignTextProcess.process(
preparedStmtSigns,
i,
processId,
id,
forceData,
user,
object,
replaceData,
blockData);
SignTextProcess.process(preparedStmtSigns, i, processId, id, forceData, user,
object, replaceData, blockData);
break;
case Process.CONTAINER_BREAK:
ContainerBreakProcess.process(
preparedStmtContainers, i, processId, id, blockType, user, object);
ContainerBreakProcess.process(preparedStmtContainers, i, processId, id, blockType,
user, object);
break;
case Process.PLAYER_INTERACTION:
PlayerInteractionProcess.process(preparedStmtBlocks, i, user, object, blockType);
break;
case Process.CONTAINER_TRANSACTION:
ContainerTransactionProcess.process(
preparedStmtContainers,
preparedStmtItems,
i,
processId,
id,
blockType,
forceData,
user,
object);
ContainerTransactionProcess.process(preparedStmtContainers, preparedStmtItems, i,
processId, id, blockType, forceData, user, object);
break;
case Process.ITEM_TRANSACTION:
ItemTransactionProcess.process(
preparedStmtItems,
i,
processId,
id,
forceData,
replaceData,
blockData,
user,
object);
ItemTransactionProcess.process(preparedStmtItems, i, processId, id, forceData,
replaceData, blockData, user, object);
break;
case Process.STRUCTURE_GROWTH:
StructureGrowthProcess.process(
statement, preparedStmtBlocks, i, processId, id, user, object, forceData);
StructureGrowthProcess.process(statement, preparedStmtBlocks, i, processId, id,
user, object, forceData);
break;
case Process.ROLLBACK_UPDATE:
RollbackUpdateProcess.process(statement, processId, id, forceData, 0);
@@ -248,44 +232,26 @@ public class Process {
PlayerCommandProcess.process(preparedStmtCommand, i, processId, id, object, user);
break;
case Process.PLAYER_LOGIN:
PlayerLoginProcess.process(
connection,
preparedStmtSession,
i,
processId,
id,
object,
blockData,
replaceData,
forceData,
user);
PlayerLoginProcess.process(connection, preparedStmtSession, i, processId, id,
object, blockData, replaceData, forceData, user);
break;
case Process.PLAYER_LOGOUT:
PlayerLogoutProcess.process(preparedStmtSession, i, object, forceData, user);
break;
case Process.ENTITY_KILL:
EntityKillProcess.process(
preparedStmtBlocks, preparedStmtEntities, i, processId, id, object, user);
EntityKillProcess.process(preparedStmtBlocks, preparedStmtEntities, i, processId,
id, object, user);
break;
case Process.ENTITY_SPAWN:
EntitySpawnProcess.process(statement, object, forceData);
break;
case Process.NATURAL_BLOCK_BREAK:
NaturalBlockBreakProcess.process(
statement,
preparedStmtBlocks,
i,
processId,
id,
user,
object,
blockType,
blockData,
(String) data[7]);
NaturalBlockBreakProcess.process(statement, preparedStmtBlocks, i, processId, id,
user, object, blockType, blockData, (String) data[7]);
break;
case Process.MATERIAL_INSERT:
MaterialInsertProcess.process(
preparedStmtMaterials, statement, i, object, forceData);
MaterialInsertProcess.process(preparedStmtMaterials, statement, i, object,
forceData);
break;
case Process.ART_INSERT:
ArtInsertProcess.process(preparedStmtArt, statement, i, object, forceData);
@@ -297,67 +263,60 @@ public class Process {
PlayerKillProcess.process(preparedStmtBlocks, i, id, object, user);
break;
case Process.BLOCKDATA_INSERT:
BlockDataInsertProcess.process(
preparedStmtBlockdata, statement, i, object, forceData);
BlockDataInsertProcess.process(preparedStmtBlockdata, statement, i, object,
forceData);
break;
}
// If database connection goes missing, remove processed data from consumer and abort
// If database connection goes missing, remove processed data from consumer and
// abort
if (statement.isClosed()) {
for (int index = (i - 1); index >= 0; index--) {
consumerData.remove(index);
}
currentConsumerSize = 0;
Consumer.consumer_id.put(processId, new Integer[] { 0, 0 });
Consumer.isPaused = false;
return;
}
// If interrupt requested, commit data, sleep, and resume processing
if (Consumer.interrupt) {
commit(
statement,
preparedStmtSigns,
preparedStmtBlocks,
preparedStmtSkulls,
preparedStmtContainers,
preparedStmtItems,
preparedStmtWorlds,
preparedStmtChat,
preparedStmtCommand,
preparedStmtSession,
preparedStmtEntities,
preparedStmtMaterials,
preparedStmtArt,
preparedStmtEntity,
commit(statement, preparedStmtSigns, preparedStmtBlocks, preparedStmtSkulls,
preparedStmtContainers, preparedStmtItems, preparedStmtWorlds, preparedStmtChat,
preparedStmtCommand, preparedStmtSession, preparedStmtEntities,
preparedStmtMaterials, preparedStmtArt, preparedStmtEntity,
preparedStmtBlockdata);
Thread.sleep(500);
Database.beginTransaction(statement, Config.getGlobal().MYSQL);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
currentConsumerSize--;
}
// commit data to database
commit(
statement,
preparedStmtSigns,
preparedStmtBlocks,
preparedStmtSkulls,
preparedStmtContainers,
preparedStmtItems,
preparedStmtWorlds,
preparedStmtChat,
preparedStmtCommand,
preparedStmtSession,
preparedStmtEntities,
preparedStmtMaterials,
preparedStmtArt,
preparedStmtEntity,
commit(statement, preparedStmtSigns, preparedStmtBlocks, preparedStmtSkulls, preparedStmtContainers,
preparedStmtItems, preparedStmtWorlds, preparedStmtChat, preparedStmtCommand, preparedStmtSession,
preparedStmtEntities, preparedStmtMaterials, preparedStmtArt, preparedStmtEntity,
preparedStmtBlockdata);
// close connections/statements
@@ -381,31 +340,30 @@ public class Process {
users.clear();
consumerObject.clear();
consumerData.clear();
} catch (Exception e) {
e.printStackTrace();
}
Consumer.consumer_id.put(processId, new Integer[] { 0, 0 });
Consumer.isPaused = false;
}
private static void commit(
Statement statement,
PreparedStatement preparedStmtSigns,
PreparedStatement preparedStmtBlocks,
PreparedStatement preparedStmtSkulls,
PreparedStatement preparedStmtContainers,
PreparedStatement preparedStmtItems,
PreparedStatement preparedStmtWorlds,
PreparedStatement preparedStmtChat,
PreparedStatement preparedStmtCommand,
PreparedStatement preparedStmtSession,
PreparedStatement preparedStmtEntities,
PreparedStatement preparedStmtMaterials,
PreparedStatement preparedStmtArt,
PreparedStatement preparedStmtEntity,
PreparedStatement preparedStmtBlockdata) {
private static void commit(Statement statement, PreparedStatement preparedStmtSigns,
PreparedStatement preparedStmtBlocks, PreparedStatement preparedStmtSkulls,
PreparedStatement preparedStmtContainers, PreparedStatement preparedStmtItems,
PreparedStatement preparedStmtWorlds, PreparedStatement preparedStmtChat,
PreparedStatement preparedStmtCommand, PreparedStatement preparedStmtSession,
PreparedStatement preparedStmtEntities, PreparedStatement preparedStmtMaterials,
PreparedStatement preparedStmtArt, PreparedStatement preparedStmtEntity,
PreparedStatement preparedStmtBlockdata)
{
try {
preparedStmtSigns.executeBatch();
preparedStmtBlocks.executeBatch();
preparedStmtSkulls.executeBatch();
@@ -421,8 +379,13 @@ public class Process {
preparedStmtEntity.executeBatch();
preparedStmtBlockdata.executeBatch();
Database.commitTransaction(statement, Config.getGlobal().MYSQL);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -10,18 +10,28 @@ import net.coreprotect.utility.Util;
class RollbackUpdateProcess {
static void process(Statement statement, int processId, int id, int action, int table) {
Map<Integer, List<Object[]>> updateLists = Consumer.consumerObjectArrayList.get(processId);
if (updateLists.get(id) != null) {
List<Object[]> list = updateLists.get(id);
for (Object[] listRow : list) {
long rowid = (Long) listRow[0];
int rolledBack = (Integer) listRow[9];
if (Util.rolledBack(rolledBack, (table == 2 || table == 3 || table == 4))
== action) { // 1 = restore, 0 = rollback
if (Util.rolledBack(rolledBack, (table == 2 || table == 3 || table == 4)) == action) { // 1 = restore, 0
// = rollback
Database.performUpdate(statement, rowid, rolledBack, table);
}
}
updateLists.remove(id);
}
}
}
@@ -8,43 +8,27 @@ import org.bukkit.Location;
class SignTextProcess {
static void process(
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
int forceData,
String user,
Object object,
int action,
int color) {
static void process(PreparedStatement preparedStmt, int batchCount, int processId, int id, int forceData,
String user, Object object, int action, int color)
{
if (object instanceof Location) {
Location location = (Location) object;
Map<Integer, Object[]> signs = Consumer.consumerSigns.get(processId);
if (signs.get(id) != null) {
Object[] SIGN_DATA = signs.get(id);
SignTextLogger.log(
preparedStmt,
batchCount,
user,
location,
action,
color,
(Integer) SIGN_DATA[0],
(Integer) SIGN_DATA[1],
(Boolean) SIGN_DATA[2],
(Boolean) SIGN_DATA[3],
(String) SIGN_DATA[4],
(String) SIGN_DATA[5],
(String) SIGN_DATA[6],
(String) SIGN_DATA[7],
(String) SIGN_DATA[8],
(String) SIGN_DATA[9],
(String) SIGN_DATA[10],
(String) SIGN_DATA[11],
forceData);
SignTextLogger.log(preparedStmt, batchCount, user, location, action, color, (Integer) SIGN_DATA[0],
(Integer) SIGN_DATA[1], (Boolean) SIGN_DATA[2], (Boolean) SIGN_DATA[3], (String) SIGN_DATA[4],
(String) SIGN_DATA[5], (String) SIGN_DATA[6], (String) SIGN_DATA[7], (String) SIGN_DATA[8],
(String) SIGN_DATA[9], (String) SIGN_DATA[10], (String) SIGN_DATA[11], forceData);
signs.remove(id);
}
}
}
}
@@ -10,12 +10,13 @@ import org.bukkit.block.BlockState;
class SignUpdateProcess {
static void process(Statement statement, Object object, String user, int action, int time) {
/*
* We're switching blocks around quickly.
* This block could already be removed again by the time the server tries to modify it.
* Ignore any errors.
* We're switching blocks around quickly. This block could already be removed
* again by the time the server tries to modify it. Ignore any errors.
*/
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
int x = block.getX();
int y = block.getY();
@@ -24,20 +25,26 @@ class SignUpdateProcess {
int userid = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
String query = "";
if (action == 0) {
query =
"SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM "
+ ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid
+ "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time < '" + time
query = "SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM "
+ ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x
+ "' AND z='" + z + "' AND y='" + y + "' AND time < '" + time
+ "' ORDER BY rowid DESC LIMIT 0, 1";
} else {
query =
"SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM "
+ ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid
+ "' AND x='" + x + "' AND z='" + z + "' AND y='" + y + "' AND time >= '" + time
query = "SELECT color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8 FROM "
+ ConfigHandler.prefix + "sign WHERE user='" + userid + "' AND wid='" + wid + "' AND x='" + x
+ "' AND z='" + z + "' AND y='" + y + "' AND time >= '" + time
+ "' ORDER BY rowid ASC LIMIT 0, 1";
}
SignStatement.getData(statement, block, query);
Util.updateBlock(block);
}
}
}
@@ -9,17 +9,21 @@ import org.bukkit.block.BlockState;
class SkullUpdateProcess {
static void process(Statement statement, Object object, int rowId) {
/*
* We're switching blocks around quickly.
* This block could already be removed again by the time the server tries to modify it.
* Ignore any errors.
* We're switching blocks around quickly. This block could already be removed
* again by the time the server tries to modify it. Ignore any errors.
*/
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
String query =
"SELECT owner, skin FROM " + ConfigHandler.prefix + "skull WHERE rowid='" + rowId + "' LIMIT 0, 1";
String query = "SELECT owner, skin FROM " + ConfigHandler.prefix + "skull WHERE rowid='" + rowId
+ "' LIMIT 0, 1";
SkullStatement.getData(statement, block, query);
Util.updateBlock(block);
}
}
}
@@ -13,48 +13,56 @@ import org.bukkit.block.BlockState;
class StructureGrowthProcess {
static void process(
Statement statement,
PreparedStatement preparedStmt,
int batchCount,
int processId,
int id,
String user,
Object object,
int replaceBlockCount) {
static void process(Statement statement, PreparedStatement preparedStmt, int batchCount, int processId, int id,
String user, Object object, int replaceBlockCount)
{
if (object instanceof BlockState) {
BlockState block = (BlockState) object;
Map<Integer, List<BlockState>> blockLists = Consumer.consumerBlockList.get(processId);
if (blockLists.get(id) != null) {
List<BlockState> blockStates = blockLists.get(id);
String resultData = Lookup.whoPlacedCache(block);
if (resultData.isEmpty()) {
resultData = Lookup.whoPlaced(statement, block);
}
if (resultData.length() > 0) {
user = resultData;
}
int count = 0;
for (BlockState blockState : blockStates) {
if (count < replaceBlockCount) {
BlockBreakLogger.log(
preparedStmt,
batchCount,
user,
blockState.getLocation(),
Util.getBlockId(blockState.getType()),
0,
null,
blockState.getBlockData().getAsString(),
BlockBreakLogger.log(preparedStmt, batchCount, user, blockState.getLocation(),
Util.getBlockId(blockState.getType()), 0, null, blockState.getBlockData().getAsString(),
null);
} else {
BlockPlaceLogger.log(
preparedStmt, batchCount, user, blockState, 0, 0, null, -1, false, null, null, null);
BlockPlaceLogger.log(preparedStmt, batchCount, user, blockState, 0, 0, null, -1, false, null,
null, null);
}
count++;
}
blockLists.remove(id);
}
}
}
}
@@ -11,25 +11,38 @@ import net.coreprotect.utility.Chat;
class WorldInsertProcess {
static void process(
PreparedStatement preparedStmt, int batchCount, Statement statement, Object world, int worldId) {
static void process(PreparedStatement preparedStmt, int batchCount, Statement statement, Object world,
int worldId)
{
if (world instanceof String) {
String query = "SELECT id FROM " + ConfigHandler.prefix + "world WHERE id = '" + worldId + "' LIMIT 0, 1";
boolean hasMaterial = MaterialStatement.hasMaterial(statement, query);
if (!hasMaterial) {
WorldStatement.insert(preparedStmt, batchCount, worldId, (String) world);
// validate ID maps to ensure mapping wasn't reloaded from database prior to this insertion completing
// validate ID maps to ensure mapping wasn't reloaded from database prior to
// this insertion completing
ConfigHandler.worlds.put((String) world, worldId);
ConfigHandler.worldsReversed.put(worldId, (String) world);
if (worldId > ConfigHandler.worldId) {
ConfigHandler.worldId = worldId;
}
} else {
Chat.console(Phrase.build(Phrase.CACHE_ERROR, "world"));
Chat.console(Phrase.build(Phrase.CACHE_RELOAD, Selector.SECOND));
ConfigHandler.loadWorlds(statement);
}
}
}
}
@@ -29,70 +29,46 @@ import org.bukkit.inventory.ItemStack;
public class ContainerRollback extends Rollback {
public static void performContainerRollbackRestore(
Statement statement,
CommandSender user,
List<String> checkUuids,
List<String> checkUsers,
String timeString,
List<Object> restrictList,
Map<Object, Boolean> excludeList,
List<String> excludeUserList,
List<Integer> actionList,
final Location location,
Integer[] radius,
long startTime,
long endTime,
boolean restrictWorld,
boolean lookup,
boolean verbose,
final int rollbackType) {
public static void performContainerRollbackRestore(Statement statement, CommandSender user, List<String> checkUuids,
List<String> checkUsers, String timeString, List<Object> restrictList, Map<Object, Boolean> excludeList,
List<String> excludeUserList, List<Integer> actionList, final Location location, Integer[] radius,
long startTime, long endTime, boolean restrictWorld, boolean lookup, boolean verbose,
final int rollbackType)
{
try {
long timeStart = System.currentTimeMillis();
final List<Object[]> lookupList = Lookup.performLookupRaw(
statement,
user,
checkUuids,
checkUsers,
restrictList,
excludeList,
excludeUserList,
actionList,
location,
radius,
null,
startTime,
endTime,
-1,
-1,
restrictWorld,
lookup);
final List<Object[]> lookupList = Lookup.performLookupRaw(statement, user, checkUuids, checkUsers,
restrictList, excludeList, excludeUserList, actionList, location, radius, null, startTime, endTime,
-1, -1, restrictWorld, lookup);
if (rollbackType == 1) {
Collections.reverse(lookupList);
}
String userString = "#server";
if (user != null) {
userString = user.getName();
}
Queue.queueRollbackUpdate(
userString,
location,
lookupList,
Process.CONTAINER_ROLLBACK_UPDATE,
Queue.queueRollbackUpdate(userString, location, lookupList, Process.CONTAINER_ROLLBACK_UPDATE,
rollbackType); // Perform update transaction in consumer
final String finalUserString = userString;
ConfigHandler.rollbackHash.put(userString, new int[] { 0, 0, 0, 0, 0 });
Scheduler.scheduleSyncDelayedTask(
CoreProtect.getInstance(),
new Runnable() {
Scheduler.scheduleSyncDelayedTask(CoreProtect.getInstance(), new Runnable() {
@Override
public void run() {
try {
int[] rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
int itemCount = rollbackHashData[0];
// int blockCount = rollbackHashData[1];
@@ -100,34 +76,52 @@ public class ContainerRollback extends Rollback {
Block block = location.getBlock();
if (!block.getWorld().isChunkLoaded(block.getChunk())) {
block.getWorld().getChunkAt(block.getLocation());
}
Object container = null;
Material type = block.getType();
List<ItemFrame> matchingFrames = new ArrayList<>();
if (BlockGroup.CONTAINERS.contains(type)) {
container = Util.getContainerInventory(block.getState(), false);
} else {
for (Entity entity : block.getChunk().getEntities()) {
if (entity.getLocation().getBlockX() == location.getBlockX()
&& entity.getLocation().getBlockY() == location.getBlockY()
&& entity.getLocation().getBlockZ() == location.getBlockZ()) {
&& entity.getLocation().getBlockZ() == location.getBlockZ())
{
if (entity instanceof ArmorStand) {
type = Material.ARMOR_STAND;
container = Util.getEntityEquipment((LivingEntity) entity);
} else if (entity instanceof ItemFrame) {
type = Material.ITEM_FRAME;
container = entity;
matchingFrames.add((ItemFrame) entity);
}
}
}
}
int modifyCount = 0;
if (container != null) {
for (Object[] lookupRow : lookupList) {
// int unixtimestamp = (int) (System.currentTimeMillis() / 1000L);
// int rowId = lookupRow[0];
// int rowTime = (Integer)lookupRow[1];
@@ -145,67 +139,92 @@ public class ContainerRollback extends Rollback {
Material rowType = Util.getType(rowTypeRaw);
if ((rollbackType == 0 && rowRolledBack == 0)
|| (rollbackType == 1 && rowRolledBack == 1)) {
|| (rollbackType == 1 && rowRolledBack == 1))
{
modifyCount = modifyCount + rowAmount;
int action = 0;
if (rollbackType == 0 && rowAction == 0) {
action = 1;
}
if (rollbackType == 1 && rowAction == 1) {
action = 1;
}
ItemStack itemstack = new ItemStack(rowType, rowAmount);
Object[] populatedStack =
Rollback.populateItemStack(itemstack, rowMetadata);
Object[] populatedStack = Rollback.populateItemStack(itemstack, rowMetadata);
int slot = (Integer) populatedStack[0];
String faceData = (String) populatedStack[1];
itemstack = (ItemStack) populatedStack[2];
if (type == Material.ITEM_FRAME && faceData.length() > 0) {
BlockFace blockFace = BlockFace.valueOf(faceData);
ItemFrame itemFrame = (ItemFrame) container;
if (blockFace != itemFrame.getFacing()) {
for (ItemFrame frame : matchingFrames) {
if (blockFace == frame.getFacing()) {
container = frame;
break;
}
}
}
}
Rollback.modifyContainerItems(type, container, slot, itemstack, action);
}
}
}
matchingFrames.clear();
ConfigHandler.rollbackHash.put(
finalUserString, new int[] {itemCount, modifyCount, entityCount, 1, 1});
ConfigHandler.rollbackHash.put(finalUserString,
new int[]
{ itemCount, modifyCount, entityCount, 1, 1 });
} catch (Exception e) {
e.printStackTrace();
}
}
},
location,
0);
}, location, 0);
int[] rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
int next = rollbackHashData[3];
int sleepTime = 0;
while (next == 0) {
sleepTime = sleepTime + 5;
Thread.sleep(5);
rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
next = rollbackHashData[3];
if (sleepTime > 300000) {
Chat.console(Phrase.build(Phrase.ROLLBACK_ABORTED));
break;
}
}
rollbackHashData = ConfigHandler.rollbackHash.get(finalUserString);
@@ -214,35 +233,29 @@ public class ContainerRollback extends Rollback {
double totalSeconds = (timeFinish - timeStart) / 1000.0;
if (user != null) {
int file = -1;
if (blockCount > 0) {
file = 1;
}
int itemCount = 0;
int entityCount = 0;
RollbackComplete.output(
user,
location,
checkUsers,
restrictList,
excludeList,
excludeUserList,
actionList,
timeString,
file,
totalSeconds,
itemCount,
blockCount,
entityCount,
rollbackType,
radius,
verbose,
restrictWorld,
0);
RollbackComplete.output(user, location, checkUsers, restrictList, excludeList, excludeUserList,
actionList, timeString, file, totalSeconds, itemCount, blockCount, entityCount, rollbackType,
radius, verbose, restrictWorld, 0);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -42,175 +42,279 @@ public class Database extends Queue {
public static final int ITEM = 13;
public static void beginTransaction(Statement statement, boolean isMySQL) {
Consumer.transacting = true;
try {
if (isMySQL) {
statement.executeUpdate("START TRANSACTION");
} else {
statement.executeUpdate("BEGIN TRANSACTION");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void commitTransaction(Statement statement, boolean isMySQL) throws Exception {
int count = 0;
while (true) {
try {
if (isMySQL) {
statement.executeUpdate("COMMIT");
} else {
statement.executeUpdate("COMMIT TRANSACTION");
}
} catch (Exception e) {
if (e.getMessage().startsWith("[SQLITE_BUSY]") && count < 30) {
Thread.sleep(1000);
count++;
continue;
} else {
e.printStackTrace();
}
}
Consumer.transacting = false;
Consumer.interrupt = false;
return;
}
}
public static void performCheckpoint(Statement statement, boolean isMySQL) throws SQLException {
if (!isMySQL) {
statement.executeUpdate("PRAGMA wal_checkpoint(TRUNCATE)");
}
}
public static void setMultiInt(PreparedStatement statement, int value, int count) {
try {
for (int i = 1; i <= count; i++) {
statement.setInt(i, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean hasReturningKeys() {
return (!Config.getGlobal().MYSQL && ConfigHandler.SERVER_VERSION >= 20);
}
public static void containerBreakCheck(
String user, Material type, Object container, ItemStack[] contents, Location location) {
public static void containerBreakCheck(String user, Material type, Object container, ItemStack[] contents,
Location location)
{
if (BlockGroup.CONTAINERS.contains(type) && !BlockGroup.SHULKER_BOXES.contains(type)) {
if (Config.getConfig(location.getWorld()).ITEM_TRANSACTIONS) {
try {
if (contents == null) {
contents = Util.getContainerContents(type, container, location);
}
if (contents != null) {
List<ItemStack[]> forceList = new ArrayList<>();
forceList.add(Util.getContainerState(contents));
ConfigHandler.forceContainer.put(
user.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "." + location.getBlockY()
+ "." + location.getBlockZ(),
forceList);
ConfigHandler.forceContainer.put(user.toLowerCase(Locale.ROOT) + "." + location.getBlockX()
+ "." + location.getBlockY() + "." + location.getBlockZ(), forceList);
Queue.queueContainerBreak(user, location, type, contents);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
public static Connection getConnection(boolean onlyCheckTransacting) {
// Previously 250ms; long consumer commit time may be due to batching
// TODO: Investigate, potentially remove batching for SQLite connections
return getConnection(false, false, onlyCheckTransacting, 1000);
}
public static Connection getConnection(boolean force, int waitTime) {
return getConnection(force, false, false, waitTime);
}
public static Connection getConnection(boolean force, boolean startup, boolean onlyCheckTransacting, int waitTime) {
Connection connection = null;
try {
if (!force && (ConfigHandler.converterRunning || ConfigHandler.purgeRunning)) {
return connection;
}
if (Config.getGlobal().MYSQL) {
try {
connection = ConfigHandler.hikariDataSource.getConnection();
ConfigHandler.databaseReachable = true;
} catch (Exception e) {
ConfigHandler.databaseReachable = false;
Chat.sendConsoleMessage(Color.RED + "[CoreProtect] " + Phrase.build(Phrase.MYSQL_UNAVAILABLE));
e.printStackTrace();
}
} else {
if (Consumer.transacting && onlyCheckTransacting) {
Consumer.interrupt = true;
}
long startTime = System.nanoTime();
while (Consumer.isPaused && !force && (Consumer.transacting || !onlyCheckTransacting)) {
Thread.sleep(1);
long pauseTime = (System.nanoTime() - startTime) / 1000000;
if (pauseTime >= waitTime) {
return connection;
}
}
String database = "jdbc:sqlite:" + ConfigHandler.path + ConfigHandler.sqlite + "";
connection = DriverManager.getConnection(database);
ConfigHandler.databaseReachable = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
public static void closeConnection() {
try {
if (ConfigHandler.hikariDataSource != null) {
ConfigHandler.hikariDataSource.close();
ConfigHandler.hikariDataSource = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void performUpdate(Statement statement, long id, int rb, int table) {
try {
int rolledBack = Util.toggleRolledBack(
rb, (table == 2 || table == 3 || table == 4)); // co_item, co_container, co_block
int rolledBack = Util.toggleRolledBack(rb, (table == 2 || table == 3 || table == 4)); // co_item,
// co_container,
// co_block
if (table == 1 || table == 3) {
statement.executeUpdate("UPDATE " + ConfigHandler.prefix + "container SET rolled_back='" + rolledBack
+ "' WHERE rowid='" + id + "'");
} else if (table == 2) {
statement.executeUpdate("UPDATE " + ConfigHandler.prefix + "item SET rolled_back='" + rolledBack
+ "' WHERE rowid='" + id + "'");
} else {
statement.executeUpdate("UPDATE " + ConfigHandler.prefix + "block SET rolled_back='" + rolledBack
+ "' WHERE rowid='" + id + "'");
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static PreparedStatement prepareStatement(Connection connection, int type, boolean keys) {
PreparedStatement preparedStatement = null;
try {
String signInsert = "INSERT INTO " + ConfigHandler.prefix
+ "sign (time, user, wid, x, y, z, action, color, color_secondary, data, waxed, face, line_1, line_2, line_3, line_4, line_5, line_6, line_7, line_8) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
String blockInsert = "INSERT INTO " + ConfigHandler.prefix
@@ -234,6 +338,7 @@ public class Database extends Queue {
String blockdataInsert = "INSERT INTO " + ConfigHandler.prefix + "blockdata_map (id, data) VALUES (?, ?)";
switch (type) {
case SIGN:
preparedStatement = prepareStatement(connection, signInsert, keys);
break;
@@ -276,89 +381,114 @@ public class Database extends Queue {
case BLOCKDATA:
preparedStatement = prepareStatement(connection, blockdataInsert, keys);
break;
}
} catch (Exception e) {
e.printStackTrace();
}
return preparedStatement;
}
private static PreparedStatement prepareStatement(Connection connection, String query, boolean keys) {
PreparedStatement preparedStatement = null;
try {
if (keys) {
if (hasReturningKeys()) {
preparedStatement = connection.prepareStatement(query + " RETURNING rowid");
} else {
preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
}
} else {
preparedStatement = connection.prepareStatement(query);
}
} catch (Exception e) {
e.printStackTrace();
}
return preparedStatement;
}
private static void initializeTables(String prefix, Statement statement) {
try {
if (!Config.getGlobal().MYSQL) {
if (!Config.getGlobal().DISABLE_WAL) {
statement.executeUpdate("PRAGMA journal_mode=WAL;");
} else {
statement.executeUpdate("PRAGMA journal_mode=DELETE;");
}
}
boolean lockInitialized = false;
String query = "SELECT rowid as id FROM " + prefix + "database_lock WHERE rowid='1' LIMIT 1";
ResultSet rs = statement.executeQuery(query);
while (rs.next()) {
lockInitialized = true;
}
rs.close();
if (!lockInitialized) {
int unixtimestamp = (int) (System.currentTimeMillis() / 1000L);
statement.executeUpdate("INSERT INTO " + prefix
+ "database_lock (rowid, status, time) VALUES ('1', '0', '" + unixtimestamp + "')");
Process.lastLockUpdate = 0;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void createDatabaseTables(String prefix, Connection forceConnection, boolean mySQL, boolean purge) {
ConfigHandler.databaseTables.clear();
ConfigHandler.databaseTables.addAll(Arrays.asList(
"art_map",
"block",
"chat",
"command",
"container",
"item",
"database_lock",
"entity",
"entity_map",
"material_map",
"blockdata_map",
"session",
"sign",
"skull",
"user",
"username_log",
"version",
"world"));
ConfigHandler.databaseTables.addAll(Arrays.asList("art_map", "block", "chat", "command", "container", "item",
"database_lock", "entity", "entity_map", "material_map", "blockdata_map", "session", "sign", "skull",
"user", "username_log", "version", "world"));
if (mySQL) {
boolean success = false;
try (Connection connection =
(forceConnection != null ? forceConnection : Database.getConnection(true, true, true, 0))) {
try (Connection connection = (forceConnection != null ? forceConnection
: Database.getConnection(true, true, true, 0)))
{
if (connection != null) {
String index = "";
Statement statement = connection.createStatement();
index = ", INDEX(id)";
@@ -385,11 +515,9 @@ public class Database extends Queue {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "item(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, user int, wid int, x int, y int, z int, type int, data blob, amount int, action tinyint, rolled_back tinyint"
+ index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "database_lock(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),status tinyint,time int) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "entity(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, data blob) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
index = ", INDEX(id)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
@@ -411,8 +539,7 @@ public class Database extends Queue {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "sign(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int, user int, wid int, x int, y int, z int, action tinyint, color int, color_secondary int, data tinyint, waxed tinyint, face tinyint, line_1 varchar(100), line_2 varchar(100), line_3 varchar(100), line_4 varchar(100), line_5 varchar(100), line_6 varchar(100), line_7 varchar(100), line_8 varchar(100)"
+ index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "skull(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid), time int, owner varchar(255), skin varchar(255)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
index = ", INDEX(user), INDEX(uuid)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
@@ -422,266 +549,441 @@ public class Database extends Queue {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "username_log(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int,uuid varchar(64),user varchar(100)"
+ index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "version(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),time int,version varchar(16)) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
index = ", INDEX(id)";
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "world(rowid int NOT NULL AUTO_INCREMENT,PRIMARY KEY(rowid),id int,world varchar(255)"
+ index + ") ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4");
if (!purge && forceConnection == null) {
initializeTables(prefix, statement);
}
statement.close();
success = true;
}
} catch (Exception e) {
e.printStackTrace();
}
if (!success && forceConnection == null) {
Config.getGlobal().MYSQL = false;
}
}
if (!mySQL) {
try (Connection connection =
(forceConnection != null ? forceConnection : Database.getConnection(true, 0))) {
try (Connection connection = (forceConnection != null ? forceConnection
: Database.getConnection(true, 0)))
{
Statement statement = connection.createStatement();
List<String> tableData = new ArrayList<>();
List<String> indexData = new ArrayList<>();
String attachDatabase = "";
if (purge && forceConnection == null) {
String query = "ATTACH DATABASE '" + ConfigHandler.path + ConfigHandler.sqlite + ".tmp' AS tmp_db";
PreparedStatement preparedStmt = connection.prepareStatement(query);
preparedStmt.execute();
preparedStmt.close();
attachDatabase = "tmp_db.";
}
String query =
"SELECT type,name FROM " + attachDatabase + "sqlite_master WHERE type='table' OR type='index';";
String query = "SELECT type,name FROM " + attachDatabase
+ "sqlite_master WHERE type='table' OR type='index';";
ResultSet rs = statement.executeQuery(query);
while (rs.next()) {
String type = rs.getString("type");
if (type.equalsIgnoreCase("table")) {
tableData.add(rs.getString("name"));
} else if (type.equalsIgnoreCase("index")) {
indexData.add(rs.getString("name"));
}
}
rs.close();
if (!tableData.contains(prefix + "art_map")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "art_map (id INTEGER, art TEXT);");
}
if (!tableData.contains(prefix + "block")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "block (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, type INTEGER, data INTEGER, meta BLOB, blockdata BLOB, action INTEGER, rolled_back INTEGER);");
}
if (!tableData.contains(prefix + "chat")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "chat (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, message TEXT);");
}
if (!tableData.contains(prefix + "command")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "command (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, message TEXT);");
}
if (!tableData.contains(prefix + "container")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "container (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, type INTEGER, data INTEGER, amount INTEGER, metadata BLOB, action INTEGER, rolled_back INTEGER);");
}
if (!tableData.contains(prefix + "item")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "item (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, type INTEGER, data BLOB, amount INTEGER, action INTEGER, rolled_back INTEGER);");
}
if (!tableData.contains(prefix + "database_lock")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix + "database_lock (status INTEGER, time INTEGER);");
}
if (!tableData.contains(prefix + "entity")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "entity (id INTEGER PRIMARY KEY ASC, time INTEGER, data BLOB);");
}
if (!tableData.contains(prefix + "entity_map")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix + "entity_map (id INTEGER, entity TEXT);");
}
if (!tableData.contains(prefix + "material_map")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix + "material_map (id INTEGER, material TEXT);");
}
if (!tableData.contains(prefix + "blockdata_map")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix + "blockdata_map (id INTEGER, data TEXT);");
}
if (!tableData.contains(prefix + "session")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "session (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER);");
}
if (!tableData.contains(prefix + "sign")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "sign (time INTEGER, user INTEGER, wid INTEGER, x INTEGER, y INTEGER, z INTEGER, action INTEGER, color INTEGER, color_secondary INTEGER, data INTEGER, waxed INTEGER, face INTEGER, line_1 TEXT, line_2 TEXT, line_3 TEXT, line_4 TEXT, line_5 TEXT, line_6 TEXT, line_7 TEXT, line_8 TEXT);");
}
if (!tableData.contains(prefix + "skull")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "skull (id INTEGER PRIMARY KEY ASC, time INTEGER, owner TEXT, skin TEXT);");
}
if (!tableData.contains(prefix + "user")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "user (id INTEGER PRIMARY KEY ASC, time INTEGER, user TEXT, uuid TEXT);");
}
if (!tableData.contains(prefix + "username_log")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix
+ "username_log (id INTEGER PRIMARY KEY ASC, time INTEGER, uuid TEXT, user TEXT);");
}
if (!tableData.contains(prefix + "version")) {
statement.executeUpdate(
"CREATE TABLE IF NOT EXISTS " + prefix + "version (time INTEGER, version TEXT);");
}
if (!tableData.contains(prefix + "world")) {
statement.executeUpdate("CREATE TABLE IF NOT EXISTS " + prefix + "world (id INTEGER, world TEXT);");
}
try {
if (!indexData.contains("art_map_id_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "art_map_id_index ON "
+ ConfigHandler.prefix + "art_map(id);");
}
if (!indexData.contains("block_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_index ON "
+ ConfigHandler.prefix + "block(wid,x,z,time);");
}
if (!indexData.contains("block_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_user_index ON "
+ ConfigHandler.prefix + "block(user,time);");
}
if (!indexData.contains("block_type_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "block_type_index ON "
+ ConfigHandler.prefix + "block(type,time);");
}
if (!indexData.contains("blockdata_map_id_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "blockdata_map_id_index ON " + ConfigHandler.prefix + "blockdata_map(id);");
}
if (!indexData.contains("chat_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_index ON "
+ ConfigHandler.prefix + "chat(time);");
}
if (!indexData.contains("chat_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_user_index ON "
+ ConfigHandler.prefix + "chat(user,time);");
}
if (!indexData.contains("chat_wid_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "chat_wid_index ON "
+ ConfigHandler.prefix + "chat(wid,x,z,time);");
}
if (!indexData.contains("command_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_index ON "
+ ConfigHandler.prefix + "command(time);");
}
if (!indexData.contains("command_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "command_user_index ON " + ConfigHandler.prefix + "command(user,time);");
}
if (!indexData.contains("command_wid_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "command_wid_index ON "
+ ConfigHandler.prefix + "command(wid,x,z,time);");
}
if (!indexData.contains("container_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "container_index ON "
+ ConfigHandler.prefix + "container(wid,x,z,time);");
}
if (!indexData.contains("container_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "container_user_index ON " + ConfigHandler.prefix + "container(user,time);");
}
if (!indexData.contains("container_type_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "container_type_index ON " + ConfigHandler.prefix + "container(type,time);");
}
if (!indexData.contains("item_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_index ON "
+ ConfigHandler.prefix + "item(wid,x,z,time);");
}
if (!indexData.contains("item_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_user_index ON "
+ ConfigHandler.prefix + "item(user,time);");
}
if (!indexData.contains("item_type_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "item_type_index ON "
+ ConfigHandler.prefix + "item(type,time);");
}
if (!indexData.contains("entity_map_id_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "entity_map_id_index ON " + ConfigHandler.prefix + "entity_map(id);");
}
if (!indexData.contains("material_map_id_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "material_map_id_index ON " + ConfigHandler.prefix + "material_map(id);");
}
if (!indexData.contains("session_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "session_index ON "
+ ConfigHandler.prefix + "session(wid,x,z,time);");
}
if (!indexData.contains("session_action_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "session_action_index ON " + ConfigHandler.prefix + "session(action,time);");
}
if (!indexData.contains("session_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "session_user_index ON " + ConfigHandler.prefix + "session(user,time);");
}
if (!indexData.contains("session_time_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "session_time_index ON " + ConfigHandler.prefix + "session(time);");
}
if (!indexData.contains("sign_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_index ON "
+ ConfigHandler.prefix + "sign(wid,x,z,time);");
}
if (!indexData.contains("sign_user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_user_index ON "
+ ConfigHandler.prefix + "sign(user,time);");
}
if (!indexData.contains("sign_time_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "sign_time_index ON "
+ ConfigHandler.prefix + "sign(time);");
}
if (!indexData.contains("user_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "user_index ON "
+ ConfigHandler.prefix + "user(user);");
}
if (!indexData.contains("uuid_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "uuid_index ON "
+ ConfigHandler.prefix + "user(uuid);");
}
if (!indexData.contains("username_log_uuid_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase
+ "username_log_uuid_index ON " + ConfigHandler.prefix + "username_log(uuid,user);");
}
if (!indexData.contains("world_id_index")) {
statement.executeUpdate("CREATE INDEX IF NOT EXISTS " + attachDatabase + "world_id_index ON "
+ ConfigHandler.prefix + "world(id);");
}
} catch (Exception e) {
Chat.console(Phrase.build(Phrase.DATABASE_INDEX_ERROR));
if (purge) {
e.printStackTrace();
}
}
if (!purge && forceConnection == null) {
initializeTables(prefix, statement);
}
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
File diff suppressed because it is too large. Load diff
@@ -19,50 +19,63 @@ import org.bukkit.Material;
public class BlockBreakLogger {
private BlockBreakLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
int batchCount,
String user,
Location location,
int type,
int data,
List<Object> meta,
String blockData,
String overrideData) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, Location location, int type,
int data, List<Object> meta, String blockData, String overrideData)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null || location == null) {
return;
}
Material checkType = Util.getType(type);
if (checkType == null) {
return;
} else if (checkType.equals(Material.AIR) || checkType.equals(Material.CAVE_AIR)) {
return;
}
if (ConfigHandler.blacklist.get(checkType.getKey().toString()) != null) {
return;
}
if (!user.startsWith("#")) {
String cacheId = location.getBlockX() + "." + location.getBlockY() + "." + location.getBlockZ() + "."
+ Util.getWorldId(location.getWorld().getName());
CacheHandler.spreadCache.remove(cacheId);
}
if (checkType == Material.LECTERN) {
blockData = blockData.replaceFirst("has_book=true", "has_book=false");
} else if (checkType == Material.PAINTING || BukkitAdapter.ADAPTER.isItemFrame(checkType)) {
blockData = overrideData;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -71,17 +84,25 @@ public class BlockBreakLogger {
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
CacheHandler.breakCache.put(
"" + x + "." + y + "." + z + "." + wid + "", new Object[] {time, event.getUser(), type});
CacheHandler.breakCache.put("" + x + "." + y + "." + z + "." + wid + "",
new Object[]
{ time, event.getUser(), type });
if (event.isCancelled()) {
return;
}
BlockStatement.insert(
preparedStmt, batchCount, time, userId, wid, x, y, z, type, data, meta, blockData, 0, 0);
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, type, data, meta, blockData, 0,
0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -19,71 +19,78 @@ import org.bukkit.block.BlockState;
public class BlockPlaceLogger {
private BlockPlaceLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
int batchCount,
String user,
BlockState block,
int replacedType,
int replacedData,
Material forceType,
int forceData,
boolean force,
List<Object> meta,
String blockData,
String replaceBlockData) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, BlockState block,
int replacedType, int replacedData, Material forceType, int forceData, boolean force, List<Object> meta,
String blockData, String replaceBlockData)
{
try {
if (user == null || ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
Material type = block.getType();
if (blockData == null
&& (forceType == null
|| (!forceType.equals(Material.WATER)) && (!forceType.equals(Material.LAVA)))) {
&& (forceType == null || (!forceType.equals(Material.WATER)) && (!forceType.equals(Material.LAVA))))
{
blockData = block.getBlockData().getAsString();
if (blockData.equals("minecraft:air")) {
blockData = null;
}
}
int data = 0;
if (forceType != null && force) {
type = forceType;
if (BukkitAdapter.ADAPTER.isItemFrame(type)
|| type.equals(Material.SPAWNER)
|| type.equals(Material.PAINTING)
|| type.equals(Material.SKELETON_SKULL)
|| type.equals(Material.SKELETON_WALL_SKULL)
|| type.equals(Material.WITHER_SKELETON_SKULL)
|| type.equals(Material.WITHER_SKELETON_WALL_SKULL)
|| type.equals(Material.ZOMBIE_HEAD)
|| type.equals(Material.ZOMBIE_WALL_HEAD)
|| type.equals(Material.PLAYER_HEAD)
|| type.equals(Material.PLAYER_WALL_HEAD)
|| type.equals(Material.CREEPER_HEAD)
|| type.equals(Material.CREEPER_WALL_HEAD)
|| type.equals(Material.DRAGON_HEAD)
|| type.equals(Material.DRAGON_WALL_HEAD)
|| type.equals(Material.ARMOR_STAND)
|| type.equals(Material.END_CRYSTAL)) {
if (BukkitAdapter.ADAPTER.isItemFrame(type) || type.equals(Material.SPAWNER)
|| type.equals(Material.PAINTING) || type.equals(Material.SKELETON_SKULL)
|| type.equals(Material.SKELETON_WALL_SKULL) || type.equals(Material.WITHER_SKELETON_SKULL)
|| type.equals(Material.WITHER_SKELETON_WALL_SKULL) || type.equals(Material.ZOMBIE_HEAD)
|| type.equals(Material.ZOMBIE_WALL_HEAD) || type.equals(Material.PLAYER_HEAD)
|| type.equals(Material.PLAYER_WALL_HEAD) || type.equals(Material.CREEPER_HEAD)
|| type.equals(Material.CREEPER_WALL_HEAD) || type.equals(Material.DRAGON_HEAD)
|| type.equals(Material.DRAGON_WALL_HEAD) || type.equals(Material.ARMOR_STAND)
|| type.equals(Material.END_CRYSTAL))
{
data = forceData; // mob spawner, skull
} else if (user.startsWith("#")) {
data = forceData;
}
} else if (forceType != null && !type.equals(forceType)) {
type = forceType;
data = forceData;
}
if (type.equals(Material.AIR) || type.equals(Material.CAVE_AIR)) {
return;
}
if (ConfigHandler.blacklist.get(type.getKey().toString()) != null) {
return;
}
int x = block.getX();
@@ -91,28 +98,40 @@ public class BlockPlaceLogger {
int z = block.getZ();
long chunkKey = (x >> 4) & 0xffffffffL | ((z >> 4) & 0xffffffffL) << 32;
if (ConfigHandler.populatedChunks.get(chunkKey) != null) {
boolean isWater = user.equals("#water");
boolean isLava = user.equals("#lava");
boolean isVine = user.equals("#vine");
if (isWater || isLava || isVine) {
int timeDelay = isWater ? 60 : 240;
long timeSincePopulation = ((System.currentTimeMillis() / 1000L)
- ConfigHandler.populatedChunks.getOrDefault(chunkKey, 0L));
if (timeSincePopulation <= timeDelay) {
return;
}
if (timeSincePopulation > 240) {
ConfigHandler.populatedChunks.remove(chunkKey);
}
} else if (type == Material.WATER || type == Material.LAVA) {
ConfigHandler.populatedChunks.remove(chunkKey);
}
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -120,39 +139,38 @@ public class BlockPlaceLogger {
int time = (int) (System.currentTimeMillis() / 1000L);
if (event.getUser().length() > 0) {
CacheHandler.lookupCache.put(
"" + x + "." + y + "." + z + "." + wid + "", new Object[] {time, event.getUser(), type});
CacheHandler.lookupCache.put("" + x + "." + y + "." + z + "." + wid + "",
new Object[]
{ time, event.getUser(), type });
}
if (event.isCancelled()) {
return;
}
int internalType = Util.getBlockId(type.name(), true);
if (replacedType > 0
&& Util.getType(replacedType) != Material.AIR
&& Util.getType(replacedType) != Material.CAVE_AIR) {
BlockStatement.insert(
preparedStmt,
batchCount,
time,
userId,
wid,
x,
y,
z,
replacedType,
replacedData,
null,
replaceBlockData,
0,
0);
if (replacedType > 0 && Util.getType(replacedType) != Material.AIR
&& Util.getType(replacedType) != Material.CAVE_AIR)
{
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, replacedType, replacedData,
null, replaceBlockData, 0, 0);
}
BlockStatement.insert(
preparedStmt, batchCount, time, userId, wid, x, y, z, internalType, data, meta, blockData, 1, 0);
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, internalType, data, meta,
blockData, 1, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -10,23 +10,36 @@ import org.bukkit.Location;
public class ChatLogger {
private ChatLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt, int batchCount, long time, Location location, String user, String message) {
public static void log(PreparedStatement preparedStmt, int batchCount, long time, Location location, String user,
String message)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
int wid = Util.getWorldId(location.getWorld().getName());
int userId = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
ChatStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -15,26 +15,40 @@ import org.bukkit.Location;
public class CommandLogger {
private CommandLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt, int batchCount, long time, Location location, String user, String message) {
public static void log(PreparedStatement preparedStmt, int batchCount, long time, Location location, String user,
String message)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
if (ConfigHandler.blacklist.get(((message + " ").split(" "))[0].toLowerCase(Locale.ROOT)) != null) {
return;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -43,8 +57,13 @@ public class CommandLogger {
int y = location.getBlockY();
int z = location.getBlockZ();
CommandStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, message);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -11,28 +11,36 @@ import org.bukkit.inventory.ItemStack;
public class ContainerBreakLogger {
private ContainerBreakLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
int batchCount,
String player,
Location l,
Material type,
ItemStack[] oldInventory) {
public static void log(PreparedStatement preparedStmt, int batchCount, String player, Location l, Material type,
ItemStack[] oldInventory)
{
try {
Util.mergeItems(type, oldInventory);
ContainerLogger.logTransaction(preparedStmt, batchCount, player, type, null, oldInventory, 0, l);
String loggingContainerId =
player.toLowerCase(Locale.ROOT) + "." + l.getBlockX() + "." + l.getBlockY() + "." + l.getBlockZ();
String loggingContainerId = player.toLowerCase(Locale.ROOT) + "." + l.getBlockX() + "." + l.getBlockY()
+ "." + l.getBlockZ();
// If there was a pending chest transaction, it would have already been processed.
// If there was a pending chest transaction, it would have already been
// processed.
if (ConfigHandler.forceContainer.get(loggingContainerId) != null) {
ConfigHandler.forceContainer.remove(loggingContainerId);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -25,35 +25,44 @@ import org.bukkit.inventory.ItemStack;
public class ContainerLogger extends Queue {
private ContainerLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmtContainer,
PreparedStatement preparedStmtItems,
int batchCount,
String player,
Material type,
Object container,
Location location) {
public static void log(PreparedStatement preparedStmtContainer, PreparedStatement preparedStmtItems, int batchCount,
String player, Material type, Object container, Location location)
{
try {
ItemStack[] contents = null;
String faceData = null;
if (type == Material.ITEM_FRAME) {
contents = (ItemStack[]) ((Object[]) container)[1];
faceData = ((BlockFace) ((Object[]) container)[2]).name();
} else if (type == Material.JUKEBOX || type == Material.ARMOR_STAND) {
contents = (ItemStack[]) ((Object[]) container)[1];
} else {
Inventory inventory = (Inventory) container;
if (inventory != null) {
contents = inventory.getContents();
}
}
if (contents == null) {
return;
}
String loggingContainerId = player.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "."
@@ -63,138 +72,196 @@ public class ContainerLogger extends Queue {
ItemStack[] oldInventory = Util.getContainerState(oi1);
ItemStack[] newInventory = Util.getContainerState(contents);
if (oldInventory == null || newInventory == null) {
return;
}
List<ItemStack[]> forceList = ConfigHandler.forceContainer.get(loggingContainerId);
if (forceList != null) {
int forceSize = 0;
if (!forceList.isEmpty()) {
newInventory = Util.getContainerState(forceList.get(0));
forceSize = modifyForceContainer(loggingContainerId, null);
}
if (forceSize == 0) {
ConfigHandler.forceContainer.remove(loggingContainerId);
}
} else {
String transactingChestId = location.getWorld().getUID().toString() + "." + location.getBlockX() + "."
+ location.getBlockY() + "." + location.getBlockZ();
if (ConfigHandler.transactingChest.get(transactingChestId) != null) {
List<Object> list = Collections.synchronizedList(
new ArrayList<>(ConfigHandler.transactingChest.get(transactingChestId)));
List<Object> list = Collections
.synchronizedList(new ArrayList<>(ConfigHandler.transactingChest.get(transactingChestId)));
if (list.size() > 0) {
ItemStack[] newMerge = new ItemStack[newInventory.length + list.size()];
int count = 0;
for (int i = 0; i < newInventory.length; i++) {
newMerge[i] = newInventory[i];
count++;
}
for (Object item : list) {
ItemStack addItem = null;
ItemStack removeItem = null;
if (item instanceof ItemStack) {
addItem = (ItemStack) item;
} else if (item != null) {
addItem = ((ItemStack[]) item)[0];
removeItem = ((ItemStack[]) item)[1];
}
// item was removed by hopper, add back to state
if (addItem != null) {
newMerge[count] = addItem;
count++;
}
// item was added by hopper, remove from state
if (removeItem != null) {
for (ItemStack check : newMerge) {
if (check != null && check.isSimilar(removeItem)) {
check.setAmount(check.getAmount() - 1);
break;
}
}
}
}
newInventory = newMerge;
}
}
}
for (ItemStack oldi : oldInventory) {
for (ItemStack newi : newInventory) {
if (oldi != null && newi != null) {
if (oldi.isSimilar(newi) && !Util.isAir(oldi.getType())) { // Ignores amount
int oldAmount = oldi.getAmount();
int newAmount = newi.getAmount();
if (newAmount >= oldAmount) {
newAmount = newAmount - oldAmount;
oldi.setAmount(0);
newi.setAmount(newAmount);
} else {
oldAmount = oldAmount - newAmount;
oldi.setAmount(oldAmount);
newi.setAmount(0);
}
}
}
}
}
Util.mergeItems(type, oldInventory);
Util.mergeItems(type, newInventory);
if (type != Material.ENDER_CHEST) {
logTransaction(preparedStmtContainer, batchCount, player, type, faceData, oldInventory, 0, location);
logTransaction(preparedStmtContainer, batchCount, player, type, faceData, newInventory, 1, location);
} else { // pass ender chest transactions to item logger
ItemLogger.logTransaction(
preparedStmtItems, batchCount, 0, player, location, oldInventory, ItemLogger.ITEM_REMOVE_ENDER);
ItemLogger.logTransaction(
preparedStmtItems, batchCount, 0, player, location, newInventory, ItemLogger.ITEM_ADD_ENDER);
ItemLogger.logTransaction(preparedStmtItems, batchCount, 0, player, location, oldInventory,
ItemLogger.ITEM_REMOVE_ENDER);
ItemLogger.logTransaction(preparedStmtItems, batchCount, 0, player, location, newInventory,
ItemLogger.ITEM_ADD_ENDER);
}
oldList.remove(0);
ConfigHandler.oldContainer.put(loggingContainerId, oldList);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void logTransaction(
PreparedStatement preparedStmt,
int batchCount,
String user,
Material type,
String faceData,
ItemStack[] items,
int action,
Location location) {
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
protected static void logTransaction(PreparedStatement preparedStmt, int batchCount, String user, Material type,
String faceData, ItemStack[] items, int action, Location location)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
boolean success = false;
int slot = 0;
for (ItemStack item : items) {
if (item != null) {
if (item.getAmount() > 0 && !Util.isAir(item.getType())) {
// Object[] metadata = new Object[] { slot, item.getItemMeta() };
List<List<Map<String, Object>>> metadata =
ItemMetaHandler.serialize(item, type, faceData, slot);
List<List<Map<String, Object>>> metadata = ItemMetaHandler.serialize(item, type, faceData,
slot);
if (metadata.size() == 0) {
metadata = null;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance()
.getServer()
.getPluginManager()
.callEvent(event);
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -206,35 +273,33 @@ public class ContainerLogger extends Queue {
int typeId = Util.getBlockId(item.getType().name(), true);
int data = 0;
int amount = item.getAmount();
ContainerStatement.insert(
preparedStmt,
batchCount,
time,
userId,
wid,
x,
y,
z,
typeId,
data,
amount,
metadata,
action,
0);
ContainerStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, typeId, data,
amount, metadata, action, 0);
success = true;
}
}
slot++;
}
if (success && user.equals("#hopper")) {
String hopperPush = "#hopper-push." + location.getBlockX() + "." + location.getBlockY() + "."
+ location.getBlockZ();
ConfigHandler.hopperSuccess.remove(hopperPush);
ConfigHandler.hopperAbort.remove(hopperPush);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -19,29 +19,34 @@ import org.bukkit.block.BlockState;
public class EntityKillLogger {
private EntityKillLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
PreparedStatement preparedStmt2,
int batchCount,
String user,
BlockState block,
List<Object> data,
int type) {
public static void log(PreparedStatement preparedStmt, PreparedStatement preparedStmt2, int batchCount, String user,
BlockState block, List<Object> data, int type)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -54,20 +59,29 @@ public class EntityKillLogger {
ResultSet resultSet = EntityStatement.insert(preparedStmt2, time, data);
if (Database.hasReturningKeys()) {
resultSet.next();
entity_key = resultSet.getInt(1);
resultSet.close();
} else {
ResultSet keys = preparedStmt2.getGeneratedKeys();
keys.next();
entity_key = keys.getInt(1);
keys.close();
}
BlockStatement.insert(
preparedStmt, batchCount, time, userId, wid, x, y, z, type, entity_key, null, null, 3, 0);
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, type, entity_key, null, null, 3,
0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -34,13 +34,19 @@ public class ItemLogger {
public static final int ITEM_BUY = 12;
private ItemLogger() {
throw new IllegalStateException("Database class");
}
public static void log(PreparedStatement preparedStmt, int batchCount, Location location, int offset, String user) {
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
String loggingItemId = user.toLowerCase(Locale.ROOT) + "." + location.getBlockX() + "."
@@ -109,35 +115,44 @@ public class ItemLogger {
logTransaction(preparedStmt, batchCount, offset, user, location, itemCreates, ITEM_CREATE);
logTransaction(preparedStmt, batchCount, offset, user, location, itemSells, ITEM_SELL);
logTransaction(preparedStmt, batchCount, offset, user, location, itemBuys, ITEM_BUY);
} catch (Exception e) {
e.printStackTrace();
}
}
protected static void logTransaction(
PreparedStatement preparedStmt,
int batchCount,
int offset,
String user,
Location location,
ItemStack[] items,
int action) {
}
protected static void logTransaction(PreparedStatement preparedStmt, int batchCount, int offset, String user,
Location location, ItemStack[] items, int action)
{
try {
for (ItemStack item : items) {
if (item != null && item.getAmount() > 0 && !Util.isAir(item.getType())) {
// Object[] metadata = new Object[] { slot, item.getItemMeta() };
List<List<Map<String, Object>>> data = ItemMetaHandler.serialize(item, null, null, 0);
if (data.size() == 0) {
data = null;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -148,12 +163,19 @@ public class ItemLogger {
int z = location.getBlockZ();
int typeId = Util.getBlockId(item.getType().name(), true);
int amount = item.getAmount();
ItemStatement.insert(
preparedStmt, batchCount, time, userId, wid, x, y, z, typeId, data, amount, action);
ItemStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, typeId, data, amount,
action);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -16,26 +16,37 @@ import org.bukkit.block.BlockState;
public class PlayerInteractLogger {
private PlayerInteractLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt, int batchCount, String user, BlockState block, Material blockType) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, BlockState block,
Material blockType)
{
try {
int type = Util.getBlockId(blockType.name(), true);
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null
|| Util.getType(type).equals(Material.AIR)
|| Util.getType(type).equals(Material.CAVE_AIR)) {
|| Util.getType(type).equals(Material.AIR) || Util.getType(type).equals(Material.CAVE_AIR))
{
return;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -46,8 +57,13 @@ public class PlayerInteractLogger {
int z = block.getZ();
int data = 0;
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, type, data, null, null, 2, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -15,27 +15,40 @@ import org.bukkit.block.BlockState;
public class PlayerKillLogger {
private PlayerKillLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt, int batchCount, String user, BlockState block, String player) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, BlockState block,
String player)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
if (ConfigHandler.playerIdCache.get(player.toLowerCase(Locale.ROOT)) == null) {
UserStatement.loadId(preparedStmt.getConnection(), player, null);
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -46,8 +59,13 @@ public class PlayerKillLogger {
int y = block.getY();
int z = block.getZ();
BlockStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, 0, playerId, null, null, 3, 0);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -10,23 +10,36 @@ import org.bukkit.Location;
public class PlayerSessionLogger {
private PlayerSessionLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt, int batchCount, String user, Location location, int time, int action) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, Location location, int time,
int action)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
int x = location.getBlockX();
int y = location.getBlockY();
int z = location.getBlockZ();
int wid = Util.getWorldId(location.getWorld().getName());
int userId = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
SessionStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, action);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -15,41 +15,35 @@ import org.bukkit.Location;
public class SignTextLogger {
private SignTextLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
int batchCount,
String user,
Location location,
int action,
int color,
int colorSecondary,
int data,
boolean isWaxed,
boolean isFront,
String line1,
String line2,
String line3,
String line4,
String line5,
String line6,
String line7,
String line8,
int timeOffset) {
public static void log(PreparedStatement preparedStmt, int batchCount, String user, Location location, int action,
int color, int colorSecondary, int data, boolean isWaxed, boolean isFront, String line1, String line2,
String line3, String line4, String line5, String line6, String line7, String line8, int timeOffset)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
CoreProtectPreLogEvent event = new CoreProtectPreLogEvent(user);
if (Config.getGlobal().API_ENABLED && !Bukkit.isPrimaryThread()) {
CoreProtect.getInstance().getServer().getPluginManager().callEvent(event);
}
if (event.isCancelled()) {
return;
}
int userId = UserStatement.getId(preparedStmt, event.getUser(), true);
@@ -60,43 +54,32 @@ public class SignTextLogger {
int z = location.getBlockZ();
if (line1.isEmpty() && line2.isEmpty() && line3.isEmpty() && line4.isEmpty()) {
line1 = null;
line2 = null;
line3 = null;
line4 = null;
}
if (line5.isEmpty() && line6.isEmpty() && line7.isEmpty() && line8.isEmpty()) {
line5 = null;
line6 = null;
line7 = null;
line8 = null;
}
SignStatement.insert(
preparedStmt,
batchCount,
time,
userId,
wid,
x,
y,
z,
action,
color,
colorSecondary,
data,
isWaxed ? 1 : 0,
isFront ? 0 : 1,
line1,
line2,
line3,
line4,
line5,
line6,
line7,
line8);
SignStatement.insert(preparedStmt, batchCount, time, userId, wid, x, y, z, action, color, colorSecondary,
data, isWaxed ? 1 : 0, isFront ? 0 : 1, line1, line2, line3, line4, line5, line6, line7, line8);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -14,19 +14,23 @@ import org.bukkit.block.Skull;
public class SkullBreakLogger {
private SkullBreakLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
PreparedStatement preparedStmt2,
int batchCount,
String user,
BlockState block) {
public static void log(PreparedStatement preparedStmt, PreparedStatement preparedStmt2, int batchCount, String user,
BlockState block)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null || block == null) {
return;
}
int time = (int) (System.currentTimeMillis() / 1000L);
int type = Util.getBlockId(block.getType().name(), true);
Skull skull = (Skull) block;
@@ -34,33 +38,36 @@ public class SkullBreakLogger {
String skullSkin = null;
int skullKey = 0;
if (skull.hasOwner()) {
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin);
if (Database.hasReturningKeys()) {
resultSet.next();
skullKey = resultSet.getInt(1);
resultSet.close();
} else {
ResultSet keys = preparedStmt2.getGeneratedKeys();
keys.next();
skullKey = keys.getInt(1);
keys.close();
}
}
BlockBreakLogger.log(
preparedStmt,
batchCount,
user,
block.getLocation(),
type,
skullKey,
null,
block.getBlockData().getAsString(),
null);
}
BlockBreakLogger.log(preparedStmt, batchCount, user, block.getLocation(), type, skullKey, null,
block.getBlockData().getAsString(), null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -14,61 +14,65 @@ import org.bukkit.block.Skull;
public class SkullPlaceLogger {
private SkullPlaceLogger() {
throw new IllegalStateException("Database class");
}
public static void log(
PreparedStatement preparedStmt,
PreparedStatement preparedStmt2,
int batchCount,
String user,
BlockState block,
int replaceType,
int replaceData) {
public static void log(PreparedStatement preparedStmt, PreparedStatement preparedStmt2, int batchCount, String user,
BlockState block, int replaceType, int replaceData)
{
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null || block == null) {
return;
}
int time = (int) (System.currentTimeMillis() / 1000L);
Material type = block.getType();
int skullKey = 0;
if (block instanceof Skull) {
Skull skull = (Skull) block;
String skullOwner = "";
String skullSkin = null;
if (skull.hasOwner()) {
skullOwner = PaperAdapter.ADAPTER.getSkullOwner(skull);
skullSkin = PaperAdapter.ADAPTER.getSkullSkin(skull);
ResultSet resultSet = SkullStatement.insert(preparedStmt2, time, skullOwner, skullSkin);
if (Database.hasReturningKeys()) {
resultSet.next();
skullKey = resultSet.getInt(1);
resultSet.close();
} else {
ResultSet keys = preparedStmt2.getGeneratedKeys();
keys.next();
skullKey = keys.getInt(1);
keys.close();
}
}
}
BlockPlaceLogger.log(
preparedStmt,
batchCount,
user,
block,
replaceType,
replaceData,
type,
skullKey,
true,
null,
null,
null);
}
}
BlockPlaceLogger.log(preparedStmt, batchCount, user, block, replaceType, replaceData, type, skullKey, true,
null, null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -9,13 +9,19 @@ import net.coreprotect.config.ConfigHandler;
public class UsernameLogger {
private UsernameLogger() {
throw new IllegalStateException("Database class");
}
public static void log(Connection connection, String user, String uuid, int configUsernames, int time) {
try {
if (ConfigHandler.blacklist.get(user.toLowerCase(Locale.ROOT)) != null) {
return;
}
int idRow = -1;
@@ -25,21 +31,29 @@ public class UsernameLogger {
preparedStmt.setString(1, uuid);
ResultSet rs = preparedStmt.executeQuery();
while (rs.next()) {
idRow = rs.getInt("id");
userRow = rs.getString("user").toLowerCase(Locale.ROOT);
}
rs.close();
preparedStmt.close();
boolean update = false;
if (userRow == null) {
idRow = ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
update = true;
} else if (!user.equalsIgnoreCase(userRow)) {
update = true;
}
if (update) {
preparedStmt = connection.prepareStatement(
"UPDATE " + ConfigHandler.prefix + "user SET user = ?, uuid = ? WHERE rowid = ?");
preparedStmt.setString(1, user);
@@ -49,15 +63,13 @@ public class UsernameLogger {
preparedStmt.close();
/*
//Commented out to prevent potential issues if player manages to stay logged in with old username
if (ConfigHandler.playerIdCache.get(user_row)!=null){
int cache_id = ConfigHandler.playerIdCache.get(user_row);
if (cache_id==id_row){
ConfigHandler.playerIdCache.remove(user_row);
}
}
* //Commented out to prevent potential issues if player manages to stay logged
* in with old username if (ConfigHandler.playerIdCache.get(user_row)!=null){
* int cache_id = ConfigHandler.playerIdCache.get(user_row); if
* (cache_id==id_row){ ConfigHandler.playerIdCache.remove(user_row); } }
*/
} else {
boolean foundUUID = false;
query = "SELECT rowid as id FROM " + ConfigHandler.prefix
+ "username_log WHERE uuid = ? AND user = ? LIMIT 0, 1";
@@ -66,17 +78,24 @@ public class UsernameLogger {
preparedStatement.setString(2, user);
rs = preparedStatement.executeQuery();
while (rs.next()) {
foundUUID = true;
}
rs.close();
preparedStatement.close();
if (!foundUUID) {
update = true;
}
}
if (update && configUsernames == 1) {
preparedStmt = connection.prepareStatement(
"INSERT INTO " + ConfigHandler.prefix + "username_log (time, uuid, user) VALUES (?, ?, ?)");
preparedStmt.setInt(1, time);
@@ -84,14 +103,20 @@ public class UsernameLogger {
preparedStmt.setString(3, user);
preparedStmt.executeUpdate();
preparedStmt.close();
}
ConfigHandler.playerIdCache.put(user.toLowerCase(Locale.ROOT), idRow);
ConfigHandler.playerIdCacheReversed.put(idRow, user);
ConfigHandler.uuidCache.put(user.toLowerCase(Locale.ROOT), uuid);
ConfigHandler.uuidCacheReversed.put(uuid, user);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -16,31 +16,40 @@ import org.bukkit.command.CommandSender;
public class BlockLookup {
public static String performLookup(
String command,
Statement statement,
BlockState block,
CommandSender commandSender,
int offset,
int page,
int limit) {
public static String performLookup(String command, Statement statement, BlockState block,
CommandSender commandSender, int offset, int page, int limit)
{
String resultText = "";
try {
if (block == null) {
return resultText;
}
if (command == null) {
if (commandSender.hasPermission("coreprotect.co")) {
command = "co";
} else if (commandSender.hasPermission("coreprotect.core")) {
command = "core";
} else if (commandSender.hasPermission("coreprotect.coreprotect")) {
command = "coreprotect";
} else {
command = "co";
}
}
boolean found = false;
@@ -54,7 +63,9 @@ public class BlockLookup {
int rowMax = page * limit;
int page_start = rowMax - limit;
if (offset > 0) {
checkTime = time - offset;
}
String blockName = block.getType().name().toLowerCase(Locale.ROOT);
@@ -64,8 +75,11 @@ public class BlockLookup {
+ "' AND y = '" + y + "' AND action IN(0,1) AND time >= '" + checkTime + "' LIMIT 0, 1";
ResultSet results = statement.executeQuery(query);
while (results.next()) {
count = results.getInt("count");
}
results.close();
int totalPages = (int) Math.ceil(count / (limit + 0.0));
@@ -78,6 +92,7 @@ public class BlockLookup {
StringBuilder resultTextBuilder = new StringBuilder();
while (results.next()) {
int resultUserId = results.getInt("user");
int resultAction = results.getInt("action");
int resultType = results.getInt("type");
@@ -86,118 +101,140 @@ public class BlockLookup {
int resultRolledBack = results.getInt("rolled_back");
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String timeAgo = Util.getTimeSince(resultTime, time, true);
if (!found) {
resultTextBuilder =
new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA + "CoreProtect " + Color.WHITE
+ "----- " + Util.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
resultTextBuilder = new StringBuilder(
Color.WHITE + "----- " + Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "----- "
+ Util.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
}
found = true;
Phrase phrase = Phrase.LOOKUP_BLOCK;
String selector = Selector.FIRST;
String tag = Color.WHITE + "-";
if (resultAction == 2 || resultAction == 3) {
phrase = Phrase.LOOKUP_INTERACTION; // {clicked|killed}
selector = (resultAction != 3 ? Selector.FIRST : Selector.SECOND);
tag = (resultAction != 3 ? Color.WHITE + "-" : Color.RED + "-");
} else {
phrase = Phrase.LOOKUP_BLOCK; // {placed|broke}
selector = (resultAction != 0 ? Selector.FIRST : Selector.SECOND);
tag = (resultAction != 0 ? Color.GREEN + "+" : Color.RED + "-");
}
String rbFormat = "";
if (resultRolledBack == 1 || resultRolledBack == 3) {
rbFormat = Color.STRIKETHROUGH;
}
String target;
if (resultAction == 3) {
target = Util.getEntityType(resultType).name();
} else {
Material resultMaterial = Util.getType(resultType);
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
target = Util.nameFilter(resultMaterial.name().toLowerCase(Locale.ROOT), resultData);
target = "minecraft:" + target.toLowerCase(Locale.ROOT);
}
if (target.length() > 0) {
target = "" + target + "";
}
// Hide "minecraft:" for now.
if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
resultTextBuilder
.append(timeAgo + " " + tag + " ")
.append(Phrase.build(
phrase,
Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat,
Color.DARK_AQUA + rbFormat + target + Color.WHITE,
selector))
resultTextBuilder.append(timeAgo + " " + tag + " ")
.append(Phrase.build(phrase, Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat,
Color.DARK_AQUA + rbFormat + target + Color.WHITE, selector))
.append("\n");
PluginChannelListener.getInstance()
.sendData(
commandSender,
resultTime,
phrase,
selector,
resultUser,
target,
-1,
x,
y,
z,
worldId,
rbFormat,
false,
tag.contains("+"));
PluginChannelListener.getInstance().sendData(commandSender, resultTime, phrase, selector, resultUser,
target, -1, x, y, z, worldId, rbFormat, false, tag.contains("+"));
}
resultText = resultTextBuilder.toString();
results.close();
if (found) {
if (count > limit) {
String pageInfo = Color.WHITE + "-----\n";
pageInfo = pageInfo + Util.getPageNavigation(command, page, totalPages) + "\n";
resultText = resultText + pageInfo;
}
} else {
if (rowMax > count && count > 0) {
resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND);
} else {
// resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Color.WHITE + "No block data
// resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " +
// Color.WHITE + "No block data
// found at " + Color.ITALIC + "x" + x + "/y" + y + "/z" + z + ".";
resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_DATA_LOCATION, Selector.FIRST);
if (!blockName.equals("air") && !blockName.equals("cave_air")) {
resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.NO_DATA,
Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT))
+ "\n";
resultText = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(
Phrase.NO_DATA, Color.ITALIC + block.getType().name().toLowerCase(Locale.ROOT)) + "\n";
}
}
}
ConfigHandler.lookupPage.put(commandSender.getName(), page);
ConfigHandler.lookupType.put(commandSender.getName(), 2);
ConfigHandler.lookupCommand.put(
commandSender.getName(), x + "." + y + "." + z + "." + worldId + ".0." + limit);
ConfigHandler.lookupCommand.put(commandSender.getName(),
x + "." + y + "." + z + "." + worldId + ".0." + limit);
} catch (Exception e) {
e.printStackTrace();
}
return resultText;
}
}
@@ -18,31 +18,40 @@ import org.bukkit.command.CommandSender;
public class ChestTransactionLookup {
public static List<String> performLookup(
String command,
Statement statement,
Location l,
CommandSender commandSender,
int page,
int limit,
boolean exact) {
public static List<String> performLookup(String command, Statement statement, Location l,
CommandSender commandSender, int page, int limit, boolean exact)
{
List<String> result = new ArrayList<>();
try {
if (l == null) {
return result;
}
if (command == null) {
if (commandSender.hasPermission("coreprotect.co")) {
command = "co";
} else if (commandSender.hasPermission("coreprotect.core")) {
command = "core";
} else if (commandSender.hasPermission("coreprotect.coreprotect")) {
command = "coreprotect";
} else {
command = "co";
}
}
boolean found = false;
@@ -62,15 +71,21 @@ public class ChestTransactionLookup {
+ Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + x + "' OR x = '" + x2
+ "') AND (z = '" + z + "' OR z = '" + z2 + "') AND y = '" + y + "' LIMIT 0, 1";
if (exact) {
query = "SELECT COUNT(*) as count from " + ConfigHandler.prefix + "container "
+ Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '" + l.getBlockX()
+ "') AND (z = '" + l.getBlockZ() + "') AND y = '" + y + "' LIMIT 0, 1";
}
ResultSet results = statement.executeQuery(query);
while (results.next()) {
count = results.getInt("count");
}
results.close();
int totalPages = (int) Math.ceil(count / (limit + 0.0));
@@ -80,13 +95,17 @@ public class ChestTransactionLookup {
+ "' OR x = '" + x2 + "') AND (z = '" + z + "' OR z = '" + z2 + "') AND y = '" + y
+ "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
if (exact) {
query = "SELECT time,user,action,type,data,amount,metadata,rolled_back FROM " + ConfigHandler.prefix
+ "container " + Util.getWidIndex("container") + "WHERE wid = '" + worldId + "' AND (x = '"
+ l.getBlockX() + "') AND (z = '" + l.getBlockZ() + "') AND y = '" + y
+ "' ORDER BY rowid DESC LIMIT " + pageStart + ", " + limit + "";
}
results = statement.executeQuery(query);
while (results.next()) {
int resultUserId = results.getInt("user");
int resultAction = results.getInt("action");
int resultType = results.getInt("type");
@@ -98,93 +117,105 @@ public class ChestTransactionLookup {
String tooltip = Util.getEnchantments(resultMetadata, resultType, resultAmount);
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String timeAgo = Util.getTimeSince(resultTime, time, true);
if (!found) {
result.add(new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA
+ Phrase.build(Phrase.CONTAINER_HEADER) + Color.WHITE + " ----- "
+ Util.getCoordinates(command, worldId, x, y, z, false, false))
.toString());
+ Util.getCoordinates(command, worldId, x, y, z, false, false)).toString());
}
found = true;
String selector = (resultAction != 0 ? Selector.FIRST : Selector.SECOND);
String tag = (resultAction != 0 ? Color.GREEN + "+" : Color.RED + "-");
String rbFormat = "";
if (resultRolledBack == 1 || resultRolledBack == 3) {
rbFormat = Color.STRIKETHROUGH;
}
Material resultMaterial = Util.getType(resultType);
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
String target = resultMaterial.name().toLowerCase(Locale.ROOT);
target = Util.nameFilter(target, resultData);
if (target.length() > 0) {
target = "minecraft:" + target.toLowerCase(Locale.ROOT) + "";
}
// Hide "minecraft:" for now.
if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
result.add(new StringBuilder(timeAgo + " " + tag + " "
+ Phrase.build(
Phrase.LOOKUP_CONTAINER,
Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat,
"x" + resultAmount,
Util.createTooltip(Color.DARK_AQUA + rbFormat + target, tooltip) + Color.WHITE,
selector))
result.add(new StringBuilder(timeAgo + " " + tag + " " + Phrase.build(Phrase.LOOKUP_CONTAINER,
Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat, "x" + resultAmount,
Util.createTooltip(Color.DARK_AQUA + rbFormat + target, tooltip) + Color.WHITE, selector))
.toString());
PluginChannelListener.getInstance()
.sendData(
commandSender,
resultTime,
Phrase.LOOKUP_CONTAINER,
selector,
resultUser,
target,
resultAmount,
x,
y,
z,
worldId,
rbFormat,
true,
PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_CONTAINER,
selector, resultUser, target, resultAmount, x, y, z, worldId, rbFormat, true,
tag.contains("+"));
}
results.close();
if (found) {
if (count > limit) {
result.add(Color.WHITE + "-----");
result.add(Util.getPageNavigation(command, page, totalPages));
}
} else {
if (rowMax > count && count > 0) {
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND));
} else {
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_DATA_LOCATION, Selector.SECOND));
}
}
ConfigHandler.lookupType.put(commandSender.getName(), 1);
ConfigHandler.lookupPage.put(commandSender.getName(), page);
ConfigHandler.lookupCommand.put(
commandSender.getName(),
ConfigHandler.lookupCommand.put(commandSender.getName(),
x + "." + y + "." + z + "." + worldId + "." + x2 + "." + y2 + "." + z2 + "." + limit);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -16,31 +16,40 @@ import org.bukkit.command.CommandSender;
public class InteractionLookup {
public static String performLookup(
String command,
Statement statement,
Block block,
CommandSender commandSender,
int offset,
int page,
int limit) {
public static String performLookup(String command, Statement statement, Block block, CommandSender commandSender,
int offset, int page, int limit)
{
String result = "";
try {
if (block == null) {
return result;
}
if (command == null) {
if (commandSender.hasPermission("coreprotect.co")) {
command = "co";
} else if (commandSender.hasPermission("coreprotect.core")) {
command = "core";
} else if (commandSender.hasPermission("coreprotect.coreprotect")) {
command = "coreprotect";
} else {
command = "co";
}
}
boolean found = false;
@@ -54,7 +63,9 @@ public class InteractionLookup {
int rowMax = page * limit;
int pageStart = rowMax - limit;
if (offset > 0) {
checkTime = time - offset;
}
String query = "SELECT COUNT(*) as count from " + ConfigHandler.prefix + "block "
@@ -63,8 +74,11 @@ public class InteractionLookup {
ResultSet results = statement.executeQuery(query);
while (results.next()) {
count = results.getInt("count");
}
results.close();
int totalPages = (int) Math.ceil(count / (limit + 0.0));
@@ -76,6 +90,7 @@ public class InteractionLookup {
StringBuilder resultBuilder = new StringBuilder();
while (results.next()) {
int resultUserId = results.getInt("user");
int resultAction = results.getInt("action");
int resultType = results.getInt("type");
@@ -84,91 +99,105 @@ public class InteractionLookup {
int resultRolledBack = results.getInt("rolled_back");
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String timeAgo = Util.getTimeSince(resultTime, time, true);
if (!found) {
resultBuilder = new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA
+ Phrase.build(Phrase.INTERACTIONS_HEADER) + Color.WHITE + " ----- "
+ Util.getCoordinates(command, worldId, x, y, z, false, false) + "\n");
}
found = true;
String rbFormat = "";
if (resultRolledBack == 1 || resultRolledBack == 3) {
rbFormat = Color.STRIKETHROUGH;
}
Material resultMaterial = Util.getType(resultType);
if (resultMaterial == null) {
resultMaterial = Material.AIR;
}
String target = resultMaterial.name().toLowerCase(Locale.ROOT);
target = Util.nameFilter(target, resultData);
if (target.length() > 0) {
target = "minecraft:" + target.toLowerCase(Locale.ROOT) + "";
}
// Hide "minecraft:" for now.
if (target.startsWith("minecraft:")) {
target = target.split(":")[1];
}
resultBuilder
.append(timeAgo + " " + Color.WHITE + "- ")
.append(Phrase.build(
Phrase.LOOKUP_INTERACTION,
resultBuilder.append(timeAgo + " " + Color.WHITE + "- ")
.append(Phrase.build(Phrase.LOOKUP_INTERACTION,
Color.DARK_AQUA + rbFormat + resultUser + Color.WHITE + rbFormat,
Color.DARK_AQUA + rbFormat + target + Color.WHITE,
Selector.FIRST))
Color.DARK_AQUA + rbFormat + target + Color.WHITE, Selector.FIRST))
.append("\n");
PluginChannelListener.getInstance()
.sendData(
commandSender,
resultTime,
Phrase.LOOKUP_INTERACTION,
Selector.FIRST,
resultUser,
target,
-1,
x,
y,
z,
worldId,
rbFormat,
false,
false);
PluginChannelListener.getInstance().sendData(commandSender, resultTime, Phrase.LOOKUP_INTERACTION,
Selector.FIRST, resultUser, target, -1, x, y, z, worldId, rbFormat, false, false);
}
result = resultBuilder.toString();
results.close();
if (found) {
if (count > limit) {
String pageInfo = Color.WHITE + "-----\n";
pageInfo = pageInfo + Util.getPageNavigation(command, page, totalPages) + "\n";
result = result + pageInfo;
}
} else {
if (rowMax > count && count > 0) {
result = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND);
} else {
result = Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_DATA_LOCATION, Selector.THIRD);
}
}
ConfigHandler.lookupPage.put(commandSender.getName(), page);
ConfigHandler.lookupType.put(commandSender.getName(), 7);
ConfigHandler.lookupCommand.put(
commandSender.getName(), x + "." + y + "." + z + "." + worldId + ".2." + limit);
ConfigHandler.lookupCommand.put(commandSender.getName(),
x + "." + y + "." + z + "." + worldId + ".2." + limit);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -10,17 +10,23 @@ import net.coreprotect.config.ConfigHandler;
public class PlayerLookup {
public static boolean playerExists(Connection connection, String user) {
try {
int id = -1;
String uuid = null;
if (ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT)) != null) {
return true;
}
String collate = "";
if (!Config.getGlobal().MYSQL) {
collate = " COLLATE NOCASE";
}
String query = "SELECT rowid as id, uuid FROM " + ConfigHandler.prefix + "user WHERE user = ?" + collate
@@ -31,26 +37,38 @@ public class PlayerLookup {
ResultSet results = preparedStmt.executeQuery();
while (results.next()) {
id = results.getInt("id");
uuid = results.getString("uuid");
}
results.close();
preparedStmt.close();
if (id > -1) {
if (uuid != null) {
ConfigHandler.uuidCache.put(user.toLowerCase(Locale.ROOT), uuid);
ConfigHandler.uuidCacheReversed.put(uuid, user);
}
ConfigHandler.playerIdCache.put(user.toLowerCase(Locale.ROOT), id);
ConfigHandler.playerIdCacheReversed.put(id, user);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
@@ -20,25 +20,40 @@ public class SignMessageLookup {
static Pattern pattern = Pattern.compile("§x(§[a-fA-F0-9]){6}");
public static List<String> performLookup(
String command, Statement statement, Location l, CommandSender commandSender, int page, int limit) {
public static List<String> performLookup(String command, Statement statement, Location l,
CommandSender commandSender, int page, int limit)
{
List<String> result = new ArrayList<>();
try {
if (l == null) {
return result;
}
if (command == null) {
if (commandSender.hasPermission("coreprotect.co")) {
command = "co";
} else if (commandSender.hasPermission("coreprotect.core")) {
command = "core";
} else if (commandSender.hasPermission("coreprotect.coreprotect")) {
command = "coreprotect";
} else {
command = "co";
}
}
boolean found = false;
@@ -57,8 +72,11 @@ public class SignMessageLookup {
ResultSet results = statement.executeQuery(query);
while (results.next()) {
count = results.getInt("count");
}
results.close();
int totalPages = (int) Math.ceil(count / (limit + 0.0));
@@ -71,6 +89,7 @@ public class SignMessageLookup {
results = statement.executeQuery(query);
while (results.next()) {
long resultTime = results.getLong("time");
int resultUserId = results.getInt("user");
String line1 = results.getString("line_1");
@@ -85,109 +104,173 @@ public class SignMessageLookup {
StringBuilder message = new StringBuilder();
if (isFront && line1 != null && line1.length() > 0) {
message.append(line1);
if (!line1.endsWith(" ")) {
message.append(" ");
}
}
if (isFront && line2 != null && line2.length() > 0) {
message.append(line2);
if (!line2.endsWith(" ")) {
message.append(" ");
}
}
if (isFront && line3 != null && line3.length() > 0) {
message.append(line3);
if (!line3.endsWith(" ")) {
message.append(" ");
}
}
if (isFront && line4 != null && line4.length() > 0) {
message.append(line4);
if (!line4.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line5 != null && line5.length() > 0) {
message.append(line5);
if (!line5.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line6 != null && line6.length() > 0) {
message.append(line6);
if (!line6.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line7 != null && line7.length() > 0) {
message.append(line7);
if (!line7.endsWith(" ")) {
message.append(" ");
}
}
if (!isFront && line8 != null && line8.length() > 0) {
message.append(line8);
if (!line8.endsWith(" ")) {
message.append(" ");
}
}
String parsedMessage = message.toString();
if (parsedMessage.contains("§x")) {
for (Matcher matcher = pattern.matcher(parsedMessage);
matcher.find();
matcher = pattern.matcher(parsedMessage)) {
for (Matcher matcher = pattern.matcher(parsedMessage); matcher
.find(); matcher = pattern.matcher(parsedMessage))
{
String color = parsedMessage.substring(matcher.start(), matcher.end());
parsedMessage = parsedMessage.replace(color, "");
}
}
if (ConfigHandler.playerIdCacheReversed.get(resultUserId) == null) {
UserStatement.loadName(statement.getConnection(), resultUserId);
}
String resultUser = ConfigHandler.playerIdCacheReversed.get(resultUserId);
String timeAgo = Util.getTimeSince(resultTime, time, true);
if (!found) {
result.add(new StringBuilder(Color.WHITE + "----- " + Color.DARK_AQUA
+ Phrase.build(Phrase.SIGN_HEADER) + Color.WHITE + " ----- "
+ Util.getCoordinates(command, worldId, x, y, z, false, false) + "")
result.add(new StringBuilder(
Color.WHITE + "----- " + Color.DARK_AQUA + Phrase.build(Phrase.SIGN_HEADER) + Color.WHITE
+ " ----- " + Util.getCoordinates(command, worldId, x, y, z, false, false) + "")
.toString());
}
found = true;
result.add(timeAgo + Color.WHITE + " - " + Color.DARK_AQUA + resultUser + ": " + Color.WHITE + "\n"
+ parsedMessage + Color.WHITE);
PluginChannelListener.getInstance()
.sendMessageData(
commandSender, resultTime, resultUser, message.toString(), true, x, y, z, worldId);
PluginChannelListener.getInstance().sendMessageData(commandSender, resultTime, resultUser,
message.toString(), true, x, y, z, worldId);
}
results.close();
if (found) {
if (count > limit) {
result.add(Color.WHITE + "-----");
result.add(Util.getPageNavigation(command, page, totalPages));
}
} else {
if (rowMax > count && count > 0) {
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_RESULTS_PAGE, Selector.SECOND));
} else {
result.add(Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.NO_DATA_LOCATION, Selector.FOURTH));
}
}
ConfigHandler.lookupType.put(commandSender.getName(), 8);
ConfigHandler.lookupPage.put(commandSender.getName(), page);
ConfigHandler.lookupCommand.put(
commandSender.getName(), x + "." + y + "." + z + "." + worldId + ".8." + limit);
ConfigHandler.lookupCommand.put(commandSender.getName(),
x + "." + y + "." + z + "." + worldId + ".8." + limit);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
File diff suppressed because it is too large. Load diff
@@ -17,161 +17,164 @@ import org.bukkit.entity.EntityType;
public class RollbackComplete {
public static void output(
CommandSender user,
Location location,
List<String> checkUsers,
List<Object> restrictList,
Map<Object, Boolean> excludeList,
List<String> excludeUserList,
List<Integer> actionList,
String timeString,
Integer chunkCount,
Double seconds,
Integer itemCount,
Integer blockCount,
Integer entityCount,
int rollbackType,
Integer[] radius,
boolean verbose,
boolean restrictWorld,
int preview) {
public static void output(CommandSender user, Location location, List<String> checkUsers, List<Object> restrictList,
Map<Object, Boolean> excludeList, List<String> excludeUserList, List<Integer> actionList, String timeString,
Integer chunkCount, Double seconds, Integer itemCount, Integer blockCount, Integer entityCount,
int rollbackType, Integer[] radius, boolean verbose, boolean restrictWorld, int preview)
{
try {
if (preview == 2) {
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.PREVIEW_CANCELLED));
return;
}
Chat.sendMessage(user, "-----");
StringBuilder usersBuilder = new StringBuilder();
for (String value : checkUsers) {
if (usersBuilder.length() == 0) {
usersBuilder = usersBuilder.append("" + value + "");
} else {
usersBuilder.append(", ").append(value);
}
}
String users = usersBuilder.toString();
if (users.equals("#global") && restrictWorld) {
users = "#" + location.getWorld().getName();
}
if (preview > 0) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_COMPLETED, users, Selector.THIRD)); // preview
} else if (rollbackType == 0) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_COMPLETED, users, Selector.FIRST)); // rollback
} else if (rollbackType == 1) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_COMPLETED, users, Selector.SECOND)); // restore
}
if (preview == 1 || rollbackType == 0 || rollbackType == 1) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_TIME, timeString));
}
if (radius != null) {
int worldedit = radius[7];
if (worldedit == 0) {
Integer rollbackRadius = radius[0];
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_RADIUS,
rollbackRadius.toString(),
+ Phrase.build(Phrase.ROLLBACK_RADIUS, rollbackRadius.toString(),
(rollbackRadius == 1 ? Selector.FIRST : Selector.SECOND)));
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_SELECTION, "#worldedit"));
}
}
if (restrictWorld && radius == null) {
if (location != null) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_WORLD_ACTION,
location.getWorld().getName(),
Selector.FIRST));
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase
.build(Phrase.ROLLBACK_WORLD_ACTION, location.getWorld().getName(), Selector.FIRST));
}
}
if (actionList.contains(4) && actionList.contains(11)) {
if (actionList.contains(0)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "+inventory", Selector.SECOND));
} else if (actionList.contains(1)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "-inventory", Selector.SECOND));
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "inventory", Selector.SECOND));
}
} else if (actionList.contains(4)) {
if (actionList.contains(0)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "-container", Selector.SECOND));
} else if (actionList.contains(1)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "+container", Selector.SECOND));
} else {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "container", Selector.SECOND));
}
} else if (actionList.contains(0) && actionList.contains(1)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "block", Selector.SECOND));
} else if (actionList.contains(0)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "-block", Selector.SECOND));
} else if (actionList.contains(1)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "+block", Selector.SECOND));
} else if (actionList.contains(3)) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.ROLLBACK_WORLD_ACTION, "kill", Selector.SECOND));
}
if (restrictList.size() > 0) {
StringBuilder restrictTargets = new StringBuilder();
boolean material = false;
boolean item = false;
@@ -179,47 +182,60 @@ public class RollbackComplete {
int targetCount = 0;
for (Object restrictTarget : restrictList) {
String targetName = "";
if (restrictTarget instanceof Material) {
targetName = ((Material) restrictTarget).name().toLowerCase(Locale.ROOT);
item = (!item ? !(((Material) restrictTarget).isBlock()) : item);
material = true;
} else if (restrictTarget instanceof EntityType) {
targetName = ((EntityType) restrictTarget).name().toLowerCase(Locale.ROOT);
entity = true;
}
if (targetCount == 0) {
restrictTargets = restrictTargets.append("" + targetName + "");
} else {
restrictTargets.append(", ").append(targetName);
}
targetCount++;
}
String targetType = Selector.THIRD;
if (material && !item && !entity) {
targetType = Selector.FIRST;
} else if (material && item && !entity) {
targetType = Selector.THIRD;
} else if (entity && !material) {
targetType = Selector.SECOND;
}
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_INCLUDE,
restrictTargets.toString(),
Selector.FIRST,
targetType,
(targetCount == 1 ? Selector.FIRST : Selector.SECOND))); // include
+ Phrase.build(Phrase.ROLLBACK_INCLUDE, restrictTargets.toString(), Selector.FIRST,
targetType, (targetCount == 1 ? Selector.FIRST : Selector.SECOND))); // include
}
if (excludeList.size() > 0) {
StringBuilder excludeTargets = new StringBuilder();
boolean material = false;
boolean item = false;
@@ -227,192 +243,239 @@ public class RollbackComplete {
int excludeCount = 0;
for (Map.Entry<Object, Boolean> entry : excludeList.entrySet()) {
Object excludeTarget = entry.getKey();
Boolean excludeTargetInternal = entry.getValue();
// don't display default block excludes
if (Boolean.TRUE.equals(excludeTargetInternal)) {
continue;
}
// don't display that excluded water/fire/farmland in inventory rollbacks
if (actionList.contains(4) && actionList.contains(11)) {
if (excludeTarget.equals(Material.FIRE)
|| excludeTarget.equals(Material.WATER)
|| excludeTarget.equals(Material.FARMLAND)) {
if (excludeTarget.equals(Material.FIRE) || excludeTarget.equals(Material.WATER)
|| excludeTarget.equals(Material.FARMLAND))
{
continue;
}
}
String targetName = "";
if (excludeTarget instanceof Material) {
targetName = ((Material) excludeTarget).name().toLowerCase(Locale.ROOT);
item = (!item ? !(((Material) excludeTarget).isBlock()) : item);
material = true;
} else if (excludeTarget instanceof EntityType) {
targetName = ((EntityType) excludeTarget).name().toLowerCase(Locale.ROOT);
entity = true;
}
if (excludeCount == 0) {
excludeTargets = excludeTargets.append("" + targetName + "");
} else {
excludeTargets.append(", ").append(targetName);
}
excludeCount++;
}
String targetType = Selector.THIRD;
if (material && !item && !entity) {
targetType = Selector.FIRST;
} else if (material && item && !entity) {
targetType = Selector.THIRD;
} else if (entity && !material) {
targetType = Selector.SECOND;
}
if (excludeCount > 0) {
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_INCLUDE,
excludeTargets.toString(),
Selector.SECOND,
targetType,
(excludeCount == 1 ? Selector.FIRST : Selector.SECOND))); // exclude
+ Phrase.build(Phrase.ROLLBACK_INCLUDE, excludeTargets.toString(), Selector.SECOND,
targetType, (excludeCount == 1 ? Selector.FIRST : Selector.SECOND))); // exclude
}
}
if (excludeUserList.size() > 0) {
StringBuilder excludeUsers = new StringBuilder();
int excludeCount = 0;
for (String excludeUser : excludeUserList) {
// don't display that excluded #hopper in inventory rollbacks
if (actionList.contains(4) && actionList.contains(11)) {
if (excludeUser.equals("#hopper")) {
continue;
}
}
if (excludeCount == 0) {
excludeUsers = excludeUsers.append("" + excludeUser + "");
} else {
excludeUsers.append(", ").append(excludeUser);
}
excludeCount++;
}
if (excludeCount > 0) {
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_EXCLUDED_USERS,
excludeUsers.toString(),
+ Phrase.build(Phrase.ROLLBACK_EXCLUDED_USERS, excludeUsers.toString(),
(excludeCount == 1 ? Selector.FIRST : Selector.SECOND)));
}
}
StringBuilder modifiedData = new StringBuilder();
Integer modifyCount = 0;
if (actionList.contains(5)) {
modifiedData = modifiedData.append(Phrase.build(
Phrase.AMOUNT_ITEM,
NumberFormat.getInstance().format(blockCount),
modifiedData = modifiedData
.append(Phrase.build(Phrase.AMOUNT_ITEM, NumberFormat.getInstance().format(blockCount),
(blockCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
} else {
if (itemCount > 0 || actionList.contains(4)) {
modifiedData = modifiedData.append(Phrase.build(
Phrase.AMOUNT_ITEM,
NumberFormat.getInstance().format(itemCount),
modifiedData = modifiedData
.append(Phrase.build(Phrase.AMOUNT_ITEM, NumberFormat.getInstance().format(itemCount),
(itemCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
}
if (entityCount > 0) {
if (modifyCount > 0) {
modifiedData.append(", ");
}
modifiedData.append(Phrase.build(
Phrase.AMOUNT_ENTITY,
NumberFormat.getInstance().format(entityCount),
modifiedData
.append(Phrase.build(Phrase.AMOUNT_ENTITY, NumberFormat.getInstance().format(entityCount),
(entityCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
}
if (blockCount > 0 || !actionList.contains(4) || preview > 0) {
if (modifyCount > 0) {
modifiedData.append(", ");
}
modifiedData.append(Phrase.build(
Phrase.AMOUNT_BLOCK,
NumberFormat.getInstance().format(blockCount),
modifiedData.append(Phrase.build(Phrase.AMOUNT_BLOCK, NumberFormat.getInstance().format(blockCount),
(blockCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
}
}
StringBuilder modifiedDataVerbose = new StringBuilder();
if (verbose && preview == 0 && !actionList.contains(11)) {
if (chunkCount > -1 && modifyCount < 3) {
if (modifyCount > 0) {
modifiedData.append(", ");
}
modifiedData.append(Phrase.build(
Phrase.AMOUNT_CHUNK,
NumberFormat.getInstance().format(chunkCount),
(chunkCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
} else if (chunkCount > 1) {
modifiedDataVerbose.append(Phrase.build(
Phrase.AMOUNT_CHUNK,
NumberFormat.getInstance().format(chunkCount),
(chunkCount == 1 ? Selector.FIRST : Selector.SECOND)));
}
}
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_MODIFIED,
modifiedData.toString(),
(preview == 0 ? Selector.FIRST : Selector.SECOND)));
modifiedData.append(Phrase.build(Phrase.AMOUNT_CHUNK, NumberFormat.getInstance().format(chunkCount),
(chunkCount == 1 ? Selector.FIRST : Selector.SECOND)));
modifyCount++;
} else if (chunkCount > 1) {
modifiedDataVerbose
.append(Phrase.build(Phrase.AMOUNT_CHUNK, NumberFormat.getInstance().format(chunkCount),
(chunkCount == 1 ? Selector.FIRST : Selector.SECOND)));
}
}
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.ROLLBACK_MODIFIED,
modifiedData.toString(), (preview == 0 ? Selector.FIRST : Selector.SECOND)));
if (modifiedDataVerbose.length() > 0) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_MODIFIED,
modifiedDataVerbose.toString(),
(preview == 0 ? Selector.FIRST : Selector.SECOND)));
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- " + Phrase.build(Phrase.ROLLBACK_MODIFIED,
modifiedDataVerbose.toString(), (preview == 0 ? Selector.FIRST : Selector.SECOND)));
}
if (preview == 0) {
BigDecimal decimalSeconds = new BigDecimal(seconds).setScale(1, RoundingMode.HALF_EVEN);
Chat.sendMessage(
user,
Chat.sendMessage(user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(
Phrase.ROLLBACK_LENGTH,
+ Phrase.build(Phrase.ROLLBACK_LENGTH,
decimalSeconds.stripTrailingZeros().toPlainString(),
(decimalSeconds.doubleValue() == 1 ? Selector.FIRST : Selector.SECOND)));
}
Chat.sendMessage(user, "-----");
if (preview > 0) {
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.PLEASE_SELECT, "/co apply", "/co cancel"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -36,421 +36,646 @@ import org.bukkit.util.io.BukkitObjectInputStream;
public class RollbackUtil extends Lookup {
protected static int modifyContainerItems(
Material type, Object container, int slot, ItemStack itemstack, int action) {
protected static int modifyContainerItems(Material type, Object container, int slot, ItemStack itemstack,
int action)
{
int modifiedArmor = -1;
try {
ItemStack[] contents = null;
if (type != null && type.equals(Material.ARMOR_STAND)) {
EntityEquipment equipment = (EntityEquipment) container;
if (equipment != null) {
if (action == 1) {
itemstack.setAmount(1);
} else {
itemstack.setType(Material.AIR);
itemstack.setAmount(0);
}
if (slot < 4) {
contents = equipment.getArmorContents();
if (slot >= 0) {
contents[slot] = itemstack;
}
equipment.setArmorContents(contents);
} else {
ArmorStand armorStand = (ArmorStand) equipment.getHolder();
armorStand.setArms(true);
switch (slot) {
case 4:
equipment.setItemInMainHand(itemstack);
break;
case 5:
equipment.setItemInOffHand(itemstack);
break;
}
}
}
} else if (type != null && type.equals(Material.ITEM_FRAME)) {
ItemFrame frame = (ItemFrame) container;
if (frame != null) {
if (action == 1) {
itemstack.setAmount(1);
} else {
itemstack.setType(Material.AIR);
itemstack.setAmount(0);
}
frame.setItem(itemstack);
}
} else if (type != null && type.equals(Material.JUKEBOX)) {
Jukebox jukebox = (Jukebox) container;
if (jukebox != null) {
if (action == 1 && itemstack.getType().name().startsWith("MUSIC_DISC")) {
itemstack.setAmount(1);
} else {
itemstack.setType(Material.AIR);
itemstack.setAmount(0);
}
jukebox.setRecord(itemstack);
jukebox.update();
}
} else {
Inventory inventory = (Inventory) container;
if (inventory != null) {
boolean isPlayerInventory = (inventory instanceof PlayerInventory);
if (action == 1) {
int count = 0;
int amount = itemstack.getAmount();
itemstack.setAmount(1);
while (count < amount) {
boolean addedItem = false;
if (isPlayerInventory) {
int setArmor = Util.setPlayerArmor((PlayerInventory) inventory, itemstack);
addedItem = (setArmor > -1);
modifiedArmor = addedItem ? setArmor : modifiedArmor;
}
if (!addedItem) {
if (BukkitAdapter.ADAPTER.isChiseledBookshelf(type)) {
ItemStack[] inventoryContents = inventory.getStorageContents();
int i = 0;
for (ItemStack stack : inventoryContents) {
if (stack == null) {
inventoryContents[i] = itemstack;
addedItem = true;
break;
}
i++;
}
if (addedItem) {
inventory.setStorageContents(inventoryContents);
} else {
addedItem =
(inventory.addItem(itemstack).size() == 0);
}
} else {
addedItem = (inventory.addItem(itemstack).size() == 0);
}
} else {
addedItem = (inventory.addItem(itemstack).size() == 0);
}
}
if (!addedItem && isPlayerInventory) {
PlayerInventory playerInventory = (PlayerInventory) inventory;
ItemStack offhand = playerInventory.getItemInOffHand();
if (offhand == null
|| offhand.getType() == Material.AIR
if (offhand == null || offhand.getType() == Material.AIR
|| (itemstack.isSimilar(offhand)
&& offhand.getAmount() < offhand.getMaxStackSize())) {
&& offhand.getAmount() < offhand.getMaxStackSize()))
{
ItemStack setOffhand = itemstack.clone();
if (itemstack.isSimilar(offhand)) {
setOffhand.setAmount(offhand.getAmount() + 1);
}
playerInventory.setItemInOffHand(setOffhand);
}
}
count++;
}
} else {
int removeAmount = itemstack.getAmount();
ItemStack removeMatch = itemstack.clone();
removeMatch.setAmount(1);
ItemStack[] inventoryContents =
(isPlayerInventory ? inventory.getContents() : inventory.getStorageContents()).clone();
ItemStack[] inventoryContents = (isPlayerInventory ? inventory.getContents()
: inventory.getStorageContents()).clone();
for (int i = inventoryContents.length - 1; i >= 0; i--) {
if (inventoryContents[i] != null) {
ItemStack itemStack = inventoryContents[i].clone();
int maxAmount = itemStack.getAmount();
int currentAmount = maxAmount;
itemStack.setAmount(1);
if (itemStack.toString().equals(removeMatch.toString())) {
for (int scan = 0; scan < maxAmount; scan++) {
if (removeAmount > 0) {
currentAmount--;
itemStack.setAmount(currentAmount);
removeAmount--;
} else {
break;
}
}
} else {
itemStack.setAmount(maxAmount);
}
if (itemStack.getAmount() == 0) {
inventoryContents[i] = null;
} else {
inventoryContents[i] = itemStack;
}
}
if (removeAmount == 0) {
break;
}
}
if (isPlayerInventory) {
inventory.setContents(inventoryContents);
} else {
inventory.setStorageContents(inventoryContents);
}
int count = 0;
while (count < removeAmount) {
inventory.removeItem(removeMatch);
count++;
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return modifiedArmor;
}
public static void sortContainerItems(PlayerInventory inventory, List<Integer> modifiedArmorSlots) {
try {
ItemStack[] armorContents = inventory.getArmorContents();
ItemStack[] storageContents = inventory.getStorageContents();
for (int armor = 0; armor < armorContents.length; armor++) {
ItemStack armorItem = armorContents[armor];
if (armorItem == null || !modifiedArmorSlots.contains(armor)) {
continue;
}
for (int storage = 0; storage < storageContents.length; storage++) {
ItemStack storageItem = storageContents[storage];
if (storageItem == null) {
storageContents[storage] = armorItem;
armorContents[armor] = null;
break;
}
}
}
inventory.setArmorContents(armorContents);
inventory.setStorageContents(storageContents);
} catch (Exception e) {
e.printStackTrace();
}
}
private static void buildFireworkEffect(Builder effectBuilder, Material rowType, ItemStack itemstack) {
try {
FireworkEffect effect = effectBuilder.build();
if ((rowType == Material.FIREWORK_ROCKET)) {
FireworkMeta meta = (FireworkMeta) itemstack.getItemMeta();
meta.addEffect(effect);
itemstack.setItemMeta(meta);
} else if ((rowType == Material.FIREWORK_STAR)) {
FireworkEffectMeta meta = (FireworkEffectMeta) itemstack.getItemMeta();
meta.setEffect(effect);
itemstack.setItemMeta(meta);
}
} catch (Exception e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
public static Object[] populateItemStack(ItemStack itemstack, Object list) {
int slot = 0;
String faceData = "";
try {
/*
if (list instanceof Object[]) {
slot = (int) ((Object[]) list)[0];
ItemMeta itemMeta = (ItemMeta) ((Object[]) list)[1];
itemstack.setItemMeta(itemMeta);
return new Object[] { slot, itemstack };
}
* if (list instanceof Object[]) { slot = (int) ((Object[]) list)[0]; ItemMeta
* itemMeta = (ItemMeta) ((Object[]) list)[1]; itemstack.setItemMeta(itemMeta);
* return new Object[] { slot, itemstack }; }
*/
Material rowType = itemstack.getType();
List<Object> metaList = (List<Object>) list;
if (metaList.size() > 0 && !(metaList.get(0) instanceof List<?>)) {
if (rowType.name().endsWith("_BANNER")) {
BannerMeta meta = (BannerMeta) itemstack.getItemMeta();
for (Object value : metaList) {
if (value instanceof Map) {
Pattern pattern = new Pattern((Map<String, Object>) value);
meta.addPattern(pattern);
}
}
itemstack.setItemMeta(meta);
} else if (BlockGroup.SHULKER_BOXES.contains(rowType)) {
BlockStateMeta meta = (BlockStateMeta) itemstack.getItemMeta();
ShulkerBox shulkerBox = (ShulkerBox) meta.getBlockState();
for (Object value : metaList) {
ItemStack item = Util.unserializeItemStackLegacy(value);
if (item != null) {
shulkerBox.getInventory().addItem(item);
}
}
meta.setBlockState(shulkerBox);
itemstack.setItemMeta(meta);
}
return new Object[] { slot, faceData, itemstack };
}
int itemCount = 0;
Builder effectBuilder = FireworkEffect.builder();
for (List<Map<String, Object>> map : (List<List<Map<String, Object>>>) list) {
if (map.size() == 0) {
if (itemCount == 3 && (rowType == Material.FIREWORK_ROCKET || rowType == Material.FIREWORK_STAR)) {
buildFireworkEffect(effectBuilder, rowType, itemstack);
itemCount = 0;
}
itemCount++;
continue;
}
Map<String, Object> mapData = map.get(0);
if (mapData.get("slot") != null) {
slot = (Integer) mapData.get("slot");
} else if (mapData.get("facing") != null) {
faceData = (String) mapData.get("facing");
} else if (mapData.get("modifiers") != null) {
ItemMeta itemMeta = itemstack.getItemMeta();
if (itemMeta.hasAttributeModifiers()) {
for (Map.Entry<Attribute, AttributeModifier> entry :
itemMeta.getAttributeModifiers().entries()) {
for (Map.Entry<Attribute, AttributeModifier> entry : itemMeta.getAttributeModifiers()
.entries())
{
itemMeta.removeAttributeModifier(entry.getKey(), entry.getValue());
}
}
List<Object> modifiers = (List<Object>) mapData.get("modifiers");
for (Object item : modifiers) {
Map<Object, Map<String, Object>> modifiersMap = (Map<Object, Map<String, Object>>) item;
for (Map.Entry<Object, Map<String, Object>> entry : modifiersMap.entrySet()) {
try {
Attribute attribute = null;
if (entry.getKey() instanceof Attribute) {
attribute = (Attribute) entry.getKey();
} else {
attribute = (Attribute) BukkitAdapter.ADAPTER.getRegistryValue(
(String) entry.getKey(), Attribute.class);
attribute = (Attribute) BukkitAdapter.ADAPTER
.getRegistryValue((String) entry.getKey(), Attribute.class);
}
AttributeModifier modifier = AttributeModifier.deserialize(entry.getValue());
itemMeta.addAttributeModifier(attribute, modifier);
} catch (IllegalArgumentException e) {
// AttributeModifier already exists
}
}
}
itemstack.setItemMeta(itemMeta);
} else if (itemCount == 0) {
ItemMeta meta =
Util.deserializeItemMeta(itemstack.getItemMeta().getClass(), map.get(0));
ItemMeta meta = Util.deserializeItemMeta(itemstack.getItemMeta().getClass(), map.get(0));
itemstack.setItemMeta(meta);
if (map.size() > 1 && (rowType == Material.POTION)) {
PotionMeta subMeta = (PotionMeta) itemstack.getItemMeta();
org.bukkit.Color color = org.bukkit.Color.deserialize(map.get(1));
subMeta.setColor(color);
itemstack.setItemMeta(subMeta);
}
} else {
if ((rowType == Material.LEATHER_HORSE_ARMOR)
|| (rowType == Material.LEATHER_HELMET)
|| (rowType == Material.LEATHER_CHESTPLATE)
|| (rowType == Material.LEATHER_LEGGINGS)
|| (rowType == Material.LEATHER_BOOTS)) { // leather armor
if ((rowType == Material.LEATHER_HORSE_ARMOR) || (rowType == Material.LEATHER_HELMET)
|| (rowType == Material.LEATHER_CHESTPLATE) || (rowType == Material.LEATHER_LEGGINGS)
|| (rowType == Material.LEATHER_BOOTS))
{ // leather armor
for (Map<String, Object> colorData : map) {
LeatherArmorMeta meta = (LeatherArmorMeta) itemstack.getItemMeta();
org.bukkit.Color color = org.bukkit.Color.deserialize(colorData);
meta.setColor(color);
itemstack.setItemMeta(meta);
}
} else if ((rowType == Material.POTION)) { // potion
for (Map<String, Object> potionData : map) {
PotionMeta meta = (PotionMeta) itemstack.getItemMeta();
PotionEffect effect = new PotionEffect(potionData);
meta.addCustomEffect(effect, true);
itemstack.setItemMeta(meta);
}
} else if (rowType.name().endsWith("_BANNER")) {
for (Map<String, Object> patternData : map) {
BannerMeta meta = (BannerMeta) itemstack.getItemMeta();
Pattern pattern = new Pattern(patternData);
meta.addPattern(pattern);
itemstack.setItemMeta(meta);
}
} else if ((rowType == Material.CROSSBOW)) {
CrossbowMeta meta = (CrossbowMeta) itemstack.getItemMeta();
for (Map<String, Object> itemData : map) {
ItemStack crossbowItem = Util.unserializeItemStack(itemData);
if (crossbowItem != null) {
meta.addChargedProjectile(crossbowItem);
}
}
itemstack.setItemMeta(meta);
} else if (rowType == Material.MAP || rowType == Material.FILLED_MAP) {
for (Map<String, Object> colorData : map) {
MapMeta meta = (MapMeta) itemstack.getItemMeta();
org.bukkit.Color color = org.bukkit.Color.deserialize(colorData);
meta.setColor(color);
itemstack.setItemMeta(meta);
}
} else if ((rowType == Material.FIREWORK_ROCKET) || (rowType == Material.FIREWORK_STAR)) {
if (itemCount == 1) {
effectBuilder = FireworkEffect.builder();
for (Map<String, Object> fireworkData : map) {
org.bukkit.FireworkEffect.Type type = (org.bukkit.FireworkEffect.Type)
fireworkData.getOrDefault("type", org.bukkit.FireworkEffect.Type.BALL);
org.bukkit.FireworkEffect.Type type = (org.bukkit.FireworkEffect.Type) fireworkData
.getOrDefault("type", org.bukkit.FireworkEffect.Type.BALL);
boolean hasFlicker = (Boolean) fireworkData.get("flicker");
boolean hasTrail = (Boolean) fireworkData.get("trail");
effectBuilder.with(type);
effectBuilder.flicker(hasFlicker);
effectBuilder.trail(hasTrail);
}
} else if (itemCount == 2) {
for (Map<String, Object> colorData : map) {
org.bukkit.Color color = org.bukkit.Color.deserialize(colorData);
effectBuilder.withColor(color);
}
} else if (itemCount == 3) {
for (Map<String, Object> colorData : map) {
org.bukkit.Color color = org.bukkit.Color.deserialize(colorData);
effectBuilder.withFade(color);
}
buildFireworkEffect(effectBuilder, rowType, itemstack);
itemCount = 0;
}
} else if ((rowType == Material.SUSPICIOUS_STEW)) {
for (Map<String, Object> suspiciousStewData : map) {
SuspiciousStewMeta meta = (SuspiciousStewMeta) itemstack.getItemMeta();
PotionEffect effect = new PotionEffect(suspiciousStewData);
meta.addCustomEffect(effect, true);
itemstack.setItemMeta(meta);
}
} else {
BukkitAdapter.ADAPTER.setItemMeta(rowType, itemstack, map);
}
}
itemCount++;
}
} catch (Exception e) {
e.printStackTrace();
}
return new Object[] { slot, faceData, itemstack };
}
public static Object[] populateItemStack(ItemStack itemstack, byte[] metadata) {
if (metadata != null) {
try {
ByteArrayInputStream metaByteStream = new ByteArrayInputStream(metadata);
BukkitObjectInputStream metaObjectStream = new BukkitObjectInputStream(metaByteStream);
Object metaList = metaObjectStream.readObject();
@@ -458,11 +683,17 @@ public class RollbackUtil extends Lookup {
metaByteStream.close();
return populateItemStack(itemstack, metaList);
} catch (Exception e) {
e.printStackTrace();
}
}
return new Object[] { 0, "", itemstack };
}
}
@@ -7,30 +7,24 @@ import net.coreprotect.utility.Util;
public class BlockStatement {
private BlockStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
int time,
int id,
int wid,
int x,
int y,
int z,
int type,
int data,
List<Object> meta,
String blockData,
int action,
int rolledBack) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y,
int z, int type, int data, List<Object> meta, String blockData, int action, int rolledBack)
{
try {
byte[] bBlockData = Util.stringToByteData(blockData, type);
byte[] byteData = null;
if (meta != null) {
byteData = Util.convertByteData(meta);
}
preparedStmt.setInt(1, time);
@@ -48,10 +42,17 @@ public class BlockStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -5,20 +5,17 @@ import java.sql.PreparedStatement;
public class ChatStatement {
private ChatStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
long time,
int user,
int wid,
int x,
int y,
int z,
String message) {
public static void insert(PreparedStatement preparedStmt, int batchCount, long time, int user, int wid, int x,
int y, int z, String message)
{
try {
preparedStmt.setLong(1, time);
preparedStmt.setInt(2, user);
preparedStmt.setInt(3, wid);
@@ -29,10 +26,17 @@ public class ChatStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -5,20 +5,17 @@ import java.sql.PreparedStatement;
public class CommandStatement {
private CommandStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
long time,
int user,
int wid,
int x,
int y,
int z,
String message) {
public static void insert(PreparedStatement preparedStmt, int batchCount, long time, int user, int wid, int x,
int y, int z, String message)
{
try {
preparedStmt.setLong(1, time);
preparedStmt.setInt(2, user);
preparedStmt.setInt(3, wid);
@@ -29,10 +26,17 @@ public class CommandStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -6,25 +6,17 @@ import net.coreprotect.utility.Util;
public class ContainerStatement {
private ContainerStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
int time,
int id,
int wid,
int x,
int y,
int z,
int type,
int data,
int amount,
Object metadata,
int action,
int rolledBack) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y,
int z, int type, int data, int amount, Object metadata, int action, int rolledBack)
{
try {
byte[] byteData = Util.convertByteData(metadata);
preparedStmt.setInt(1, time);
preparedStmt.setInt(2, id);
@@ -41,10 +33,17 @@ public class ContainerStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -16,11 +16,15 @@ import org.bukkit.util.io.BukkitObjectOutputStream;
public class EntityStatement {
private EntityStatement() {
throw new IllegalStateException("Database class");
}
public static ResultSet insert(PreparedStatement preparedStmt, int time, List<Object> data) {
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
BukkitObjectOutputStream oos = new BukkitObjectOutputStream(bos);
oos.writeObject(data);
@@ -32,23 +36,34 @@ public class EntityStatement {
preparedStmt.setInt(1, time);
preparedStmt.setObject(2, byte_data);
if (Database.hasReturningKeys()) {
return preparedStmt.executeQuery();
} else {
preparedStmt.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static List<Object> getData(Statement statement, BlockState block, String query) {
List<Object> result = new ArrayList<>();
try {
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
byte[] data = resultSet.getBytes("data");
ByteArrayInputStream bais = new ByteArrayInputStream(data);
BukkitObjectInputStream ins = new BukkitObjectInputStream(bais);
@@ -57,15 +72,23 @@ public class EntityStatement {
ins.close();
bais.close();
result = input;
}
resultSet.close();
} catch (Exception e) { // only display exception on development branch
if (!ConfigHandler.EDITION_BRANCH.contains("-dev")) {
e.printStackTrace();
}
}
return result;
}
}
@@ -6,23 +6,17 @@ import net.coreprotect.utility.Util;
public class ItemStatement {
private ItemStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
int time,
int id,
int wid,
int x,
int y,
int z,
int type,
Object data,
int amount,
int action) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y,
int z, int type, Object data, int amount, int action)
{
try {
byte[] byteData = Util.convertByteData(data);
preparedStmt.setInt(1, time);
preparedStmt.setInt(2, id);
@@ -38,10 +32,17 @@ public class ItemStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -7,36 +7,56 @@ import java.sql.Statement;
public class MaterialStatement {
private MaterialStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(PreparedStatement preparedStmt, int batchCount, int id, String name) {
try {
preparedStmt.setInt(1, id);
preparedStmt.setString(2, name);
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean hasMaterial(Statement statement, String query) {
boolean result = false;
try {
ResultSet resultSet = statement.executeQuery(query);
if (resultSet.next()) {
result = true;
}
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
@@ -5,20 +5,17 @@ import java.sql.PreparedStatement;
public class SessionStatement {
private SessionStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
int time,
int user,
int wid,
int x,
int y,
int z,
int action) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int user, int wid, int x, int y,
int z, int action)
{
try {
preparedStmt.setInt(1, time);
preparedStmt.setInt(2, user);
preparedStmt.setInt(3, wid);
@@ -29,10 +26,17 @@ public class SessionStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -11,33 +11,18 @@ import org.bukkit.block.Sign;
public class SignStatement {
private SignStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(
PreparedStatement preparedStmt,
int batchCount,
int time,
int id,
int wid,
int x,
int y,
int z,
int action,
int color,
int colorSecondary,
int data,
int waxed,
int face,
String line1,
String line2,
String line3,
String line4,
String line5,
String line6,
String line7,
String line8) {
public static void insert(PreparedStatement preparedStmt, int batchCount, int time, int id, int wid, int x, int y,
int z, int action, int color, int colorSecondary, int data, int waxed, int face, String line1, String line2,
String line3, String line4, String line5, String line6, String line7, String line8)
{
try {
preparedStmt.setInt(1, time);
preparedStmt.setInt(2, id);
preparedStmt.setInt(3, wid);
@@ -61,23 +46,34 @@ public class SignStatement {
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void getData(Statement statement, BlockState block, String query) {
try {
if (!(block instanceof Sign)) {
return;
}
Sign sign = (Sign) block;
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
int color = resultSet.getInt("color");
int colorSecondary = resultSet.getInt("color_secondary");
int data = resultSet.getInt("data");
@@ -93,10 +89,15 @@ public class SignStatement {
String line8 = resultSet.getString("line_8");
if (color > 0) {
BukkitAdapter.ADAPTER.setColor(sign, true, color);
}
if (colorSecondary > 0) {
BukkitAdapter.ADAPTER.setColor(sign, false, colorSecondary);
}
boolean frontGlowing = Util.isSideGlowing(true, data);
@@ -112,11 +113,17 @@ public class SignStatement {
BukkitAdapter.ADAPTER.setLine(sign, 6, line7);
BukkitAdapter.ADAPTER.setLine(sign, 7, line8);
BukkitAdapter.ADAPTER.setWaxed(sign, isWaxed);
}
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -11,50 +11,77 @@ import org.bukkit.block.Skull;
public class SkullStatement {
private SkullStatement() {
throw new IllegalStateException("Database class");
}
public static ResultSet insert(PreparedStatement preparedStmt, int time, String owner, String skin) {
try {
preparedStmt.setInt(1, time);
preparedStmt.setString(2, owner);
preparedStmt.setString(3, skin);
if (Database.hasReturningKeys()) {
return preparedStmt.executeQuery();
} else {
preparedStmt.executeUpdate();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void getData(Statement statement, BlockState block, String query) {
try {
if (!(block instanceof Skull)) {
return;
}
Skull skull = (Skull) block;
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
String owner = resultSet.getString("owner");
if (owner != null && owner.length() > 1) {
PaperAdapter.ADAPTER.setSkullOwner(skull, owner);
}
String skin = resultSet.getString("skin");
if (owner != null && skin != null && skin.length() > 0) {
PaperAdapter.ADAPTER.setSkullSkin(skull, skin);
}
}
resultSet.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -13,69 +13,96 @@ import net.coreprotect.database.Database;
public class UserStatement {
private UserStatement() {
throw new IllegalStateException("Database class");
}
public static int insert(Connection connection, String user) {
int id = -1;
try {
int unixtimestamp = (int) (System.currentTimeMillis() / 1000L);
PreparedStatement preparedStmt = null;
if (Database.hasReturningKeys()) {
preparedStmt = connection.prepareStatement(
"INSERT INTO " + ConfigHandler.prefix + "user (time, user) VALUES (?, ?) RETURNING rowid");
} else {
preparedStmt = connection.prepareStatement(
"INSERT INTO " + ConfigHandler.prefix + "user (time, user) VALUES (?, ?)",
Statement.RETURN_GENERATED_KEYS);
}
preparedStmt.setInt(1, unixtimestamp);
preparedStmt.setString(2, user);
if (Database.hasReturningKeys()) {
ResultSet resultSet = preparedStmt.executeQuery();
resultSet.next();
id = resultSet.getInt(1);
resultSet.close();
} else {
preparedStmt.executeUpdate();
ResultSet keys = preparedStmt.getGeneratedKeys();
keys.next();
id = keys.getInt(1);
keys.close();
}
preparedStmt.close();
} catch (Exception e) {
e.printStackTrace();
}
return id;
}
public static int getId(PreparedStatement preparedStatement, String user, boolean load) throws SQLException {
if (load && !ConfigHandler.playerIdCache.containsKey(user.toLowerCase(Locale.ROOT))) {
UserStatement.loadId(preparedStatement.getConnection(), user, null);
}
return ConfigHandler.playerIdCache.get(user.toLowerCase(Locale.ROOT));
}
public static int loadId(Connection connection, String user, String uuid) {
// generate if doesn't exist
int id = -1;
try {
String collate = "";
if (!Config.getGlobal().MYSQL) {
collate = " COLLATE NOCASE";
}
String where = "user = ?" + collate;
if (uuid != null) {
where = where + " OR uuid = ?";
}
String query = "SELECT rowid as id, uuid FROM " + ConfigHandler.prefix + "user WHERE " + where
@@ -84,67 +111,93 @@ public class UserStatement {
preparedStmt.setString(1, user);
if (uuid != null) {
preparedStmt.setString(2, uuid);
}
ResultSet resultSet = preparedStmt.executeQuery();
while (resultSet.next()) {
id = resultSet.getInt("id");
uuid = resultSet.getString("uuid");
}
resultSet.close();
preparedStmt.close();
if (id == -1) {
id = insert(connection, user);
}
ConfigHandler.playerIdCache.put(user.toLowerCase(Locale.ROOT), id);
ConfigHandler.playerIdCacheReversed.put(id, user);
if (uuid != null) {
ConfigHandler.uuidCache.put(user.toLowerCase(Locale.ROOT), uuid);
ConfigHandler.uuidCacheReversed.put(uuid, user);
}
} catch (Exception e) {
e.printStackTrace();
}
return id;
}
public static String loadName(Connection connection, int id) {
// generate if doesn't exist
String user = "";
String uuid = null;
try {
Statement statement = connection.createStatement();
String query =
"SELECT user, uuid FROM " + ConfigHandler.prefix + "user WHERE rowid='" + id + "' LIMIT 0, 1";
String query = "SELECT user, uuid FROM " + ConfigHandler.prefix + "user WHERE rowid='" + id
+ "' LIMIT 0, 1";
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
user = resultSet.getString("user");
uuid = resultSet.getString("uuid");
}
if (user.length() == 0) {
return user;
}
ConfigHandler.playerIdCache.put(user.toLowerCase(Locale.ROOT), id);
ConfigHandler.playerIdCacheReversed.put(id, user);
if (uuid != null) {
ConfigHandler.uuidCache.put(user.toLowerCase(Locale.ROOT), uuid);
ConfigHandler.uuidCacheReversed.put(uuid, user);
}
resultSet.close();
statement.close();
} catch (Exception e) {
e.printStackTrace();
}
return user;
}
}
@@ -5,20 +5,31 @@ import java.sql.PreparedStatement;
public class WorldStatement {
private WorldStatement() {
throw new IllegalStateException("Database class");
}
public static void insert(PreparedStatement preparedStmt, int batchCount, int id, String world) {
try {
preparedStmt.setInt(1, id);
preparedStmt.setString(2, world);
preparedStmt.addBatch();
if (batchCount > 0 && batchCount % 1000 == 0) {
preparedStmt.executeBatch();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
@@ -11,38 +11,55 @@ public class CoreProtectPreLogEvent extends Event implements Cancellable {
private String user;
public CoreProtectPreLogEvent(String user) {
super(true); // async
this.user = user;
}
public String getUser() {
return user;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
public void setUser(String newUser) {
if (newUser == null || newUser.isEmpty()) {
throw new IllegalArgumentException("Invalid user");
}
this.user = newUser;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
public static HandlerList getHandlerList() {
return handlers;
}
}
@@ -9,16 +9,21 @@ import org.bukkit.command.CommandSender;
public class Extensions {
public static void runDatabaseMigration(String command, CommandSender user, String[] argumentArray) {
try {
Class<?> patchClass = Class.forName("net.coreprotect.extensions.DatabaseMigration");
Method patchMethod = patchClass.getDeclaredMethod("runCommand", CommandSender.class, String[].class);
patchMethod.invoke(null, user, argumentArray);
} catch (Exception e) {
// plugin not compiled with extension
Chat.sendMessage(
user,
Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
Chat.sendMessage(user, Color.DARK_AQUA + "CoreProtect " + Color.WHITE + "- "
+ Phrase.build(Phrase.COMMAND_NOT_FOUND, Color.WHITE, "/co " + command));
}
}
}
@@ -9,26 +9,37 @@ public class Language {
private static ConcurrentHashMap<Phrase, String> translatedPhrases = new ConcurrentHashMap<>();
protected static String getPhrase(Phrase phrase) {
return phrases.get(phrase);
}
protected static String getUserPhrase(Phrase phrase) {
return userPhrases.get(phrase);
}
protected static String getTranslatedPhrase(Phrase phrase) {
return translatedPhrases.get(phrase);
}
protected static void setUserPhrase(Phrase phrase, String value) {
userPhrases.put(phrase, value);
}
protected static void setTranslatedPhrase(Phrase phrase, String value) {
translatedPhrases.put(phrase, value);
}
public static void loadPhrases() {
phrases.put(Phrase.ACTION_NOT_SUPPORTED, "That action is not supported by the command.");
phrases.put(Phrase.AMOUNT_BLOCK, "{0} {block|blocks}");
phrases.put(Phrase.AMOUNT_CHUNK, "{0} {chunk|chunks}");
@@ -65,8 +76,7 @@ public class Language {
phrases.put(Phrase.GLOBAL_LOOKUP, "Don't specify a radius to do a global lookup.");
phrases.put(Phrase.GLOBAL_ROLLBACK, "Use \"{0}\" to do a global {rollback|restore}");
phrases.put(Phrase.HELP_ACTION_1, "Restrict the lookup to a certain action.");
phrases.put(
Phrase.HELP_ACTION_2,
phrases.put(Phrase.HELP_ACTION_2,
"Examples: [a:block], [a:+block], [a:-block] [a:click], [a:container], [a:inventory], [a:item], [a:kill], [a:chat], [a:command], [a:sign], [a:session], [a:username]");
phrases.put(Phrase.HELP_COMMAND, "Display more info for that command.");
phrases.put(Phrase.HELP_EXCLUDE_1, "Exclude blocks/users.");
@@ -96,8 +106,7 @@ public class Language {
phrases.put(Phrase.HELP_PARAMS_6, "Include specific blocks/entities in the {lookup|rollback|restore}.");
phrases.put(Phrase.HELP_PARAMS_7, "Exclude blocks/users from the {lookup|rollback|restore}.");
phrases.put(Phrase.HELP_PURGE_1, "Delete data older than specified time.");
phrases.put(
Phrase.HELP_PURGE_2,
phrases.put(Phrase.HELP_PURGE_2,
"For example, \"{0}\" will delete all data older than one month, and only keep the last 30 days of data.");
phrases.put(Phrase.HELP_PURGE_COMMAND, "Delete old block data.");
phrases.put(Phrase.HELP_RADIUS_1, "Specify a radius area.");
@@ -243,5 +252,7 @@ public class Language {
userPhrases.putAll(phrases);
translatedPhrases.putAll(phrases);
}
}
@@ -10,308 +10,166 @@ import net.coreprotect.utility.Color;
import net.coreprotect.utility.Util;
public enum Phrase {
ACTION_NOT_SUPPORTED,
AMOUNT_BLOCK,
AMOUNT_CHUNK,
AMOUNT_ENTITY,
AMOUNT_ITEM,
API_TEST,
CACHE_ERROR,
CACHE_RELOAD,
CHECK_CONFIG,
COMMAND_CONSOLE,
COMMAND_NOT_FOUND,
COMMAND_THROTTLED,
CONSUMER_ERROR,
CONSUMER_TOGGLED,
CONTAINER_HEADER,
CPU_CORES,
DATABASE_BUSY,
DATABASE_INDEX_ERROR,
DATABASE_LOCKED_1,
DATABASE_LOCKED_2,
DATABASE_LOCKED_3,
DATABASE_LOCKED_4,
DATABASE_UNREACHABLE,
DEVELOPMENT_BRANCH,
DIRT_BLOCK,
DISABLE_SUCCESS,
DONATION_KEY_REQUIRED,
ENABLE_FAILED,
ENABLE_SUCCESS,
ENJOY_COREPROTECT,
FINISHING_CONVERSION,
FINISHING_LOGGING,
FIRST_VERSION,
GLOBAL_LOOKUP,
GLOBAL_ROLLBACK,
HELP_ACTION_1,
HELP_ACTION_2,
HELP_COMMAND,
HELP_EXCLUDE_1,
HELP_EXCLUDE_2,
HELP_HEADER,
HELP_INCLUDE_1,
HELP_INCLUDE_2,
HELP_INSPECT_1,
HELP_INSPECT_2,
HELP_INSPECT_3,
HELP_INSPECT_4,
HELP_INSPECT_5,
HELP_INSPECT_6,
HELP_INSPECT_7,
HELP_INSPECT_COMMAND,
HELP_LIST,
HELP_LOOKUP_1,
HELP_LOOKUP_2,
HELP_LOOKUP_COMMAND,
HELP_NO_INFO,
HELP_PARAMETER,
HELP_PARAMS_1,
HELP_PARAMS_2,
HELP_PARAMS_3,
HELP_PARAMS_4,
HELP_PARAMS_5,
HELP_PARAMS_6,
HELP_PARAMS_7,
HELP_PURGE_1,
HELP_PURGE_2,
HELP_PURGE_COMMAND,
HELP_RADIUS_1,
HELP_RADIUS_2,
HELP_RELOAD_COMMAND,
HELP_RESTORE_COMMAND,
HELP_ROLLBACK_COMMAND,
HELP_STATUS,
HELP_STATUS_COMMAND,
HELP_TELEPORT,
HELP_TIME_1,
HELP_TIME_2,
HELP_USER_1,
HELP_USER_2,
INCOMPATIBLE_ACTION,
INSPECTOR_ERROR,
INSPECTOR_TOGGLED,
INTEGRATION_ERROR,
INTEGRATION_SUCCESS,
INTEGRATION_VERSION,
INTERACTIONS_HEADER,
INVALID_ACTION,
INVALID_BRANCH_1,
INVALID_BRANCH_2,
INVALID_BRANCH_3,
INVALID_CONTAINER,
INVALID_DONATION_KEY,
INVALID_INCLUDE,
INVALID_INCLUDE_COMBO,
INVALID_RADIUS,
INVALID_SELECTION,
INVALID_USERNAME,
INVALID_WORLD,
LATEST_VERSION,
LINK_DISCORD,
LINK_DOWNLOAD,
LINK_PATREON,
LINK_WIKI_BLOCK,
LINK_WIKI_ENTITY,
LOGGING_ITEMS,
LOGGING_TIME_LIMIT,
LOOKUP_BLOCK,
LOOKUP_CONTAINER,
LOOKUP_HEADER,
LOOKUP_INTERACTION,
LOOKUP_ITEM,
LOOKUP_LOGIN,
LOOKUP_PAGE,
LOOKUP_PROJECTILE,
LOOKUP_ROWS_FOUND,
LOOKUP_SEARCHING,
LOOKUP_STORAGE,
LOOKUP_TIME,
LOOKUP_USERNAME,
MAXIMUM_RADIUS,
MISSING_ACTION_USER,
MISSING_LOOKUP_TIME,
MISSING_LOOKUP_USER,
MISSING_PARAMETERS,
MISSING_ROLLBACK_RADIUS,
MISSING_ROLLBACK_USER,
MYSQL_UNAVAILABLE,
NETWORK_CONNECTION,
NETWORK_TEST,
NO_DATA,
NO_DATA_LOCATION,
NO_PERMISSION,
NO_RESULTS,
NO_RESULTS_PAGE,
NO_ROLLBACK,
PATCH_INTERRUPTED,
PATCH_OUTDATED_1,
PATCH_OUTDATED_2,
PATCH_PROCESSING,
PATCH_SKIP_UPDATE,
PATCH_STARTED,
PATCH_SUCCESS,
PATCH_UPGRADING,
PLEASE_SELECT,
PREVIEW_CANCELLED,
PREVIEW_CANCELLING,
PREVIEW_IN_GAME,
PREVIEW_TRANSACTION,
PRIMARY_THREAD_ERROR,
PURGE_ABORTED,
PURGE_ERROR,
PURGE_FAILED,
PURGE_IN_PROGRESS,
PURGE_MINIMUM_TIME,
PURGE_NOTICE_1,
PURGE_NOTICE_2,
PURGE_OPTIMIZING,
PURGE_PROCESSING,
PURGE_REPAIRING,
PURGE_ROWS,
PURGE_STARTED,
PURGE_SUCCESS,
RAM_STATS,
RELOAD_STARTED,
RELOAD_SUCCESS,
ROLLBACK_ABORTED,
ROLLBACK_CHUNKS_FOUND,
ROLLBACK_CHUNKS_MODIFIED,
ROLLBACK_COMPLETED,
ROLLBACK_EXCLUDED_USERS,
ROLLBACK_INCLUDE,
ROLLBACK_IN_PROGRESS,
ROLLBACK_LENGTH,
ROLLBACK_MODIFIED,
ROLLBACK_RADIUS,
ROLLBACK_SELECTION,
ROLLBACK_STARTED,
ROLLBACK_TIME,
ROLLBACK_WORLD_ACTION,
SIGN_HEADER,
STATUS_CONSUMER,
STATUS_DATABASE,
STATUS_INTEGRATION,
STATUS_LICENSE,
STATUS_SYSTEM,
STATUS_VERSION,
TELEPORTED,
TELEPORTED_SAFETY,
TELEPORT_PLAYERS,
TIME_DAYS,
TIME_HOURS,
TIME_MINUTES,
TIME_SECONDS,
TIME_WEEKS,
UPDATE_ERROR,
UPDATE_HEADER,
UPDATE_NOTICE,
UPGRADE_IN_PROGRESS,
USER_NOT_FOUND,
USER_OFFLINE,
USING_MYSQL,
USING_SQLITE,
VALID_DONATION_KEY,
VERSION_NOTICE,
VERSION_INCOMPATIBLE,
VERSION_REQUIRED,
WORLD_NOT_FOUND;
private static final Set<Phrase> HEADERS = new HashSet<>(Arrays.asList(
Phrase.CONTAINER_HEADER,
Phrase.HELP_HEADER,
Phrase.INTERACTIONS_HEADER,
Phrase.LOOKUP_HEADER,
Phrase.SIGN_HEADER,
Phrase.UPDATE_HEADER));
ACTION_NOT_SUPPORTED, AMOUNT_BLOCK, AMOUNT_CHUNK, AMOUNT_ENTITY, AMOUNT_ITEM, API_TEST, CACHE_ERROR, CACHE_RELOAD,
CHECK_CONFIG, COMMAND_CONSOLE, COMMAND_NOT_FOUND, COMMAND_THROTTLED, CONSUMER_ERROR, CONSUMER_TOGGLED,
CONTAINER_HEADER, CPU_CORES, DATABASE_BUSY, DATABASE_INDEX_ERROR, DATABASE_LOCKED_1, DATABASE_LOCKED_2,
DATABASE_LOCKED_3, DATABASE_LOCKED_4, DATABASE_UNREACHABLE, DEVELOPMENT_BRANCH, DIRT_BLOCK, DISABLE_SUCCESS,
DONATION_KEY_REQUIRED, ENABLE_FAILED, ENABLE_SUCCESS, ENJOY_COREPROTECT, FINISHING_CONVERSION, FINISHING_LOGGING,
FIRST_VERSION, GLOBAL_LOOKUP, GLOBAL_ROLLBACK, HELP_ACTION_1, HELP_ACTION_2, HELP_COMMAND, HELP_EXCLUDE_1,
HELP_EXCLUDE_2, HELP_HEADER, HELP_INCLUDE_1, HELP_INCLUDE_2, HELP_INSPECT_1, HELP_INSPECT_2, HELP_INSPECT_3,
HELP_INSPECT_4, HELP_INSPECT_5, HELP_INSPECT_6, HELP_INSPECT_7, HELP_INSPECT_COMMAND, HELP_LIST, HELP_LOOKUP_1,
HELP_LOOKUP_2, HELP_LOOKUP_COMMAND, HELP_NO_INFO, HELP_PARAMETER, HELP_PARAMS_1, HELP_PARAMS_2, HELP_PARAMS_3,
HELP_PARAMS_4, HELP_PARAMS_5, HELP_PARAMS_6, HELP_PARAMS_7, HELP_PURGE_1, HELP_PURGE_2, HELP_PURGE_COMMAND,
HELP_RADIUS_1, HELP_RADIUS_2, HELP_RELOAD_COMMAND, HELP_RESTORE_COMMAND, HELP_ROLLBACK_COMMAND, HELP_STATUS,
HELP_STATUS_COMMAND, HELP_TELEPORT, HELP_TIME_1, HELP_TIME_2, HELP_USER_1, HELP_USER_2, INCOMPATIBLE_ACTION,
INSPECTOR_ERROR, INSPECTOR_TOGGLED, INTEGRATION_ERROR, INTEGRATION_SUCCESS, INTEGRATION_VERSION,
INTERACTIONS_HEADER, INVALID_ACTION, INVALID_BRANCH_1, INVALID_BRANCH_2, INVALID_BRANCH_3, INVALID_CONTAINER,
INVALID_DONATION_KEY, INVALID_INCLUDE, INVALID_INCLUDE_COMBO, INVALID_RADIUS, INVALID_SELECTION, INVALID_USERNAME,
INVALID_WORLD, LATEST_VERSION, LINK_DISCORD, LINK_DOWNLOAD, LINK_PATREON, LINK_WIKI_BLOCK, LINK_WIKI_ENTITY,
LOGGING_ITEMS, LOGGING_TIME_LIMIT, LOOKUP_BLOCK, LOOKUP_CONTAINER, LOOKUP_HEADER, LOOKUP_INTERACTION, LOOKUP_ITEM,
LOOKUP_LOGIN, LOOKUP_PAGE, LOOKUP_PROJECTILE, LOOKUP_ROWS_FOUND, LOOKUP_SEARCHING, LOOKUP_STORAGE, LOOKUP_TIME,
LOOKUP_USERNAME, MAXIMUM_RADIUS, MISSING_ACTION_USER, MISSING_LOOKUP_TIME, MISSING_LOOKUP_USER, MISSING_PARAMETERS,
MISSING_ROLLBACK_RADIUS, MISSING_ROLLBACK_USER, MYSQL_UNAVAILABLE, NETWORK_CONNECTION, NETWORK_TEST, NO_DATA,
NO_DATA_LOCATION, NO_PERMISSION, NO_RESULTS, NO_RESULTS_PAGE, NO_ROLLBACK, PATCH_INTERRUPTED, PATCH_OUTDATED_1,
PATCH_OUTDATED_2, PATCH_PROCESSING, PATCH_SKIP_UPDATE, PATCH_STARTED, PATCH_SUCCESS, PATCH_UPGRADING, PLEASE_SELECT,
PREVIEW_CANCELLED, PREVIEW_CANCELLING, PREVIEW_IN_GAME, PREVIEW_TRANSACTION, PRIMARY_THREAD_ERROR, PURGE_ABORTED,
PURGE_ERROR, PURGE_FAILED, PURGE_IN_PROGRESS, PURGE_MINIMUM_TIME, PURGE_NOTICE_1, PURGE_NOTICE_2, PURGE_OPTIMIZING,
PURGE_PROCESSING, PURGE_REPAIRING, PURGE_ROWS, PURGE_STARTED, PURGE_SUCCESS, RAM_STATS, RELOAD_STARTED,
RELOAD_SUCCESS, ROLLBACK_ABORTED, ROLLBACK_CHUNKS_FOUND, ROLLBACK_CHUNKS_MODIFIED, ROLLBACK_COMPLETED,
ROLLBACK_EXCLUDED_USERS, ROLLBACK_INCLUDE, ROLLBACK_IN_PROGRESS, ROLLBACK_LENGTH, ROLLBACK_MODIFIED,
ROLLBACK_RADIUS, ROLLBACK_SELECTION, ROLLBACK_STARTED, ROLLBACK_TIME, ROLLBACK_WORLD_ACTION, SIGN_HEADER,
STATUS_CONSUMER, STATUS_DATABASE, STATUS_INTEGRATION, STATUS_LICENSE, STATUS_SYSTEM, STATUS_VERSION, TELEPORTED,
TELEPORTED_SAFETY, TELEPORT_PLAYERS, TIME_DAYS, TIME_HOURS, TIME_MINUTES, TIME_SECONDS, TIME_WEEKS, UPDATE_ERROR,
UPDATE_HEADER, UPDATE_NOTICE, UPGRADE_IN_PROGRESS, USER_NOT_FOUND, USER_OFFLINE, USING_MYSQL, USING_SQLITE,
VALID_DONATION_KEY, VERSION_NOTICE, VERSION_INCOMPATIBLE, VERSION_REQUIRED, WORLD_NOT_FOUND;
private static final Set<Phrase> HEADERS = new HashSet<>(Arrays.asList(Phrase.CONTAINER_HEADER, Phrase.HELP_HEADER,
Phrase.INTERACTIONS_HEADER, Phrase.LOOKUP_HEADER, Phrase.SIGN_HEADER, Phrase.UPDATE_HEADER));
private static final Set<String> COLORS = new HashSet<>(Arrays.asList(Color.WHITE, Color.DARK_AQUA));
private static final String SPLIT = ":";
private static final String FULL_WIDTH_SPLIT = ":";
public String getPhrase() {
return Language.getPhrase(this);
}
public String getUserPhrase() {
return Language.getUserPhrase(this);
}
public String getTranslatedPhrase() {
return Language.getTranslatedPhrase(this);
}
public static String build(Phrase phrase, String... params) {
String output = phrase.getTranslatedPhrase();
String color = "";
if (HEADERS.contains(phrase)) {
output = Util.capitalize(output, true);
}
int index = 0;
int indexExtra = 0;
for (String param : params) {
if (index == 0 && COLORS.contains(param)) {
color = param;
indexExtra++;
continue;
}
if (Selector.SELECTORS.contains(param)) {
output = Selector.processSelection(output, param, color);
indexExtra++;
continue;
}
if (output.contains("{" + index + "}")) {
output = output.replace("{" + index + "}", param);
index++;
}
}
if ((index + indexExtra) != params.length) { // fallback for issues with user modified phrases
output = buildInternal(phrase, params, color);
}
if (color.length() > 0) {
output = output.replaceFirst(SPLIT, SPLIT + color);
output = output.replaceFirst(FULL_WIDTH_SPLIT, FULL_WIDTH_SPLIT + color);
output = ChatMessage.parseQuotes(output, color);
}
return output;
}
private static String buildInternal(Phrase phrase, String[] params, String color) {
String output = phrase.getPhrase(); // get internal phrase
int index = 0;
for (String param : params) {
if (index == 0 && COLORS.contains(param)) {
continue;
}
if (Selector.SELECTORS.contains(param)) {
output = Selector.processSelection(output, param, color);
continue;
}
output = output.replace("{" + index + "}", param);
index++;
}
return output;
}
public static String getPhraseSelector(Phrase phrase, String selector) {
String translatedPhrase = phrase.getTranslatedPhrase();
Pattern phrasePattern = Pattern.compile("(\\{[a-zA-Z| ]+})");
Matcher patternMatch = phrasePattern.matcher(translatedPhrase);
String match = "";
if (patternMatch.find()) {
match = patternMatch.group(1);
match = Selector.processSelection(match, selector, "");
}
return match;
}
}
Loaded 100 of 200 files, more files were not shown because too many files have changed in this diff. Show more