Milestone towards tracking config files on git. Waiting on true-og/SubstAgent update
This commit is contained in:
1 parent
bb1846d086
commit
b45037511f
200 files changed
+15561
-7546
No files matched your search
+26
-6
@@ -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.
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
Reference in new issue
Block a user