Compare commits
72
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0851fd755e | ||
|
|
1a59d1eb29 | ||
|
|
764d258ed0 | ||
|
|
5579d197ab | ||
|
|
3b9ab47a97 | ||
|
|
d9716a5bd8 | ||
|
|
a0e397e57f | ||
|
|
02dc89b224 | ||
|
|
829a4a42df | ||
|
|
830472d36e | ||
|
|
03aac83f4c | ||
|
|
fb88d56646 | ||
|
|
068ad680fc | ||
|
|
cb011a88cf | ||
|
|
0f3ea5045e | ||
|
|
679b56948f | ||
|
|
9dd7d7c03e | ||
|
|
afb619d2ac | ||
|
|
b73a0a7179 | ||
|
|
2ea50689b9 | ||
|
|
70d225ef2f | ||
|
|
aa46529ecb | ||
|
|
8ffc81ad74 | ||
|
|
16ea4625c9 | ||
|
|
ca49458a44 | ||
|
|
574921089b | ||
|
|
c6fbfb87a3 | ||
|
|
fa357f4681 | ||
|
|
a801a9d67a | ||
|
|
1bfae45484 | ||
|
|
b269d7e264 | ||
|
|
af645ea2e4 | ||
|
|
a5ea5115f9 | ||
|
|
83298796ab | ||
|
|
8aa37e389d | ||
|
|
887f3bfaec | ||
|
|
6898ad8674 | ||
|
|
7783e9ae3b | ||
|
|
2bd426baf8 | ||
|
|
27f009594a | ||
|
|
ead1e1b77c | ||
|
|
8b7729e0e8 | ||
|
|
d6ef5e9398 | ||
|
|
6f5501f7be | ||
|
|
d9424b1c71 | ||
|
|
65431c7df8 | ||
|
|
2f93b26be0 | ||
|
|
6bbf49314d | ||
|
|
4ad11151fe | ||
|
|
c29edf7467 | ||
|
|
da3c81a88d | ||
|
|
c65dd83a7e | ||
|
|
694195435d | ||
|
|
0d824d375b | ||
|
|
c7319f10dc | ||
|
|
c2b95f59a8 | ||
|
|
5fa6f2a858 | ||
|
|
3201cee1b7 | ||
|
|
16a3c85005 | ||
|
|
5934e49489 | ||
|
|
58fbb6f008 | ||
|
|
fba8333de3 | ||
|
|
fffb0c1f98 | ||
|
|
223b80c590 | ||
|
|
853631139d | ||
|
|
c61e9f1fe0 | ||
|
|
64ccda4615 | ||
|
|
16887c8540 | ||
|
|
2c448f1ba2 | ||
|
|
c0cbe27efc | ||
|
|
4a26e306b6 | ||
|
|
44d0735412 |
No files matched your search
@@ -1,8 +0,0 @@
|
||||
language: java
|
||||
dist: trusty
|
||||
jdk:
|
||||
- oraclejdk11
|
||||
notifications:
|
||||
email: false
|
||||
before_install: chmod +x gradlew
|
||||
script: ./gradlew build -S
|
||||
@@ -1,5 +1,30 @@
|
||||
# Changelog
|
||||
|
||||
## 7.0.12
|
||||
|
||||
* Fix a change in the default behavior of explosion flag handling.
|
||||
|
||||
## 7.0.11
|
||||
|
||||
* Add support for MC 1.21.
|
||||
* Add wind-charge-burst flag which is checked along with `use` (for the interaction) or `pvp` (for the knockback).
|
||||
* Add breeze-charge-explosion flag for breeze charges (i.e. from the mob, not player wind charges).
|
||||
* Add moisture-change flag and config options.
|
||||
* Fix an error if a player logged in to an unloaded world.
|
||||
* Fix chest boat usage always being counted as ride.
|
||||
* Consider potions thrown by mobs as mob-damage.
|
||||
* Workaround spigot no longer sending block change events when a book is placed on a lectern.
|
||||
* Improve accuracy of target blocks in blacklist/build-perms events.
|
||||
|
||||
## 7.0.10
|
||||
|
||||
* Add support for MC 1.20.5 and 1.20.6, drop support for other 1.20 versions
|
||||
|
||||
## 7.0.9
|
||||
* Add support for MC 1.20, drop support for MC 1.19
|
||||
* Made entities spawned via the `/summon` command get treated as plugin-spawned entities
|
||||
* Add sniffer egg trample protection options
|
||||
|
||||
## 7.0.8
|
||||
* Add support for MC 1.19
|
||||
* Add skulk-growth flag and config option
|
||||
|
||||
+2
-5
@@ -1,11 +1,8 @@
|
||||
Compiling
|
||||
=========
|
||||
|
||||
You can compile WorldGuard as long as you have some version of Java greater than or equal to 17 installed. Gradle will download JDK 17 specifically if needed,
|
||||
but it needs some version of Java to bootstrap from.
|
||||
|
||||
Note that if you have JRE 17 installed, Gradle will currently attempt to use that to compile, which will not work. It is easiest to uninstall JRE 16 and
|
||||
replace it with JDK 17.
|
||||
You can compile WorldGuard as long as you have some version of Java greater than or equal to 21 installed.
|
||||
Gradle will download JDK 21 specifically if needed, but it needs some version of Java to bootstrap from.
|
||||
|
||||
The build process uses Gradle, which you do *not* need to download. WorldGuard is a multi-module project with three modules:
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ A Bukkit server implementation (such as [Paper](https://papermc.io)) and the [Wo
|
||||
Compiling
|
||||
---------
|
||||
|
||||
The project is written for Java 16 and our build process makes use of
|
||||
The project is written for Java 17 and our build process makes use of
|
||||
[Gradle](http://gradle.org).
|
||||
|
||||
Dependencies are automatically handled by Gradle.
|
||||
@@ -40,8 +40,8 @@ Submissions must be licensed under the GNU Lesser General Public License v3.
|
||||
Links
|
||||
-----
|
||||
|
||||
* [Homepage](http://enginehub.org/worldguard)
|
||||
* [Homepage](https://enginehub.org/worldguard)
|
||||
* [Discord](https://discord.gg/enginehub)
|
||||
* [Issue tracker](https://github.com/EngineHub/WorldGuard/issues)
|
||||
* [Continuous integration](http://builds.enginehub.org) [](http://ci.enginehub.org/viewType.html?buildTypeId=bt11&guest=1)
|
||||
* [Continuous integration](https://builds.enginehub.org) [](http://ci.enginehub.org/viewType.html?buildTypeId=bt11&guest=1)
|
||||
* [End-user documentation](https://worldguard.enginehub.org/en/latest/)
|
||||
@@ -0,0 +1,29 @@
|
||||
plugins {
|
||||
`kotlin-dsl`
|
||||
}
|
||||
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(gradleApi())
|
||||
implementation(libs.licenser)
|
||||
implementation(libs.grgit)
|
||||
implementation(libs.shadow)
|
||||
implementation(libs.jfrog.buildinfo)
|
||||
implementation(libs.gson)
|
||||
|
||||
constraints {
|
||||
val asmVersion = "[${libs.versions.minimumAsm.get()},)"
|
||||
implementation("org.ow2.asm:asm:$asmVersion") {
|
||||
because("Need Java 21 support in shadow")
|
||||
}
|
||||
implementation("org.ow2.asm:asm-commons:$asmVersion") {
|
||||
because("Need Java 21 support in shadow")
|
||||
}
|
||||
implementation("org.vafer:jdependency:[${libs.versions.minimumJdependency.get()},)") {
|
||||
because("Need Java 21 support in shadow")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
dependencyResolutionManagement {
|
||||
versionCatalogs {
|
||||
create("libs") {
|
||||
from(files("../gradle/libs.versions.toml"))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.name = "build-logic"
|
||||
@@ -0,0 +1,32 @@
|
||||
import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention
|
||||
import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask
|
||||
|
||||
plugins {
|
||||
id("com.jfrog.artifactory")
|
||||
}
|
||||
|
||||
val ARTIFACTORY_CONTEXT_URL = "artifactory_contextUrl"
|
||||
val ARTIFACTORY_USER = "artifactory_user"
|
||||
val ARTIFACTORY_PASSWORD = "artifactory_password"
|
||||
|
||||
if (!project.hasProperty(ARTIFACTORY_CONTEXT_URL)) ext[ARTIFACTORY_CONTEXT_URL] = "http://localhost"
|
||||
if (!project.hasProperty(ARTIFACTORY_USER)) ext[ARTIFACTORY_USER] = "guest"
|
||||
if (!project.hasProperty(ARTIFACTORY_PASSWORD)) ext[ARTIFACTORY_PASSWORD] = ""
|
||||
|
||||
configure<ArtifactoryPluginConvention> {
|
||||
setContextUrl("${project.property(ARTIFACTORY_CONTEXT_URL)}")
|
||||
clientConfig.publisher.run {
|
||||
repoKey = when {
|
||||
"${project.version}".contains("SNAPSHOT") -> "libs-snapshot-local"
|
||||
else -> "libs-release-local"
|
||||
}
|
||||
username = "${project.property(ARTIFACTORY_USER)}"
|
||||
password = "${project.property(ARTIFACTORY_PASSWORD)}"
|
||||
isMaven = true
|
||||
isIvy = false
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named<ArtifactoryTask>("artifactoryPublish") {
|
||||
isSkip = true
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
plugins {
|
||||
id("com.jfrog.artifactory")
|
||||
}
|
||||
|
||||
// Artifactory eagerly evaluates publications, so this must run after all changes to artifacts are done
|
||||
afterEvaluate {
|
||||
tasks.named<org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask>("artifactoryPublish") {
|
||||
publications("maven")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
import buildlogic.getLibrary
|
||||
import buildlogic.stringyLibs
|
||||
|
||||
plugins {
|
||||
id("eclipse")
|
||||
id("idea")
|
||||
id("checkstyle")
|
||||
id("buildlogic.common")
|
||||
}
|
||||
|
||||
tasks
|
||||
.withType<JavaCompile>()
|
||||
.matching { it.name == "compileJava" || it.name == "compileTestJava" }
|
||||
.configureEach {
|
||||
val disabledLint = listOf(
|
||||
"processing", "path", "fallthrough", "serial", "overloads",
|
||||
)
|
||||
options.release.set(21)
|
||||
options.compilerArgs.addAll(listOf("-Xlint:all") + disabledLint.map { "-Xlint:-$it" })
|
||||
options.isDeprecation = true
|
||||
options.encoding = "UTF-8"
|
||||
options.compilerArgs.add("-parameters")
|
||||
//options.compilerArgs.add("-Werror")
|
||||
}
|
||||
|
||||
configure<CheckstyleExtension> {
|
||||
configFile = rootProject.file("config/checkstyle/checkstyle.xml")
|
||||
toolVersion = "10.16.0"
|
||||
}
|
||||
|
||||
tasks.withType<Test>().configureEach {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
"compileOnly"(stringyLibs.getLibrary("jsr305"))
|
||||
"testImplementation"(platform(stringyLibs.getLibrary("junit-bom")))
|
||||
"testImplementation"(stringyLibs.getLibrary("junit-jupiter-api"))
|
||||
"testImplementation"(stringyLibs.getLibrary("junit-jupiter-params"))
|
||||
"testRuntimeOnly"(stringyLibs.getLibrary("junit-jupiter-engine"))
|
||||
}
|
||||
|
||||
// Java 8 turns on doclint which we fail
|
||||
tasks.withType<Javadoc>().configureEach {
|
||||
options.encoding = "UTF-8"
|
||||
(options as StandardJavadocDocletOptions).apply {
|
||||
//addBooleanOption("Werror", true)
|
||||
addBooleanOption("Xdoclint:all", true)
|
||||
addBooleanOption("Xdoclint:-missing", true)
|
||||
tags(
|
||||
"apiNote:a:API Note:",
|
||||
"implSpec:a:Implementation Requirements:",
|
||||
"implNote:a:Implementation Note:"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
configure<JavaPluginExtension> {
|
||||
withJavadocJar()
|
||||
withSourcesJar()
|
||||
}
|
||||
|
||||
tasks.named("check").configure {
|
||||
dependsOn("checkstyleMain", "checkstyleTest")
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import buildlogic.getLibrary
|
||||
import buildlogic.stringyLibs
|
||||
import org.gradle.plugins.ide.idea.model.IdeaModel
|
||||
|
||||
plugins {
|
||||
id("org.cadixdev.licenser")
|
||||
}
|
||||
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = "EngineHub"
|
||||
url = uri("https://maven.enginehub.org/repo/")
|
||||
}
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
resolutionStrategy {
|
||||
cacheChangingModulesFor(1, TimeUnit.DAYS)
|
||||
}
|
||||
}
|
||||
|
||||
plugins.withId("java") {
|
||||
the<JavaPluginExtension>().toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(21))
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
for (conf in listOf("implementation", "api")) {
|
||||
if (!configurations.names.contains(conf)) {
|
||||
continue
|
||||
}
|
||||
add(conf, platform(stringyLibs.getLibrary("log4j-bom")).map {
|
||||
val dep = create(it)
|
||||
dep.because("Mojang provides Log4j")
|
||||
dep
|
||||
})
|
||||
constraints {
|
||||
add(conf, stringyLibs.getLibrary("guava")) {
|
||||
because("Mojang provides Guava")
|
||||
}
|
||||
add(conf, stringyLibs.getLibrary("gson")) {
|
||||
because("Mojang provides Gson")
|
||||
}
|
||||
add(conf, stringyLibs.getLibrary("fastutil")) {
|
||||
because("Mojang provides FastUtil")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
license {
|
||||
header(rootProject.file("HEADER.txt"))
|
||||
include("**/*.java")
|
||||
include("**/*.kt")
|
||||
}
|
||||
|
||||
plugins.withId("idea") {
|
||||
configure<IdeaModel> {
|
||||
module {
|
||||
isDownloadSources = true
|
||||
isDownloadJavadoc = true
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
plugins {
|
||||
id("java")
|
||||
id("maven-publish")
|
||||
id("buildlogic.common-java")
|
||||
id("buildlogic.artifactory-sub")
|
||||
}
|
||||
|
||||
ext["internalVersion"] = "$version+${rootProject.ext["gitCommitHash"]}"
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
register<MavenPublication>("maven") {
|
||||
versionMapping {
|
||||
usage("java-api") {
|
||||
fromResolutionOf("runtimeClasspath")
|
||||
}
|
||||
usage("java-runtime") {
|
||||
fromResolutionResult()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,179 @@
|
||||
plugins {
|
||||
id("java-base")
|
||||
id("maven-publish")
|
||||
id("com.github.johnrengelman.shadow")
|
||||
id("com.jfrog.artifactory")
|
||||
id("buildlogic.common")
|
||||
id("buildlogic.artifactory-sub")
|
||||
}
|
||||
|
||||
// A horrible hack because `softwareComponentFactory` has to be gotten via plugin
|
||||
// gradle why
|
||||
internal open class LibsConfigPluginHack @Inject constructor(
|
||||
private val softwareComponentFactory: SoftwareComponentFactory
|
||||
) : Plugin<Project> {
|
||||
override fun apply(project: Project) {
|
||||
val libsComponents = softwareComponentFactory.adhoc("libs")
|
||||
project.components.add(libsComponents)
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
create("shade")
|
||||
}
|
||||
|
||||
group = "${rootProject.group}.worldguard-libs"
|
||||
|
||||
val relocations = mapOf(
|
||||
"org.enginehub.squirrelid" to "com.sk89q.worldguard.util.profile",
|
||||
)
|
||||
|
||||
tasks.register<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("jar") {
|
||||
configurations = listOf(project.configurations["shade"])
|
||||
archiveClassifier.set("")
|
||||
|
||||
// Yeet module-info's
|
||||
exclude("module-info.class")
|
||||
|
||||
dependencies {
|
||||
exclude(dependency("com.google.guava:guava"))
|
||||
exclude(dependency("com.google.code.gson:gson"))
|
||||
exclude(dependency("com.google.errorprone:error_prone_annotations"))
|
||||
exclude(dependency("com.google.guava:failureaccess"))
|
||||
exclude(dependency("org.checkerframework:checker-qual"))
|
||||
exclude(dependency("org.jetbrains:annotations"))
|
||||
exclude(dependency("org.apache.logging.log4j:log4j-api"))
|
||||
exclude(dependency("com.google.code.findbugs:jsr305"))
|
||||
exclude {
|
||||
it.moduleGroup == "org.jetbrains.kotlin"
|
||||
}
|
||||
}
|
||||
|
||||
relocations.forEach { (from, to) ->
|
||||
relocate(from, to)
|
||||
}
|
||||
}
|
||||
val altConfigFiles = { artifactType: String ->
|
||||
val deps = configurations["shade"].incoming.dependencies
|
||||
.filterIsInstance<ModuleDependency>()
|
||||
.map { it.copy() }
|
||||
.map { dependency ->
|
||||
val category = dependency.attributes.getAttribute(Category.CATEGORY_ATTRIBUTE)?.name
|
||||
if (category == Category.REGULAR_PLATFORM || category == Category.ENFORCED_PLATFORM) {
|
||||
return@map dependency
|
||||
}
|
||||
try {
|
||||
dependency.artifact {
|
||||
name = dependency.name
|
||||
type = artifactType
|
||||
extension = "jar"
|
||||
classifier = artifactType
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
throw RuntimeException("Failed to add artifact to dependency: $dependency", e)
|
||||
}
|
||||
dependency
|
||||
}
|
||||
|
||||
files(configurations.detachedConfiguration(*deps.toTypedArray())
|
||||
.resolvedConfiguration.lenientConfiguration.artifacts
|
||||
.filter { it.classifier == artifactType }
|
||||
.map { zipTree(it.file) })
|
||||
}
|
||||
tasks.register<Jar>("sourcesJar") {
|
||||
from({
|
||||
altConfigFiles("sources")
|
||||
})
|
||||
|
||||
// Yeet module-info's
|
||||
exclude("module-info.java")
|
||||
|
||||
relocations.forEach { (from, to) ->
|
||||
val filePattern = Regex("(.*)${from.replace('.', '/')}((?:/|$).*)")
|
||||
val textPattern = Regex.fromLiteral(from)
|
||||
eachFile {
|
||||
filter {
|
||||
it.replaceFirst(textPattern, to)
|
||||
}
|
||||
path = path.replaceFirst(filePattern, "$1${to.replace('.', '/')}$2")
|
||||
}
|
||||
}
|
||||
archiveClassifier.set("sources")
|
||||
}
|
||||
|
||||
tasks.named("assemble").configure {
|
||||
dependsOn("jar", "sourcesJar")
|
||||
}
|
||||
|
||||
project.apply<LibsConfigPluginHack>()
|
||||
|
||||
val libsComponent = project.components["libs"] as AdhocComponentWithVariants
|
||||
|
||||
val apiElements = project.configurations.register("apiElements") {
|
||||
isVisible = false
|
||||
description = "API elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_API))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
|
||||
}
|
||||
outgoing.artifact(tasks.named("jar"))
|
||||
}
|
||||
|
||||
val runtimeElements = project.configurations.register("runtimeElements") {
|
||||
isVisible = false
|
||||
description = "Runtime elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 21)
|
||||
}
|
||||
outgoing.artifact(tasks.named("jar"))
|
||||
}
|
||||
|
||||
val sourcesElements = project.configurations.register("sourcesElements") {
|
||||
isVisible = false
|
||||
description = "Source elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.DOCUMENTATION))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType.SOURCES))
|
||||
}
|
||||
outgoing.artifact(tasks.named("sourcesJar"))
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(apiElements.get()) {
|
||||
mapToMavenScope("compile")
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(runtimeElements.get()) {
|
||||
mapToMavenScope("runtime")
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(sourcesElements.get()) {
|
||||
mapToMavenScope("runtime")
|
||||
}
|
||||
|
||||
configure<PublishingExtension> {
|
||||
publications {
|
||||
register<MavenPublication>("maven") {
|
||||
from(libsComponent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (project != project(":worldguard-libs:core")) {
|
||||
evaluationDependsOn(":worldguard-libs:core")
|
||||
configurations["shade"].shouldResolveConsistentlyWith(project(":worldguard-libs:core").configurations["shade"])
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
plugins {
|
||||
id("com.github.johnrengelman.shadow")
|
||||
id("buildlogic.core-and-platform")
|
||||
}
|
||||
|
||||
tasks.named<com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar>("shadowJar") {
|
||||
archiveClassifier.set("dist")
|
||||
dependencies {
|
||||
include(project(":worldguard-libs:core"))
|
||||
include(project(":worldguard-core"))
|
||||
|
||||
relocate("org.flywaydb", "com.sk89q.worldguard.internal.flywaydb") {
|
||||
include(dependency("org.flywaydb:flyway-core"))
|
||||
}
|
||||
exclude("com.google.code.findbugs:jsr305")
|
||||
}
|
||||
exclude("GradleStart**")
|
||||
exclude(".cache")
|
||||
exclude("LICENSE*")
|
||||
exclude("META-INF/maven/**")
|
||||
minimize()
|
||||
}
|
||||
val javaComponent = components["java"] as AdhocComponentWithVariants
|
||||
// I don't think we want this published (it's the shadow jar)
|
||||
javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) {
|
||||
skip()
|
||||
}
|
||||
|
||||
afterEvaluate {
|
||||
tasks.named<Jar>("jar") {
|
||||
val version = project(":worldguard-core").version
|
||||
inputs.property("version", version)
|
||||
val attributes = mutableMapOf(
|
||||
"Implementation-Version" to version,
|
||||
"WorldGuard-Version" to version,
|
||||
)
|
||||
manifest.attributes(attributes)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package buildlogic
|
||||
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.MinimalExternalModuleDependency
|
||||
import org.gradle.api.artifacts.VersionCatalog
|
||||
import org.gradle.api.artifacts.VersionCatalogsExtension
|
||||
import org.gradle.api.artifacts.VersionConstraint
|
||||
import org.gradle.api.plugins.ExtraPropertiesExtension
|
||||
import org.gradle.api.provider.Provider
|
||||
import org.gradle.kotlin.dsl.getByType
|
||||
|
||||
val Project.ext: ExtraPropertiesExtension
|
||||
get() = extensions.getByType()
|
||||
|
||||
val Project.stringyLibs: VersionCatalog
|
||||
get() = extensions.getByType<VersionCatalogsExtension>().named("libs")
|
||||
|
||||
fun VersionCatalog.getLibrary(name: String): Provider<MinimalExternalModuleDependency> = findLibrary(name).orElseThrow {
|
||||
error("Library $name not found in version catalog")
|
||||
}
|
||||
|
||||
fun VersionCatalog.getVersion(name: String): VersionConstraint = findVersion(name).orElseThrow {
|
||||
error("Version $name not found in version catalog")
|
||||
}
|
||||
+6
-15
@@ -1,26 +1,17 @@
|
||||
import org.ajoberstar.grgit.Grgit
|
||||
|
||||
logger.lifecycle("""
|
||||
*******************************************
|
||||
You are building WorldGuard!
|
||||
If you encounter trouble:
|
||||
1) Try running 'build' in a separate Gradle run
|
||||
2) Use gradlew and not gradle
|
||||
3) If you still need help, ask on Discord! https://discord.gg/enginehub
|
||||
|
||||
Output files will be in [subproject]/build/libs
|
||||
*******************************************
|
||||
""")
|
||||
|
||||
applyRootArtifactoryConfig()
|
||||
plugins {
|
||||
id("buildlogic.common")
|
||||
id("buildlogic.artifactory-root")
|
||||
}
|
||||
|
||||
if (!project.hasProperty("gitCommitHash")) {
|
||||
apply(plugin = "org.ajoberstar.grgit")
|
||||
ext["gitCommitHash"] = try {
|
||||
Grgit.open(mapOf("currentDir" to project.rootDir))?.head()?.abbreviatedId
|
||||
extensions.getByName<Grgit>("grgit").head()?.abbreviatedId
|
||||
} catch (e: Exception) {
|
||||
logger.warn("Error getting commit hash", e)
|
||||
|
||||
"no.git.id"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
plugins {
|
||||
`kotlin-dsl`
|
||||
kotlin("jvm") version embeddedKotlinVersion
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
gradlePluginPortal()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(gradleApi())
|
||||
implementation("gradle.plugin.org.cadixdev.gradle:licenser:0.6.1")
|
||||
implementation("org.ajoberstar.grgit:grgit-gradle:4.1.1")
|
||||
implementation("gradle.plugin.com.github.johnrengelman:shadow:7.1.2")
|
||||
implementation("org.jfrog.buildinfo:build-info-extractor-gradle:4.27.1")
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.kotlin.dsl.apply
|
||||
import org.gradle.kotlin.dsl.configure
|
||||
import org.gradle.kotlin.dsl.named
|
||||
import org.jfrog.gradle.plugin.artifactory.dsl.ArtifactoryPluginConvention
|
||||
import org.jfrog.gradle.plugin.artifactory.task.ArtifactoryTask
|
||||
|
||||
private const val ARTIFACTORY_CONTEXT_URL = "artifactory_contextUrl"
|
||||
private const val ARTIFACTORY_USER = "artifactory_user"
|
||||
private const val ARTIFACTORY_PASSWORD = "artifactory_password"
|
||||
|
||||
fun Project.applyRootArtifactoryConfig() {
|
||||
if (!project.hasProperty(ARTIFACTORY_CONTEXT_URL)) ext[ARTIFACTORY_CONTEXT_URL] = "http://localhost"
|
||||
if (!project.hasProperty(ARTIFACTORY_USER)) ext[ARTIFACTORY_USER] = "guest"
|
||||
if (!project.hasProperty(ARTIFACTORY_PASSWORD)) ext[ARTIFACTORY_PASSWORD] = ""
|
||||
|
||||
apply(plugin = "com.jfrog.artifactory")
|
||||
configure<ArtifactoryPluginConvention> {
|
||||
setContextUrl("${project.property(ARTIFACTORY_CONTEXT_URL)}")
|
||||
clientConfig.publisher.run {
|
||||
repoKey = when {
|
||||
"${project.version}".contains("SNAPSHOT") -> "libs-snapshot-local"
|
||||
else -> "libs-release-local"
|
||||
}
|
||||
username = "${project.property(ARTIFACTORY_USER)}"
|
||||
password = "${project.property(ARTIFACTORY_PASSWORD)}"
|
||||
isMaven = true
|
||||
isIvy = false
|
||||
}
|
||||
}
|
||||
tasks.named<ArtifactoryTask>("artifactoryPublish") {
|
||||
isSkip = true
|
||||
}
|
||||
}
|
||||
|
||||
fun Project.applyCommonArtifactoryConfig() {
|
||||
tasks.named<ArtifactoryTask>("artifactoryPublish") {
|
||||
publications("maven")
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
import org.cadixdev.gradle.licenser.LicenseExtension
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.plugins.JavaPluginExtension
|
||||
import org.gradle.jvm.toolchain.JavaLanguageVersion
|
||||
import org.gradle.kotlin.dsl.apply
|
||||
import org.gradle.kotlin.dsl.configure
|
||||
import org.gradle.kotlin.dsl.repositories
|
||||
import org.gradle.kotlin.dsl.the
|
||||
|
||||
fun Project.applyCommonConfiguration() {
|
||||
group = rootProject.group
|
||||
version = rootProject.version
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = uri("https://maven.enginehub.org/repo/") }
|
||||
maven { url = uri("https://oss.sonatype.org/content/repositories/snapshots/") }
|
||||
}
|
||||
|
||||
configurations.all {
|
||||
resolutionStrategy {
|
||||
cacheChangingModulesFor(5, "MINUTES")
|
||||
}
|
||||
}
|
||||
|
||||
plugins.withId("java") {
|
||||
the<JavaPluginExtension>().toolchain {
|
||||
languageVersion.set(JavaLanguageVersion.of(17))
|
||||
}
|
||||
}
|
||||
|
||||
apply(plugin = "org.cadixdev.licenser")
|
||||
configure<LicenseExtension> {
|
||||
header(rootProject.file("HEADER.txt"))
|
||||
include("**/*.java")
|
||||
include("**/*.kt")
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.plugins.ExtraPropertiesExtension
|
||||
import org.gradle.api.plugins.JavaPluginConvention
|
||||
import org.gradle.api.tasks.SourceSetContainer
|
||||
import org.gradle.kotlin.dsl.getByType
|
||||
import org.gradle.kotlin.dsl.the
|
||||
|
||||
val Project.ext: ExtraPropertiesExtension
|
||||
get() = extensions.getByType()
|
||||
|
||||
val Project.sourceSets: SourceSetContainer
|
||||
get() = the<JavaPluginConvention>().sourceSets
|
||||
@@ -1,171 +0,0 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.artifacts.ModuleDependency
|
||||
import org.gradle.api.attributes.Bundling
|
||||
import org.gradle.api.attributes.Category
|
||||
import org.gradle.api.attributes.DocsType
|
||||
import org.gradle.api.attributes.LibraryElements
|
||||
import org.gradle.api.attributes.Usage
|
||||
import org.gradle.api.attributes.java.TargetJvmVersion
|
||||
import org.gradle.api.component.AdhocComponentWithVariants
|
||||
import org.gradle.api.component.SoftwareComponentFactory
|
||||
import org.gradle.api.publish.PublishingExtension
|
||||
import org.gradle.api.publish.maven.MavenPublication
|
||||
import org.gradle.api.tasks.bundling.Jar
|
||||
import org.gradle.kotlin.dsl.apply
|
||||
import org.gradle.kotlin.dsl.configure
|
||||
import org.gradle.kotlin.dsl.get
|
||||
import org.gradle.kotlin.dsl.invoke
|
||||
import org.gradle.kotlin.dsl.named
|
||||
import org.gradle.kotlin.dsl.register
|
||||
import javax.inject.Inject
|
||||
|
||||
fun Project.applyLibrariesConfiguration() {
|
||||
applyCommonConfiguration()
|
||||
apply(plugin = "java-base")
|
||||
apply(plugin = "maven-publish")
|
||||
apply(plugin = "com.github.johnrengelman.shadow")
|
||||
apply(plugin = "com.jfrog.artifactory")
|
||||
|
||||
configurations {
|
||||
create("shade")
|
||||
}
|
||||
|
||||
group = "${rootProject.group}.worldguard-libs"
|
||||
|
||||
val relocations = mapOf(
|
||||
"org.enginehub.squirrelid" to "com.sk89q.worldguard.util.profile"
|
||||
)
|
||||
|
||||
tasks.register<ShadowJar>("jar") {
|
||||
configurations = listOf(project.configurations["shade"])
|
||||
archiveClassifier.set("")
|
||||
|
||||
dependencies {
|
||||
exclude(dependency("com.google.code.findbugs:jsr305"))
|
||||
}
|
||||
|
||||
relocations.forEach { (from, to) ->
|
||||
relocate(from, to)
|
||||
}
|
||||
}
|
||||
val altConfigFiles = { artifactType: String ->
|
||||
val deps = configurations["shade"].incoming.dependencies
|
||||
.filterIsInstance<ModuleDependency>()
|
||||
.map { it.copy() }
|
||||
.map { dependency ->
|
||||
dependency.artifact {
|
||||
name = dependency.name
|
||||
type = artifactType
|
||||
extension = "jar"
|
||||
classifier = artifactType
|
||||
}
|
||||
dependency
|
||||
}
|
||||
|
||||
files(configurations.detachedConfiguration(*deps.toTypedArray())
|
||||
.resolvedConfiguration.lenientConfiguration.artifacts
|
||||
.filter { it.classifier == artifactType }
|
||||
.map { zipTree(it.file) })
|
||||
}
|
||||
tasks.register<Jar>("sourcesJar") {
|
||||
from({
|
||||
altConfigFiles("sources")
|
||||
})
|
||||
relocations.forEach { (from, to) ->
|
||||
val filePattern = Regex("(.*)${from.replace('.', '/')}((?:/|$).*)")
|
||||
val textPattern = Regex.fromLiteral(from)
|
||||
eachFile {
|
||||
filter {
|
||||
it.replaceFirst(textPattern, to)
|
||||
}
|
||||
path = path.replaceFirst(filePattern, "$1${to.replace('.', '/')}$2")
|
||||
}
|
||||
}
|
||||
archiveClassifier.set("sources")
|
||||
}
|
||||
|
||||
tasks.named("assemble").configure {
|
||||
dependsOn("jar", "sourcesJar")
|
||||
}
|
||||
|
||||
project.apply<LibsConfigPluginHack>()
|
||||
|
||||
val libsComponent = project.components["libs"] as AdhocComponentWithVariants
|
||||
|
||||
val apiElements = project.configurations.register("apiElements") {
|
||||
isVisible = false
|
||||
description = "API elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_API))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8)
|
||||
}
|
||||
outgoing.artifact(tasks.named("jar"))
|
||||
}
|
||||
|
||||
val runtimeElements = project.configurations.register("runtimeElements") {
|
||||
isVisible = false
|
||||
description = "Runtime elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.LIBRARY))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, project.objects.named(LibraryElements.JAR))
|
||||
attribute(TargetJvmVersion.TARGET_JVM_VERSION_ATTRIBUTE, 8)
|
||||
}
|
||||
outgoing.artifact(tasks.named("jar"))
|
||||
}
|
||||
|
||||
val sourcesElements = project.configurations.register("sourcesElements") {
|
||||
isVisible = false
|
||||
description = "Source elements for libs"
|
||||
isCanBeResolved = false
|
||||
isCanBeConsumed = true
|
||||
attributes {
|
||||
attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
|
||||
attribute(Category.CATEGORY_ATTRIBUTE, project.objects.named(Category.DOCUMENTATION))
|
||||
attribute(Bundling.BUNDLING_ATTRIBUTE, project.objects.named(Bundling.SHADOWED))
|
||||
attribute(DocsType.DOCS_TYPE_ATTRIBUTE, project.objects.named(DocsType.SOURCES))
|
||||
}
|
||||
outgoing.artifact(tasks.named("sourcesJar"))
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(apiElements.get()) {
|
||||
mapToMavenScope("compile")
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(runtimeElements.get()) {
|
||||
mapToMavenScope("runtime")
|
||||
}
|
||||
|
||||
libsComponent.addVariantsFromConfiguration(sourcesElements.get()) {
|
||||
mapToMavenScope("runtime")
|
||||
}
|
||||
|
||||
configure<PublishingExtension> {
|
||||
publications {
|
||||
register<MavenPublication>("maven") {
|
||||
from(libsComponent)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
applyCommonArtifactoryConfig()
|
||||
}
|
||||
|
||||
internal open class LibsConfigPluginHack @Inject constructor(
|
||||
private val softwareComponentFactory: SoftwareComponentFactory
|
||||
) : Plugin<Project> {
|
||||
override fun apply(project: Project) {
|
||||
val libsComponents = softwareComponentFactory.adhoc("libs")
|
||||
project.components.add(libsComponents)
|
||||
}
|
||||
}
|
||||
@@ -1,113 +0,0 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.component.AdhocComponentWithVariants
|
||||
import org.gradle.api.plugins.JavaPluginExtension
|
||||
import org.gradle.api.plugins.quality.CheckstyleExtension
|
||||
import org.gradle.api.publish.PublishingExtension
|
||||
import org.gradle.api.publish.maven.MavenPublication
|
||||
import org.gradle.api.tasks.javadoc.Javadoc
|
||||
import org.gradle.api.tasks.testing.Test
|
||||
import org.gradle.external.javadoc.StandardJavadocDocletOptions
|
||||
import org.gradle.kotlin.dsl.apply
|
||||
import org.gradle.kotlin.dsl.configure
|
||||
import org.gradle.kotlin.dsl.dependencies
|
||||
import org.gradle.kotlin.dsl.get
|
||||
import org.gradle.kotlin.dsl.named
|
||||
import org.gradle.kotlin.dsl.register
|
||||
import org.gradle.kotlin.dsl.withType
|
||||
import org.gradle.kotlin.dsl.the
|
||||
|
||||
fun Project.applyPlatformAndCoreConfiguration() {
|
||||
applyCommonConfiguration()
|
||||
apply(plugin = "java")
|
||||
apply(plugin = "eclipse")
|
||||
apply(plugin = "idea")
|
||||
apply(plugin = "maven-publish")
|
||||
apply(plugin = "checkstyle")
|
||||
apply(plugin = "com.jfrog.artifactory")
|
||||
|
||||
ext["internalVersion"] = "$version+${rootProject.ext["gitCommitHash"]}"
|
||||
|
||||
configure<CheckstyleExtension> {
|
||||
configFile = rootProject.file("config/checkstyle/checkstyle.xml")
|
||||
toolVersion = "10.3"
|
||||
}
|
||||
|
||||
tasks.withType<Test>().configureEach {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
"compileOnly"("com.google.code.findbugs:jsr305:3.0.2")
|
||||
"testCompileOnly"("com.google.code.findbugs:jsr305:3.0.2")
|
||||
"testImplementation"("org.junit.jupiter:junit-jupiter-api:${Versions.JUNIT}")
|
||||
"testImplementation"("org.junit.jupiter:junit-jupiter-params:${Versions.JUNIT}")
|
||||
"testImplementation"("org.mockito:mockito-core:${Versions.MOCKITO}")
|
||||
"testImplementation"("org.mockito:mockito-junit-jupiter:${Versions.MOCKITO}")
|
||||
"testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:${Versions.JUNIT}")
|
||||
}
|
||||
|
||||
// Java 8 turns on doclint which we fail
|
||||
tasks.withType<Javadoc>().configureEach {
|
||||
(options as StandardJavadocDocletOptions).apply {
|
||||
addStringOption("Xdoclint:none", "-quiet")
|
||||
tags(
|
||||
"apiNote:a:API Note:",
|
||||
"implSpec:a:Implementation Requirements:",
|
||||
"implNote:a:Implementation Note:"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
the<JavaPluginExtension>().withJavadocJar()
|
||||
|
||||
if (name == "worldguard-core" || name == "worldguard-bukkit") {
|
||||
the<JavaPluginExtension>().withSourcesJar()
|
||||
}
|
||||
|
||||
tasks.named("check").configure {
|
||||
dependsOn("checkstyleMain", "checkstyleTest")
|
||||
}
|
||||
|
||||
configure<PublishingExtension> {
|
||||
publications {
|
||||
register<MavenPublication>("maven") {
|
||||
from(components["java"])
|
||||
versionMapping {
|
||||
usage("java-api") {
|
||||
fromResolutionOf("runtimeClasspath")
|
||||
}
|
||||
usage("java-runtime") {
|
||||
fromResolutionResult()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
applyCommonArtifactoryConfig()
|
||||
}
|
||||
|
||||
fun Project.applyShadowConfiguration() {
|
||||
apply(plugin = "com.github.johnrengelman.shadow")
|
||||
tasks.named<ShadowJar>("shadowJar") {
|
||||
archiveClassifier.set("dist")
|
||||
dependencies {
|
||||
include(project(":worldguard-libs:core"))
|
||||
//include(project(":worldguard-libs:${project.name.replace("worldguard-", "")}"))
|
||||
include(project(":worldguard-core"))
|
||||
|
||||
relocate("org.flywaydb", "com.sk89q.worldguard.internal.flywaydb") {
|
||||
include(dependency("org.flywaydb:flyway-core:3.0"))
|
||||
}
|
||||
exclude("com.google.code.findbugs:jsr305")
|
||||
}
|
||||
exclude("GradleStart**")
|
||||
exclude(".cache")
|
||||
exclude("LICENSE*")
|
||||
}
|
||||
val javaComponent = components["java"] as AdhocComponentWithVariants
|
||||
javaComponent.withVariantsFromConfiguration(configurations["shadowRuntimeElements"]) {
|
||||
skip()
|
||||
}
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
object Versions {
|
||||
// const val PISTON = "0.4.3"
|
||||
// const val AUTO_VALUE = "1.6.5"
|
||||
const val WORLDEDIT = "7.2.12"
|
||||
const val JUNIT = "5.9.1"
|
||||
const val MOCKITO = "4.9.0"
|
||||
const val SQUIRRELID = "0.3.2"
|
||||
const val GUAVA = "31.1-jre"
|
||||
const val FINDBUGS = "3.0.2"
|
||||
}
|
||||
@@ -7,7 +7,6 @@
|
||||
<allow pkg="javax"/>
|
||||
<allow pkg="org.junit"/>
|
||||
<allow pkg="org.hamcrest"/>
|
||||
<allow pkg="org.mockito"/>
|
||||
<allow pkg="junit.framework"/>
|
||||
<allow pkg="com.sk89q"/>
|
||||
<allow pkg="com.google.common"/>
|
||||
|
||||
+3
-1
@@ -1,2 +1,4 @@
|
||||
group=com.sk89q.worldguard
|
||||
version=7.0.8
|
||||
version=7.0.13-SNAPSHOT
|
||||
|
||||
org.gradle.parallel=true
|
||||
@@ -0,0 +1,2 @@
|
||||
#This file is generated by updateDaemonJvm
|
||||
toolchainVersion=21
|
||||
@@ -0,0 +1,66 @@
|
||||
[versions]
|
||||
worldedit = "7.3.0"
|
||||
|
||||
# Minimum versions we apply to make dependencies support newer Java
|
||||
minimumAsm = "9.7"
|
||||
minimumJdependency = "2.10"
|
||||
minimumTinyRemapper = "0.8.11"
|
||||
|
||||
# lang-version = ""
|
||||
|
||||
[libraries]
|
||||
|
||||
licenser = "gradle.plugin.org.cadixdev.gradle:licenser:0.6.1"
|
||||
grgit = "org.ajoberstar.grgit:grgit-gradle:5.2.2"
|
||||
shadow = "com.github.johnrengelman:shadow:8.1.1"
|
||||
jfrog-buildinfo = "org.jfrog.buildinfo:build-info-extractor-gradle:5.2.0"
|
||||
|
||||
squirrelid = "org.enginehub:squirrelid:0.3.2"
|
||||
|
||||
autoService = "com.google.auto.service:auto-service:1.1.1"
|
||||
|
||||
jsr305 = "com.google.code.findbugs:jsr305:3.0.2"
|
||||
jetbrains-annotations = "org.jetbrains:annotations:24.1.0"
|
||||
|
||||
junit-bom = "org.junit:junit-bom:5.10.2"
|
||||
junit-jupiter-api.module = "org.junit.jupiter:junit-jupiter-api"
|
||||
junit-jupiter-params.module = "org.junit.jupiter:junit-jupiter-params"
|
||||
junit-jupiter-engine.module = "org.junit.jupiter:junit-jupiter-engine"
|
||||
|
||||
spigot = "org.spigotmc:spigot-api:1.21.3-R0.1-SNAPSHOT"
|
||||
paperApi = "io.papermc.paper:paper-api:1.21.3-R0.1-SNAPSHOT"
|
||||
paperLib = "io.papermc:paperlib:1.0.8"
|
||||
|
||||
dummypermscompat = "com.sk89q:dummypermscompat:1.10"
|
||||
bstats-bukkit = "org.bstats:bstats-bukkit:2.2.1"
|
||||
|
||||
prtree = "org.khelekore:prtree:1.5.0"
|
||||
|
||||
flyway-core = "org.flywaydb:flyway-core:3.0"
|
||||
|
||||
commandbook = "com.sk89q:commandbook:2.3"
|
||||
|
||||
hamcrest-library = "org.hamcrest:hamcrest-library:2.2"
|
||||
|
||||
# Mojang-provided libraries, CHECK AGAINST MINECRAFT for versions
|
||||
guava = "com.google.guava:guava:32.1.3-jre!!"
|
||||
log4j-bom = "org.apache.logging.log4j:log4j-bom:2.22.1!!"
|
||||
gson = "com.google.code.gson:gson:2.10.1!!"
|
||||
fastutil = "it.unimi.dsi:fastutil:8.5.12!!"
|
||||
|
||||
# Bukkit-provided libraries, CHECK AGAINST SPIGOT for versions
|
||||
# Note that we need to balance support for older MC versus working at all on newer ones, so the exact versions here
|
||||
# may not be the same as the ones in the latest Bukkit API.
|
||||
snakeyaml = "org.yaml:snakeyaml:2.0"
|
||||
|
||||
[libraries.worldedit-core]
|
||||
module = "com.sk89q.worldedit:worldedit-core"
|
||||
version.ref = "worldedit"
|
||||
|
||||
[libraries.worldedit-bukkit]
|
||||
module = "com.sk89q.worldedit:worldedit-bukkit"
|
||||
version.ref = "worldedit"
|
||||
|
||||
[libraries.worldedit-libs-ap]
|
||||
module = "com.sk89q.worldedit.worldedit-libs:ap"
|
||||
version.ref = "worldedit"
|
||||
Vendored
BIN
Binary file not shown.
+2
-1
@@ -1,6 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
@@ -83,10 +83,8 @@ done
|
||||
# This is normally unused
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
@@ -133,10 +131,13 @@ location of your Java installation."
|
||||
fi
|
||||
else
|
||||
JAVACMD=java
|
||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
if ! command -v java >/dev/null 2>&1
|
||||
then
|
||||
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
|
||||
Please set the JAVA_HOME variable in your environment to match the
|
||||
location of your Java installation."
|
||||
fi
|
||||
fi
|
||||
|
||||
# Increase the maximum file descriptors if we can.
|
||||
@@ -144,7 +145,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
case $MAX_FD in #(
|
||||
max*)
|
||||
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
MAX_FD=$( ulimit -H -n ) ||
|
||||
warn "Could not query maximum file descriptor limit"
|
||||
esac
|
||||
@@ -152,7 +153,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||
'' | soft) :;; #(
|
||||
*)
|
||||
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||
# shellcheck disable=SC3045
|
||||
# shellcheck disable=SC2039,SC3045
|
||||
ulimit -n "$MAX_FD" ||
|
||||
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||
esac
|
||||
@@ -197,11 +198,15 @@ if "$cygwin" || "$msys" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
# Collect all arguments for the java command;
|
||||
# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
|
||||
# shell script including quotes and variable substitutions, so put them in
|
||||
# double quotes to make sure that they get re-expanded; and
|
||||
# * put everything else in single quotes, so that it's not re-expanded.
|
||||
|
||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||
|
||||
# Collect all arguments for the java command:
|
||||
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||
# and any embedded shellness will be escaped.
|
||||
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||
# treated as '${Hostname}' itself on the command line.
|
||||
|
||||
set -- \
|
||||
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||
|
||||
Vendored
+10
-10
@@ -43,11 +43,11 @@ set JAVA_EXE=java.exe
|
||||
%JAVA_EXE% -version >NUL 2>&1
|
||||
if %ERRORLEVEL% equ 0 goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
@@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
||||
|
||||
if exist "%JAVA_EXE%" goto execute
|
||||
|
||||
echo.
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
||||
echo.
|
||||
echo Please set the JAVA_HOME variable in your environment to match the
|
||||
echo location of your Java installation.
|
||||
echo. 1>&2
|
||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||
echo. 1>&2
|
||||
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||
echo location of your Java installation. 1>&2
|
||||
|
||||
goto fail
|
||||
|
||||
|
||||
+29
-3
@@ -1,7 +1,33 @@
|
||||
pluginManagement {
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
}
|
||||
}
|
||||
plugins {
|
||||
id("org.gradle.toolchains.foojay-resolver-convention") version "0.8.0"
|
||||
}
|
||||
|
||||
logger.lifecycle("""
|
||||
*******************************************
|
||||
You are building WorldGuard!
|
||||
|
||||
If you encounter trouble:
|
||||
1) Read COMPILING.md if you haven't yet
|
||||
2) Try running 'build' in a separate Gradle run
|
||||
3) Use gradlew and not gradle
|
||||
4) If you still need help, ask on Discord! https://discord.gg/enginehub
|
||||
|
||||
Output files will be in [subproject]/build/libs
|
||||
*******************************************
|
||||
""")
|
||||
|
||||
rootProject.name = "worldguard"
|
||||
|
||||
includeBuild("build-logic")
|
||||
|
||||
include("worldguard-libs")
|
||||
include("worldguard-libs:core")
|
||||
include("worldguard-core")
|
||||
//include("worldguard-libs:bukkit")
|
||||
include("worldguard-bukkit")
|
||||
|
||||
listOf("bukkit", "core").forEach {
|
||||
include("worldguard-$it")
|
||||
}
|
||||
@@ -2,33 +2,40 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
|
||||
plugins {
|
||||
`java-library`
|
||||
id("buildlogic.platform")
|
||||
}
|
||||
|
||||
applyPlatformAndCoreConfiguration()
|
||||
applyShadowConfiguration()
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name = "paper"
|
||||
url = uri("https://repo.papermc.io/repository/maven-public/")
|
||||
}
|
||||
}
|
||||
|
||||
configurations {
|
||||
compileClasspath.get().extendsFrom(create("shadeOnly"))
|
||||
val localImplementation = configurations.create("localImplementation") {
|
||||
description = "Dependencies used locally, but provided by the runtime Bukkit implementation"
|
||||
isCanBeConsumed = false
|
||||
isCanBeResolved = false
|
||||
}
|
||||
configurations["compileOnly"].extendsFrom(localImplementation)
|
||||
configurations["testImplementation"].extendsFrom(localImplementation)
|
||||
|
||||
dependencies {
|
||||
"api"(project(":worldguard-core"))
|
||||
"compileOnly"("io.papermc.paper:paper-api:1.19.3-R0.1-SNAPSHOT")
|
||||
"runtimeOnly"("org.spigotmc:spigot-api:1.19.3-R0.1-SNAPSHOT") {
|
||||
"api"(libs.worldedit.bukkit) { isTransitive = false }
|
||||
"compileOnly"(libs.commandbook) { isTransitive = false }
|
||||
// Technically this is api, but everyone should already have some form of the bukkit API
|
||||
// Avoid pulling in another one, especially one so outdated.
|
||||
"localImplementation"(libs.spigot) {
|
||||
exclude("junit", "junit")
|
||||
}
|
||||
"api"("com.sk89q.worldedit:worldedit-bukkit:${Versions.WORLDEDIT}") { isTransitive = false }
|
||||
"implementation"("com.google.guava:guava:${Versions.GUAVA}")
|
||||
"compileOnly"("com.sk89q:commandbook:2.3") { isTransitive = false }
|
||||
"shadeOnly"("io.papermc:paperlib:1.0.8")
|
||||
"shadeOnly"("org.bstats:bstats-bukkit:3.0.1")
|
||||
|
||||
"compileOnly"(libs.jetbrains.annotations) {
|
||||
because("Resolving Spigot annotations")
|
||||
}
|
||||
"testCompileOnly"(libs.jetbrains.annotations) {
|
||||
because("Resolving Spigot annotations")
|
||||
}
|
||||
"compileOnly"(libs.paperApi) {
|
||||
exclude("org.slf4j", "slf4j-api")
|
||||
exclude("junit", "junit")
|
||||
}
|
||||
|
||||
"implementation"(libs.paperLib)
|
||||
"implementation"(libs.bstats.bukkit)
|
||||
}
|
||||
|
||||
tasks.named<Copy>("processResources") {
|
||||
@@ -39,31 +46,23 @@ tasks.named<Copy>("processResources") {
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named<Jar>("jar") {
|
||||
val projectVersion = project.version
|
||||
inputs.property("projectVersion", projectVersion)
|
||||
manifest {
|
||||
attributes("Implementation-Version" to projectVersion)
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named<ShadowJar>("shadowJar") {
|
||||
configurations = listOf(project.configurations["shadeOnly"], project.configurations["runtimeClasspath"])
|
||||
|
||||
dependencies {
|
||||
include(dependency(":worldguard-core"))
|
||||
relocate("org.bstats", "com.sk89q.worldguard.bukkit.bstats") {
|
||||
include(dependency("org.bstats:"))
|
||||
}
|
||||
relocate ("io.papermc.lib", "com.sk89q.worldguard.bukkit.paperlib") {
|
||||
include(dependency("io.papermc:paperlib"))
|
||||
}
|
||||
relocate ("co.aikar.timings.lib", "com.sk89q.worldguard.bukkit.timingslib") {
|
||||
include(dependency("co.aikar:minecraft-timings"))
|
||||
}
|
||||
include(dependency("org.bstats:"))
|
||||
include(dependency("io.papermc:paperlib"))
|
||||
|
||||
relocate("org.bstats", "com.sk89q.worldguard.bukkit.bstats")
|
||||
relocate("io.papermc.lib", "com.sk89q.worldguard.bukkit.paperlib")
|
||||
}
|
||||
}
|
||||
|
||||
tasks.named("assemble").configure {
|
||||
dependsOn("shadowJar")
|
||||
}
|
||||
|
||||
configure<PublishingExtension> {
|
||||
publications.named<MavenPublication>("maven") {
|
||||
from(components["java"])
|
||||
}
|
||||
}
|
||||
@@ -55,23 +55,6 @@ public class BukkitUtil {
|
||||
return item.getDurability() & 0x3F;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a blacklist target for the given block.
|
||||
*
|
||||
* @param block the block
|
||||
* @param effectiveMaterial The effective material, if different
|
||||
* @return a target
|
||||
*/
|
||||
public static Target createTarget(Block block, Material effectiveMaterial) {
|
||||
checkNotNull(block);
|
||||
checkNotNull(block.getType());
|
||||
if (block.getType() == effectiveMaterial) {
|
||||
return createTarget(block.getType());
|
||||
} else {
|
||||
return createTarget(effectiveMaterial);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a blacklist target for the given block.
|
||||
*
|
||||
|
||||
+4
@@ -215,6 +215,7 @@ public class BukkitWorldConfiguration extends YamlWorldConfiguration {
|
||||
blockEnderDragonPortalCreation = getBoolean("mobs.block-enderdragon-portal-creation", false);
|
||||
blockFireballExplosions = getBoolean("mobs.block-fireball-explosions", false);
|
||||
blockFireballBlockDamage = getBoolean("mobs.block-fireball-block-damage", false);
|
||||
blockWindChargeExplosions = getBoolean("mobs.block-windcharge-explosions", false);
|
||||
antiWolfDumbness = getBoolean("mobs.anti-wolf-dumbness", false);
|
||||
allowTamedSpawns = getBoolean("mobs.allow-tamed-spawns", true);
|
||||
disableEndermanGriefing = getBoolean("mobs.disable-enderman-griefing", false);
|
||||
@@ -256,6 +257,8 @@ public class BukkitWorldConfiguration extends YamlWorldConfiguration {
|
||||
|
||||
disableCreatureTurtleEggTrampling = getBoolean("turtle-egg.disable-creature-trampling", false);
|
||||
disablePlayerTurtleEggTrampling = getBoolean("turtle-egg.disable-player-trampling", false);
|
||||
disableCreatureSnifferEggTrampling = getBoolean("sniffer-egg.disable-creature-trampling", false);
|
||||
disablePlayerSnifferEggTrampling = getBoolean("sniffer-egg.disable-player-trampling", false);
|
||||
|
||||
disallowedLightningBlocks = new HashSet<>(convertLegacyBlocks(getStringList("weather.prevent-lightning-strike-blocks", null)));
|
||||
preventLightningFire = getBoolean("weather.disable-lightning-strike-fire", false);
|
||||
@@ -280,6 +283,7 @@ public class BukkitWorldConfiguration extends YamlWorldConfiguration {
|
||||
disableSculkGrowth = getBoolean("dynamics.disable-sculk-growth", false);
|
||||
disableCropGrowth = getBoolean("dynamics.disable-crop-growth", false);
|
||||
disableSoilDehydration = getBoolean("dynamics.disable-soil-dehydration", false);
|
||||
disableSoilMoistureChange = getBoolean("dynamics.disable-soil-moisture-change", false);
|
||||
disableCoralBlockFade = getBoolean("dynamics.disable-coral-block-fade", false);
|
||||
disableCopperBlockFade = getBoolean("dynamics.disable-copper-block-fade", false);
|
||||
allowedSnowFallOver = new HashSet<>(convertLegacyBlocks(getStringList("dynamics.snow-fall-blocks", null)));
|
||||
|
||||
+4
-3
@@ -171,9 +171,10 @@ public class BukkitWorldGuardPlatform implements WorldGuardPlatform {
|
||||
return WorldGuardPlugin.inst().getDataFolder().toPath();
|
||||
}
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
@Override
|
||||
public void stackPlayerInventory(LocalPlayer localPlayer) {
|
||||
boolean ignoreMax = localPlayer.hasPermission("worldguard.stack.illegitimate");
|
||||
boolean ignoreMax = false; // localPlayer.hasPermission("worldguard.stack.illegitimate");
|
||||
|
||||
Player player = ((BukkitPlayer) localPlayer).getPlayer();
|
||||
|
||||
@@ -191,7 +192,7 @@ public class BukkitWorldGuardPlatform implements WorldGuardPlatform {
|
||||
continue;
|
||||
}
|
||||
|
||||
int max = ignoreMax ? 64 : item.getMaxStackSize();
|
||||
int max = /*ignoreMax ? 64 :*/ item.getMaxStackSize();
|
||||
|
||||
if (item.getAmount() < max) {
|
||||
int needed = max - item.getAmount(); // Number of needed items until max
|
||||
@@ -266,7 +267,7 @@ public class BukkitWorldGuardPlatform implements WorldGuardPlatform {
|
||||
if (radius > 0) {
|
||||
BlockVector3 spawnLoc = BukkitAdapter.asBlockVector(bWorld.getSpawnLocation());
|
||||
return new ProtectedCuboidRegion("__spawn_protection__",
|
||||
spawnLoc.subtract(radius, 0, radius).withY(world.getMinimumPoint().getY()),
|
||||
spawnLoc.subtract(radius, 0, radius).withY(world.getMinimumPoint().y()),
|
||||
spawnLoc.add(radius, 0, radius).withY(world.getMaxY()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,8 +32,10 @@ import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.AnimalTamer;
|
||||
import org.bukkit.entity.AreaEffectCloud;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Creeper;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.FallingBlock;
|
||||
import org.bukkit.entity.Firework;
|
||||
import org.bukkit.entity.LightningStrike;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -326,15 +328,21 @@ public final class Cause {
|
||||
addAll(player.getPlayer()); // player object if online, else null
|
||||
}
|
||||
}
|
||||
} else if (o instanceof Creature && ((Creature) o).getTarget() != null) {
|
||||
} else if (o instanceof Creeper c) {
|
||||
indirect = true;
|
||||
addAll(((Creature) o).getTarget());
|
||||
addAll(c.getTarget(), c.getIgniter());
|
||||
} else if (o instanceof Creature c) {
|
||||
indirect = true;
|
||||
addAll(c.getTarget());
|
||||
} else if (o instanceof BlockProjectileSource) {
|
||||
addAll(((BlockProjectileSource) o).getBlock());
|
||||
} else if (o instanceof LightningStrike && PaperLib.isPaper() &&
|
||||
((LightningStrike) o).getCausingEntity() != null) {
|
||||
indirect = true;
|
||||
addAll(((LightningStrike) o).getCausingEntity());
|
||||
} else if (o instanceof FallingBlock f && PaperLib.isPaper() && f.getOrigin() != null) {
|
||||
indirect = true;
|
||||
addAll(f.getOrigin().getBlock());
|
||||
}
|
||||
|
||||
// Add manually tracked parent causes
|
||||
|
||||
+3
-3
@@ -96,7 +96,7 @@ public class BlacklistListener extends AbstractListener {
|
||||
event.filter(target -> {
|
||||
if (!wcfg.getBlacklist().check(
|
||||
new BlockBreakBlacklistEvent(localPlayer, BukkitAdapter.asBlockVector(target),
|
||||
createTarget(target.getBlock(), event.getEffectiveMaterial())), false, false)) {
|
||||
createTarget(target.getBlock())), false, false)) {
|
||||
return false;
|
||||
} else if (!wcfg.getBlacklist().check(
|
||||
new ItemDestroyWithBlacklistEvent(localPlayer, BukkitAdapter.asBlockVector(target),
|
||||
@@ -124,7 +124,7 @@ public class BlacklistListener extends AbstractListener {
|
||||
|
||||
final LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
|
||||
event.filter(target -> wcfg.getBlacklist().check(new BlockPlaceBlacklistEvent(
|
||||
localPlayer, BukkitAdapter.asBlockVector(target), createTarget(target.getBlock(), event.getEffectiveMaterial())), false, false));
|
||||
localPlayer, BukkitAdapter.asBlockVector(target), createTarget(target.getBlock())), false, false));
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@@ -143,7 +143,7 @@ public class BlacklistListener extends AbstractListener {
|
||||
|
||||
final LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
|
||||
event.filter(target -> wcfg.getBlacklist().check(new BlockInteractBlacklistEvent(
|
||||
localPlayer, BukkitAdapter.asBlockVector(target), createTarget(target.getBlock(), event.getEffectiveMaterial())), false, false));
|
||||
localPlayer, BukkitAdapter.asBlockVector(target), createTarget(target.getBlock())), false, false));
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
|
||||
+55
-49
@@ -35,6 +35,10 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.PotionMeta;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.potion.PotionType;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Handles blocked potions.
|
||||
@@ -50,43 +54,50 @@ public class BlockedPotionsListener extends AbstractListener {
|
||||
super(plugin);
|
||||
}
|
||||
|
||||
private PotionEffectType getBlockedEffectByArrow(Arrow arrow, BukkitWorldConfiguration wcfg) {
|
||||
List<PotionEffect> effects = new ArrayList<>();
|
||||
PotionType potionType = arrow.getBasePotionType();
|
||||
if (potionType != null) {
|
||||
effects.addAll(potionType.getPotionEffects());
|
||||
}
|
||||
effects.addAll(arrow.getCustomEffects());
|
||||
for (PotionEffect potionEffect : effects) {
|
||||
if (wcfg.blockPotions.contains(potionEffect.getType())) {
|
||||
return potionEffect.getType();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
@EventHandler
|
||||
public void onProjectile(DamageEntityEvent event) {
|
||||
if (event.getOriginalEvent() instanceof EntityDamageByEntityEvent) {
|
||||
EntityDamageByEntityEvent originalEvent = (EntityDamageByEntityEvent) event.getOriginalEvent();
|
||||
if (Entities.isPotionArrow(originalEvent.getDamager())) { // should take care of backcompat
|
||||
BukkitWorldConfiguration wcfg = getWorldConfig(event.getWorld());
|
||||
PotionEffectType blockedEffect = null;
|
||||
if (originalEvent.getDamager() instanceof SpectralArrow) {
|
||||
if (wcfg.blockPotions.contains(PotionEffectType.GLOWING)) {
|
||||
blockedEffect = PotionEffectType.GLOWING;
|
||||
}
|
||||
} else if (originalEvent.getDamager() instanceof Arrow) {
|
||||
Arrow tippedArrow = (Arrow) originalEvent.getDamager();
|
||||
PotionEffectType baseEffect = tippedArrow.getBasePotionData().getType().getEffectType();
|
||||
if (wcfg.blockPotions.contains(baseEffect)) {
|
||||
blockedEffect = baseEffect;
|
||||
} else {
|
||||
for (PotionEffect potionEffect : tippedArrow.getCustomEffects()) {
|
||||
if (wcfg.blockPotions.contains(potionEffect.getType())) {
|
||||
blockedEffect = potionEffect.getType();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (blockedEffect != null) {
|
||||
Player player = event.getCause().getFirstPlayer();
|
||||
if (player != null) {
|
||||
if (getPlugin().hasPermission(player, "worldguard.override.potions")) {
|
||||
return;
|
||||
}
|
||||
player.sendMessage(ChatColor.RED + "Sorry, arrows with "
|
||||
+ blockedEffect.getName() + " are presently disabled.");
|
||||
}
|
||||
event.setCancelled(true);
|
||||
}
|
||||
if (!(event.getOriginalEvent() instanceof EntityDamageByEntityEvent originalEvent)) {
|
||||
return;
|
||||
}
|
||||
if (!Entities.isPotionArrow(originalEvent.getDamager())) {
|
||||
return;
|
||||
}
|
||||
|
||||
BukkitWorldConfiguration wcfg = getWorldConfig(event.getWorld());
|
||||
PotionEffectType blockedEffect = null;
|
||||
if (originalEvent.getDamager() instanceof SpectralArrow) {
|
||||
if (wcfg.blockPotions.contains(PotionEffectType.GLOWING)) {
|
||||
blockedEffect = PotionEffectType.GLOWING;
|
||||
}
|
||||
} else if (originalEvent.getDamager() instanceof Arrow arrow) {
|
||||
blockedEffect = getBlockedEffectByArrow(arrow, wcfg);
|
||||
}
|
||||
if (blockedEffect != null) {
|
||||
Player player = event.getCause().getFirstPlayer();
|
||||
if (player != null) {
|
||||
if (getPlugin().hasPermission(player, "worldguard.override.potions")) {
|
||||
return;
|
||||
}
|
||||
player.sendMessage(ChatColor.RED + "Sorry, arrows with "
|
||||
+ blockedEffect.getName() + " are presently disabled.");
|
||||
}
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,25 +115,20 @@ public class BlockedPotionsListener extends AbstractListener {
|
||||
if (!wcfg.blockPotions.isEmpty()) {
|
||||
PotionEffectType blockedEffect = null;
|
||||
|
||||
PotionMeta meta;
|
||||
if (item.getItemMeta() instanceof PotionMeta) {
|
||||
meta = ((PotionMeta) item.getItemMeta());
|
||||
} else {
|
||||
return; // ok...?
|
||||
if (!(item.getItemMeta() instanceof PotionMeta meta)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Find the first blocked effect
|
||||
PotionEffectType baseEffect = meta.getBasePotionData().getType().getEffectType();
|
||||
if (wcfg.blockPotions.contains(baseEffect)) {
|
||||
blockedEffect = baseEffect;
|
||||
List<PotionEffect> effects = new ArrayList<>();
|
||||
if (meta.getBasePotionType() != null) {
|
||||
effects.addAll(meta.getBasePotionType().getPotionEffects());
|
||||
}
|
||||
|
||||
if (blockedEffect == null && meta.hasCustomEffects()) {
|
||||
for (PotionEffect effect : meta.getCustomEffects()) {
|
||||
if (wcfg.blockPotions.contains(effect.getType())) {
|
||||
blockedEffect = effect.getType();
|
||||
break;
|
||||
}
|
||||
effects.addAll(meta.getCustomEffects());
|
||||
for (PotionEffect potionEffect : effects) {
|
||||
if (wcfg.blockPotions.contains(potionEffect.getType())) {
|
||||
blockedEffect = potionEffect.getType();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-4
@@ -101,12 +101,14 @@ public class BuildPermissionListener extends AbstractListener {
|
||||
|
||||
if (rootCause instanceof Player) {
|
||||
final Player player = (Player) rootCause;
|
||||
final Material material = event.getEffectiveMaterial();
|
||||
|
||||
if (!hasBuildPermission(player, "block." + material.name().toLowerCase() + ".interact")
|
||||
&& !hasBuildPermission(player, "block.interact." + material.name().toLowerCase())) {
|
||||
boolean blocked = event.filter(loc -> {
|
||||
String blacklistName = loc.getBlock().getType().name().toLowerCase();
|
||||
return hasBuildPermission(player, "block." + blacklistName + ".interact") ||
|
||||
hasBuildPermission(player, "block.interact." + blacklistName);
|
||||
}, true);
|
||||
if (blocked && !event.isSilent()) {
|
||||
tellErrorMessage(player, event.getWorld());
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+97
-38
@@ -47,8 +47,10 @@ import com.sk89q.worldguard.bukkit.util.Materials;
|
||||
import com.sk89q.worldguard.config.WorldConfiguration;
|
||||
import com.sk89q.worldguard.protection.flags.Flags;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import io.papermc.paper.event.player.PlayerOpenSignEvent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.ExplosionResult;
|
||||
import org.bukkit.GameMode;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
@@ -65,6 +67,8 @@ import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.Waterlogged;
|
||||
import org.bukkit.block.data.type.Dispenser;
|
||||
import org.bukkit.entity.AreaEffectCloud;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.BreezeWindCharge;
|
||||
import org.bukkit.entity.Creeper;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
@@ -78,6 +82,7 @@ import org.bukkit.entity.Painting;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.entity.ThrownPotion;
|
||||
import org.bukkit.entity.WindCharge;
|
||||
import org.bukkit.entity.minecart.HopperMinecart;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.bukkit.event.Event;
|
||||
@@ -111,8 +116,10 @@ import org.bukkit.event.entity.EntityDamageByBlockEvent;
|
||||
import org.bukkit.event.entity.EntityDamageByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent;
|
||||
import org.bukkit.event.entity.EntityDeathEvent;
|
||||
import org.bukkit.event.entity.EntityEvent;
|
||||
import org.bukkit.event.entity.EntityExplodeEvent;
|
||||
import org.bukkit.event.entity.EntityInteractEvent;
|
||||
import org.bukkit.event.entity.EntityKnockbackByEntityEvent;
|
||||
import org.bukkit.event.entity.EntityPickupItemEvent;
|
||||
import org.bukkit.event.entity.EntityTameEvent;
|
||||
import org.bukkit.event.entity.EntityUnleashEvent;
|
||||
@@ -145,13 +152,13 @@ import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
import org.bukkit.potion.PotionEffectType;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public class EventAbstractionListener extends AbstractListener {
|
||||
@@ -176,9 +183,11 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
public void registerEvents() {
|
||||
super.registerEvents();
|
||||
|
||||
PluginManager pm = getPlugin().getServer().getPluginManager();
|
||||
if (PaperLib.isPaper()) {
|
||||
PluginManager pm = getPlugin().getServer().getPluginManager();
|
||||
pm.registerEvents(new EventAbstractionListener.PaperListener(), getPlugin());
|
||||
} else {
|
||||
pm.registerEvents(new EventAbstractionListener.SpigotListener(), getPlugin());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,8 +227,8 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
Events.fireToCancel(event, new BreakBlockEvent(event, create(event.getPlayer()), previousState.getLocation(), previousState.getType()));
|
||||
}
|
||||
|
||||
if (!event.isCancelled()) {
|
||||
ItemStack itemStack = new ItemStack(event.getBlockPlaced().getType(), 1);
|
||||
ItemStack itemStack = event.getItemInHand();
|
||||
if (!event.isCancelled() && itemStack.getType() != Material.AIR) {
|
||||
Events.fireToCancel(event, new UseItemEvent(event, create(event.getPlayer()), event.getPlayer().getWorld(), itemStack));
|
||||
}
|
||||
|
||||
@@ -323,10 +332,10 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
// Fire two events: one as BREAK and one as PLACE
|
||||
if (toType != Material.AIR && fromType != Material.AIR) {
|
||||
BreakBlockEvent breakDelagate = new BreakBlockEvent(event, cause, block);
|
||||
setDelegateEventMaterialOptions(breakDelagate, fromType, toType);
|
||||
BreakBlockEvent breakDelegate = new BreakBlockEvent(event, cause, block);
|
||||
setDelegateEventMaterialOptions(breakDelegate, fromType, toType);
|
||||
boolean denied;
|
||||
if (!(denied = Events.fireToCancel(event, breakDelagate))) {
|
||||
if (!(denied = Events.fireToCancel(event, breakDelegate))) {
|
||||
PlaceBlockEvent placeDelegate = new PlaceBlockEvent(event, cause, block.getLocation(), toType);
|
||||
setDelegateEventMaterialOptions(placeDelegate, fromType, toType);
|
||||
denied = Events.fireToCancel(event, placeDelegate);
|
||||
@@ -339,7 +348,10 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
} else if (toType == Material.AIR) {
|
||||
// Track the source so later we can create a proper chain of causes
|
||||
if (entity instanceof FallingBlock) {
|
||||
Cause.trackParentCause(entity, block);
|
||||
if (!PaperLib.isPaper()) {
|
||||
// On paper we use FallingBlock#getOrigin to get the origin location, on spigot we store it.
|
||||
Cause.trackParentCause(entity, block);
|
||||
}
|
||||
|
||||
// Switch around the event
|
||||
Events.fireToCancel(event, new SpawnEntityEvent(event, create(block), entity));
|
||||
@@ -354,10 +366,29 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
}
|
||||
|
||||
private static <T extends EntityEvent & Cancellable> void handleKnockback(T event, Entity damager) {
|
||||
final DamageEntityEvent eventToFire = new DamageEntityEvent(event, create(damager), event.getEntity());
|
||||
if (damager instanceof BreezeWindCharge) {
|
||||
eventToFire.getRelevantFlags().add(Flags.BREEZE_WIND_CHARGE);
|
||||
} else if (damager instanceof WindCharge) {
|
||||
eventToFire.getRelevantFlags().add(Flags.WIND_CHARGE_BURST);
|
||||
}
|
||||
Events.fireToCancel(event, eventToFire);
|
||||
}
|
||||
|
||||
@SuppressWarnings("UnstableApiUsage")
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEntityExplode(EntityExplodeEvent event) {
|
||||
Entity entity = event.getEntity();
|
||||
Events.fireBulkEventToCancel(event, new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR));
|
||||
if (event.getExplosionResult() == ExplosionResult.TRIGGER_BLOCK) {
|
||||
UseBlockEvent useEvent = new UseBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR);
|
||||
useEvent.getRelevantFlags().add(Entities.getExplosionFlag(entity));
|
||||
useEvent.setSilent(true);
|
||||
Events.fireBulkEventToCancel(event, useEvent);
|
||||
} else if (event.getExplosionResult() == ExplosionResult.DESTROY || event.getExplosionResult() == ExplosionResult.DESTROY_WITH_DECAY) {
|
||||
Events.fireBulkEventToCancel(event, new BreakBlockEvent(event, create(entity), event.getLocation().getWorld(), event.blockList(), Material.AIR));
|
||||
}
|
||||
|
||||
if (entity instanceof Creeper) {
|
||||
Cause.untrackParentCause(entity);
|
||||
}
|
||||
@@ -454,7 +485,9 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
switch (event.getAction()) {
|
||||
case PHYSICAL:
|
||||
if (event.useInteractedBlock() != Result.DENY) {
|
||||
if (clicked.getType() == Material.FARMLAND || clicked.getType() == Material.TURTLE_EGG) {
|
||||
if (clicked.getType() == Material.FARMLAND ||
|
||||
clicked.getType() == Material.TURTLE_EGG ||
|
||||
clicked.getType() == Material.SNIFFER_EGG) {
|
||||
BreakBlockEvent breakDelagate = new BreakBlockEvent(event, cause, clicked);
|
||||
breakDelagate.setSilent(true);
|
||||
breakDelagate.getRelevantFlags().add(Flags.TRAMPLE_BLOCKS);
|
||||
@@ -480,7 +513,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
firedEvent.setSilent(true);
|
||||
}
|
||||
interactDebounce.debounce(clicked, event.getPlayer(), event, firedEvent);
|
||||
if (event.useInteractedBlock() == Result.DENY) {
|
||||
if (event.useInteractedBlock() == Result.DENY && !firedEvent.isSilent()) {
|
||||
playDenyEffect(player, clicked.getLocation().add(0, 1, 0));
|
||||
}
|
||||
}
|
||||
@@ -574,7 +607,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onBlockFertilize(BlockFertilizeEvent event) {
|
||||
if (event.getBlocks().isEmpty()) return;
|
||||
if (event.getBlocks().isEmpty()) return;
|
||||
Cause cause = create(event.getPlayer(), event.getBlock());
|
||||
Events.fireToCancel(event, new PlaceBlockEvent(event, cause, event.getBlock().getWorld(), event.getBlocks()));
|
||||
}
|
||||
@@ -600,9 +633,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onSignChange(SignChangeEvent event) {
|
||||
Events.fireToCancel(event, new UseBlockEvent(event, create(event.getPlayer()), event.getBlock()));
|
||||
|
||||
if (event.isCancelled()) {
|
||||
if (Events.fireToCancel(event, new PlaceBlockEvent(event, create(event.getPlayer()), event.getBlock()))) {
|
||||
playDenyEffect(event.getPlayer(), event.getBlock().getLocation().add(0.5, 0.5, 0.5));
|
||||
}
|
||||
}
|
||||
@@ -742,7 +773,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
if (event.isCancelled() && remover instanceof Player) {
|
||||
playDenyEffect((Player) remover, event.getEntity().getLocation());
|
||||
}
|
||||
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION){
|
||||
} else if (event.getCause() == HangingBreakEvent.RemoveCause.EXPLOSION) {
|
||||
DestroyEntityEvent destroyEntityEvent = new DestroyEntityEvent(event, Cause.unknown(), event.getEntity());
|
||||
destroyEntityEvent.getRelevantFlags().add(Flags.OTHER_EXPLOSION);
|
||||
if (event.getEntity() instanceof ItemFrame) {
|
||||
@@ -772,7 +803,9 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
public void onPlayerFish(PlayerFishEvent event) {
|
||||
if (event.getState() == PlayerFishEvent.State.FISHING) {
|
||||
if (Events.fireAndTestCancel(new UseItemEvent(event, create(event.getPlayer(), event.getHook()),
|
||||
event.getPlayer().getWorld(), event.getPlayer().getInventory().getItemInMainHand()))) {
|
||||
event.getPlayer().getWorld(),
|
||||
// guaranteed to be non-null in FISHING state
|
||||
event.getPlayer().getInventory().getItem(Objects.requireNonNull(event.getHand()))))) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
} else if (event.getState() == PlayerFishEvent.State.CAUGHT_FISH) {
|
||||
@@ -786,7 +819,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
Events.fireToCancel(event, new DestroyEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
|
||||
} else if (Entities.isConsideredBuildingIfUsed(caught)) {
|
||||
Events.fireToCancel(event, new UseEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
|
||||
} else if (Entities.isNonHostile(caught) || caught instanceof Player) {
|
||||
} else if (!Entities.isHostile(caught) || caught instanceof Player) {
|
||||
Events.fireToCancel(event, new DamageEntityEvent(event, create(event.getPlayer(), event.getHook()), caught));
|
||||
}
|
||||
}
|
||||
@@ -837,12 +870,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
if (matchingItem != null && hasInteractBypass(world, matchingItem)) {
|
||||
useEntityEvent.setAllowed(true);
|
||||
}
|
||||
if (!Events.fireToCancel(event, useEntityEvent)) {
|
||||
// so this is a hack but CreeperIgniteEvent doesn't actually tell us who, so we need to do it here
|
||||
if (item.getType() == Material.FLINT_AND_STEEL && entity.getType() == EntityType.CREEPER) {
|
||||
Cause.trackParentCause(entity, player);
|
||||
}
|
||||
}
|
||||
Events.fireToCancel(event, useEntityEvent);
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
@@ -887,11 +915,19 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEntityCombust(EntityCombustEvent event) {
|
||||
if (event instanceof EntityCombustByBlockEvent) {
|
||||
if (event instanceof EntityCombustByBlockEvent combustByBlockEvent) {
|
||||
// at the time of writing, spigot is throwing null for the event's combuster. this causes lots of issues downstream.
|
||||
// whenever (i mean if ever) it is fixed, use getCombuster again instead of the current block
|
||||
Events.fireToCancel(event, new DamageEntityEvent(event, create(event.getEntity().getLocation().getBlock()), event.getEntity()));
|
||||
Block combuster = combustByBlockEvent.getCombuster();
|
||||
Events.fireToCancel(event, new DamageEntityEvent(event,
|
||||
create(combuster == null ? event.getEntity().getLocation().getBlock() : combuster), event.getEntity()));
|
||||
} else if (event instanceof EntityCombustByEntityEvent) {
|
||||
if (event.getEntity() instanceof Arrow) {
|
||||
// this only happens from the Flame enchant. igniting arrows in other ways (eg with lava) doesn't even
|
||||
// throw the combust event, not even the CombustByBlock event... they're also very buggy and don't even
|
||||
// show as lit on the client consistently
|
||||
return;
|
||||
}
|
||||
Events.fireToCancel(event, new DamageEntityEvent(event, create(((EntityCombustByEntityEvent) event).getCombuster()), event.getEntity()));
|
||||
}
|
||||
}
|
||||
@@ -1007,7 +1043,6 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
// Fire item interaction event
|
||||
Events.fireToCancel(event, new UseItemEvent(event, cause, world, potion.getItem()));
|
||||
|
||||
// Fire entity interaction event
|
||||
if (!event.isCancelled()) {
|
||||
int blocked = 0;
|
||||
@@ -1019,8 +1054,11 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
? new DamageEntityEvent(event, cause, affected) :
|
||||
new UseEntityEvent(event, cause, affected);
|
||||
|
||||
// Consider the potion splash flag
|
||||
// Consider extra relevant flags
|
||||
delegate.getRelevantFlags().add(Flags.POTION_SPLASH);
|
||||
if (potion.getShooter() instanceof LivingEntity shooter && !(shooter instanceof Player) && affected instanceof Player) {
|
||||
delegate.getRelevantFlags().add(Flags.MOB_DAMAGE);
|
||||
}
|
||||
|
||||
if (Events.fireAndTestCancel(delegate)) {
|
||||
event.setIntensity(affected, 0);
|
||||
@@ -1086,9 +1124,9 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
public void onLingeringApply(AreaEffectCloudApplyEvent event) {
|
||||
AreaEffectCloud entity = event.getEntity();
|
||||
List<PotionEffect> effects = new ArrayList<>();
|
||||
PotionEffectType baseEffectType = entity.getBasePotionData().getType().getEffectType();
|
||||
if (baseEffectType != null) {
|
||||
effects.add(new PotionEffect(baseEffectType, 0, 0));
|
||||
List<PotionEffect> baseEffectTypes = entity.getBasePotionType() == null ? null : entity.getBasePotionType().getPotionEffects();
|
||||
if (baseEffectTypes != null) {
|
||||
effects.addAll(baseEffectTypes);
|
||||
}
|
||||
if (entity.hasCustomEffects()) {
|
||||
effects.addAll(entity.getCustomEffects());
|
||||
@@ -1102,7 +1140,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event){
|
||||
public void onPlayerInteractAtEntity(PlayerInteractAtEntityEvent event) {
|
||||
onPlayerInteractEntity(event);
|
||||
}
|
||||
|
||||
@@ -1161,7 +1199,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
// Handle created boats
|
||||
if (item != null && Materials.isBoat(item.getType())) {
|
||||
Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), EntityType.BOAT));
|
||||
Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), Materials.getRelatedEntity(item.getType())));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1173,7 +1211,7 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
|
||||
if (item != null && item.getType() == Material.END_CRYSTAL) { /*&& placed.getType() == Material.BEDROCK) {*/ // in vanilla you can only place them on bedrock but who knows what plugins will add
|
||||
// may be overprotective as a result, but better than being underprotective
|
||||
Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), EntityType.ENDER_CRYSTAL));
|
||||
Events.fireToCancel(event, new SpawnEntityEvent(event, cause, placed.getLocation().add(0.5, 0, 0.5), EntityType.END_CRYSTAL));
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1213,9 +1251,9 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
useBlockEvent.setAllowed(true);
|
||||
}
|
||||
Events.fireToCancel(originalEvent, useBlockEvent);
|
||||
} else if (holder instanceof DoubleChest) {
|
||||
InventoryHolder left = ((DoubleChest) holder).getLeftSide();
|
||||
InventoryHolder right = ((DoubleChest) holder).getRightSide();
|
||||
} else if (holder instanceof DoubleChest doubleChest) {
|
||||
InventoryHolder left = PaperLib.isPaper() ? doubleChest.getLeftSide(false) : doubleChest.getLeftSide();
|
||||
InventoryHolder right = PaperLib.isPaper() ? doubleChest.getRightSide(false) : doubleChest.getRightSide();
|
||||
if (left instanceof Chest) {
|
||||
Events.fireToCancel(originalEvent, new UseBlockEvent(originalEvent, cause, ((Chest) left).getBlock()));
|
||||
}
|
||||
@@ -1261,10 +1299,31 @@ public class EventAbstractionListener extends AbstractListener {
|
||||
}
|
||||
}
|
||||
|
||||
private class PaperListener implements Listener {
|
||||
private static class PaperListener implements Listener {
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEntityTransform(EntityZapEvent event) {
|
||||
Events.fireToCancel(event, new DamageEntityEvent(event, create(event.getBolt()), event.getEntity()));
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onSignOpen(PlayerOpenSignEvent event) {
|
||||
if (event.getCause() == PlayerOpenSignEvent.Cause.INTERACT) {
|
||||
// other cases are handled by other events
|
||||
Events.fireToCancel(event, new UseBlockEvent(event, create(event.getPlayer()), event.getSign().getBlock()));
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEntityKnockbackByEntity(com.destroystokyo.paper.event.entity.EntityKnockbackByEntityEvent event) {
|
||||
handleKnockback(event, event.getHitBy());
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
private static class SpigotListener implements Listener {
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onEntityKnockbackByEntity(EntityKnockbackByEntityEvent event) {
|
||||
handleKnockback(event, event.getSourceEntity());
|
||||
}
|
||||
}
|
||||
}
|
||||
+10
-17
@@ -25,7 +25,6 @@ import com.sk89q.worldguard.WorldGuard;
|
||||
import com.sk89q.worldguard.bukkit.WorldGuardPlugin;
|
||||
import com.sk89q.worldguard.session.MoveType;
|
||||
import com.sk89q.worldguard.session.Session;
|
||||
import io.papermc.lib.PaperLib;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.AbstractHorse;
|
||||
@@ -34,14 +33,13 @@ import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.entity.EntityMountEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.event.player.PlayerRespawnEvent;
|
||||
import org.bukkit.event.vehicle.VehicleEnterEvent;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.util.Vector;
|
||||
import org.spigotmc.event.entity.EntityMountEvent;
|
||||
|
||||
public class PlayerMoveListener extends AbstractListener {
|
||||
|
||||
@@ -54,13 +52,10 @@ public class PlayerMoveListener extends AbstractListener {
|
||||
if (WorldGuard.getInstance().getPlatform().getGlobalStateManager().usePlayerMove) {
|
||||
PluginManager pm = getPlugin().getServer().getPluginManager();
|
||||
pm.registerEvents(this, getPlugin());
|
||||
if (PaperLib.isSpigot()) {
|
||||
pm.registerEvents(new EntityMountListener(), getPlugin());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerRespawn(PlayerRespawnEvent event) {
|
||||
LocalPlayer player = getPlugin().wrapPlayer(event.getPlayer());
|
||||
|
||||
@@ -152,16 +147,14 @@ public class PlayerMoveListener extends AbstractListener {
|
||||
session.uninitialize(localPlayer);
|
||||
}
|
||||
|
||||
private class EntityMountListener implements Listener {
|
||||
@EventHandler
|
||||
public void onEntityMount(EntityMountEvent event) {
|
||||
Entity entity = event.getEntity();
|
||||
if (entity instanceof Player) {
|
||||
LocalPlayer player = getPlugin().wrapPlayer((Player) entity);
|
||||
Session session = WorldGuard.getInstance().getPlatform().getSessionManager().get(player);
|
||||
if (null != session.testMoveTo(player, BukkitAdapter.adapt(event.getMount().getLocation()), MoveType.EMBARK, true)) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
@EventHandler
|
||||
public void onEntityMount(EntityMountEvent event) {
|
||||
Entity entity = event.getEntity();
|
||||
if (entity instanceof Player) {
|
||||
LocalPlayer player = getPlugin().wrapPlayer((Player) entity);
|
||||
Session session = WorldGuard.getInstance().getPlatform().getSessionManager().get(player);
|
||||
if (null != session.testMoveTo(player, BukkitAdapter.adapt(event.getMount().getLocation()), MoveType.EMBARK, true)) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-2
@@ -69,7 +69,7 @@ public class RegionFlagsListener extends AbstractListener {
|
||||
}
|
||||
}
|
||||
|
||||
if (event.getCause().find(EntityType.SNOWMAN) != null) {
|
||||
if (event.getCause().find(EntityType.SNOW_GOLEM) != null) {
|
||||
event.filter(testState(query, Flags.SNOWMAN_TRAILS), false);
|
||||
}
|
||||
|
||||
@@ -100,7 +100,7 @@ public class RegionFlagsListener extends AbstractListener {
|
||||
event.filter(testState(query, Flags.ENDERDRAGON_BLOCK_DAMAGE), config.explosionFlagCancellation);
|
||||
}
|
||||
|
||||
if (event.getCause().find(EntityType.ENDER_CRYSTAL) != null) { // EnderCrystal
|
||||
if (event.getCause().find(EntityType.END_CRYSTAL) != null) { // EnderCrystal
|
||||
event.filter(testState(query, Flags.OTHER_EXPLOSION), config.explosionFlagCancellation);
|
||||
}
|
||||
|
||||
|
||||
+37
-10
@@ -61,6 +61,8 @@ import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.event.Event;
|
||||
import org.bukkit.event.Event.Result;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.EntityMountEvent;
|
||||
import org.bukkit.event.inventory.InventoryOpenEvent;
|
||||
import org.bukkit.event.player.PlayerTakeLecternBookEvent;
|
||||
import org.bukkit.event.vehicle.VehicleExitEvent;
|
||||
|
||||
@@ -173,7 +175,7 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
/* Flint and steel, fire charge, etc. */
|
||||
if (Materials.isFire(type)) {
|
||||
Block block = event.getCause().getFirstBlock();
|
||||
boolean fire = block != null && Materials.isFire(type);
|
||||
boolean fire = block != null && Materials.isFire(block.getType());
|
||||
boolean lava = block != null && Materials.isLava(block.getType());
|
||||
List<StateFlag> flags = new ArrayList<>();
|
||||
flags.add(Flags.BLOCK_PLACE);
|
||||
@@ -218,7 +220,7 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
String what;
|
||||
|
||||
/* TNT */
|
||||
if (event.getCause().find(EntityType.PRIMED_TNT, EntityType.MINECART_TNT) != null) {
|
||||
if (event.getCause().find(EntityType.TNT, EntityType.TNT_MINECART) != null) {
|
||||
canBreak = query.testBuild(BukkitAdapter.adapt(target), associable, combine(event, Flags.BLOCK_BREAK, Flags.TNT));
|
||||
what = "use dynamite";
|
||||
|
||||
@@ -244,13 +246,13 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
if (!isRegionSupportEnabled(event.getWorld())) return; // Region support disabled
|
||||
if (isWhitelisted(event.getCause(), event.getWorld(), false)) return; // Whitelisted cause
|
||||
|
||||
final Material type = event.getEffectiveMaterial();
|
||||
final RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
|
||||
final RegionAssociable associable = createRegionAssociable(event.getCause());
|
||||
|
||||
event.filter((Predicate<Location>) target -> {
|
||||
boolean canUse;
|
||||
String what;
|
||||
final Material type = target.getBlock().getType();
|
||||
|
||||
/* Saplings, etc. */
|
||||
if (Materials.isConsideredBuildingIfUsed(type)) {
|
||||
@@ -410,13 +412,15 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
canUse = event.getRelevantFlags().isEmpty() || query.queryState(BukkitAdapter.adapt(target), associable, combine(event)) != State.DENY;
|
||||
what = "use that";
|
||||
/* Paintings, item frames, etc. */
|
||||
} else if (Entities.isConsideredBuildingIfUsed(entity)) {
|
||||
} else if (Entities.isConsideredBuildingIfUsed(entity)
|
||||
// weird case since sneak+interact is chest access and not ride
|
||||
|| event.getOriginalEvent() instanceof InventoryOpenEvent) {
|
||||
if ((type == EntityType.ITEM_FRAME || type == EntityType.GLOW_ITEM_FRAME)
|
||||
&& event.getCause().getFirstPlayer() != null
|
||||
&& ((ItemFrame) entity).getItem().getType() != Material.AIR) {
|
||||
canUse = query.testBuild(BukkitAdapter.adapt(target), associable, combine(event, Flags.ITEM_FRAME_ROTATE));
|
||||
what = "change that";
|
||||
} else if (Entities.isMinecart(type)) {
|
||||
} else if (event.getOriginalEvent() instanceof InventoryOpenEvent) {
|
||||
canUse = query.testBuild(BukkitAdapter.adapt(target), associable, combine(event, Flags.CHEST_ACCESS));
|
||||
what = "open that";
|
||||
} else {
|
||||
@@ -425,9 +429,10 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
}
|
||||
/* Ridden on use */
|
||||
} else if (Entities.isRiddenOnUse(entity)) {
|
||||
canUse = query.testBuild(BukkitAdapter.adapt(target), associable, combine(event, Flags.RIDE, Flags.INTERACT));
|
||||
// this is bypassed here as it's handled by the entity mount listener below
|
||||
// bukkit actually gives three events in this case - in order: PlayerInteractAtEntity, VehicleEnter, EntityMount
|
||||
canUse = true;
|
||||
what = "ride that";
|
||||
|
||||
/* Everything else */
|
||||
} else {
|
||||
canUse = query.testBuild(BukkitAdapter.adapt(target), associable, combine(event, Flags.INTERACT));
|
||||
@@ -463,11 +468,12 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
}
|
||||
|
||||
/* Hostile / ambient mob override */
|
||||
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())
|
||||
|| Entities.isVehicle(event.getEntity().getType())) {
|
||||
if (Entities.isHostile(event.getEntity()) || Entities.isAmbient(event.getEntity())) {
|
||||
canDamage = event.getRelevantFlags().isEmpty() || query.queryState(target, associable, combine(event)) != State.DENY;
|
||||
what = "hit that";
|
||||
|
||||
} else if (Entities.isVehicle(event.getEntity().getType())) {
|
||||
canDamage = query.testBuild(target, associable, combine(event, Flags.DAMAGE_VEHICLE));
|
||||
what = "change that";
|
||||
/* Paintings, item frames, etc. */
|
||||
} else if (Entities.isConsideredBuildingIfUsed(event.getEntity())) {
|
||||
canDamage = query.testBuild(target, associable, combine(event));
|
||||
@@ -516,6 +522,27 @@ public class RegionProtectionListener extends AbstractListener {
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onEntityMount(EntityMountEvent event) {
|
||||
Entity vehicle = event.getMount();
|
||||
if (!isRegionSupportEnabled(vehicle.getWorld())) return; // Region support disabled
|
||||
if (!(event.getEntity() instanceof Player player)) {
|
||||
return;
|
||||
}
|
||||
Cause cause = Cause.create(player);
|
||||
if (isWhitelisted(cause, vehicle.getWorld(), false)) {
|
||||
return;
|
||||
}
|
||||
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
|
||||
Location location = vehicle.getLocation();
|
||||
LocalPlayer localPlayer = WorldGuardPlugin.inst().wrapPlayer(player);
|
||||
if (!query.testBuild(BukkitAdapter.adapt(location), localPlayer, Flags.RIDE, Flags.INTERACT)) {
|
||||
event.setCancelled(true);
|
||||
DelegateEvent dummy = new UseEntityEvent(event, cause, vehicle);
|
||||
tellErrorMessage(dummy, cause, vehicle.getLocation(), "ride that");
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onVehicleExit(VehicleExitEvent event) {
|
||||
Entity vehicle = event.getVehicle();
|
||||
|
||||
+33
-11
@@ -56,6 +56,7 @@ import org.bukkit.event.block.BlockRedstoneEvent;
|
||||
import org.bukkit.event.block.BlockSpreadEvent;
|
||||
import org.bukkit.event.block.EntityBlockFormEvent;
|
||||
import org.bukkit.event.block.LeavesDecayEvent;
|
||||
import org.bukkit.event.block.MoistureChangeEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.Damageable;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
@@ -470,7 +471,6 @@ public class WorldGuardBlockListener extends AbstractListener {
|
||||
public void onBlockForm(BlockFormEvent event) {
|
||||
ConfigurationManager cfg = getConfig();
|
||||
|
||||
|
||||
if (cfg.activityHaltToggle) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
@@ -521,6 +521,18 @@ public class WorldGuardBlockListener extends AbstractListener {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (Materials.isUnwaxedCopper(event.getBlock().getType())) {
|
||||
if (wcfg.disableCopperBlockFade) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (wcfg.useRegions && !StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.queryState(BukkitAdapter.adapt(event.getBlock().getLocation()), (RegionAssociable) null, Flags.COPPER_FADE))) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -697,16 +709,6 @@ public class WorldGuardBlockListener extends AbstractListener {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else if (Materials.isUnwaxedCopper(event.getBlock().getType())) {
|
||||
if (wcfg.disableCopperBlockFade) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (wcfg.useRegions && !StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.queryState(BukkitAdapter.adapt(event.getBlock().getLocation()), (RegionAssociable) null, Flags.COPPER_FADE))) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -725,4 +727,24 @@ public class WorldGuardBlockListener extends AbstractListener {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when the moisture level of a block changes
|
||||
*/
|
||||
@EventHandler(ignoreCancelled = true)
|
||||
public void onMoistureChange(MoistureChangeEvent event) {
|
||||
WorldConfiguration wcfg = getWorldConfig(event.getBlock().getWorld());
|
||||
|
||||
if (wcfg.disableSoilMoistureChange) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (wcfg.useRegions) {
|
||||
if (!StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.queryState(BukkitAdapter.adapt(event.getBlock().getLocation()), (RegionAssociable) null, Flags.MOISTURE_CHANGE))) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
+33
-13
@@ -44,6 +44,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockState;
|
||||
import org.bukkit.entity.AbstractWindCharge;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Creeper;
|
||||
import org.bukkit.entity.EnderCrystal;
|
||||
@@ -60,6 +61,7 @@ import org.bukkit.entity.Player;
|
||||
import org.bukkit.entity.Projectile;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.entity.WindCharge;
|
||||
import org.bukkit.entity.Wither;
|
||||
import org.bukkit.entity.WitherSkull;
|
||||
import org.bukkit.entity.Wolf;
|
||||
@@ -120,6 +122,10 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (block.getType() == Material.SNIFFER_EGG && wcfg.disableCreatureSnifferEggTrampling) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
@@ -307,13 +313,17 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (event.getDamager() instanceof Fireball) {
|
||||
Fireball fireball = (Fireball) event.getDamager();
|
||||
if (event.getDamager() instanceof Fireball fireball) {
|
||||
if (fireball instanceof WitherSkull) {
|
||||
if (wcfg.blockWitherSkullExplosions) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else if (fireball instanceof AbstractWindCharge) {
|
||||
if (wcfg.blockWindChargeExplosions) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (wcfg.blockFireballExplosions) {
|
||||
event.setCancelled(true);
|
||||
@@ -322,7 +332,7 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
}
|
||||
if (wcfg.useRegions) {
|
||||
RegionQuery query = WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery();
|
||||
if (!query.testState(localPlayer.getLocation(), localPlayer, Flags.GHAST_FIREBALL) && wcfg.explosionFlagCancellation) {
|
||||
if (!query.testState(localPlayer.getLocation(), localPlayer, Entities.getExplosionFlag(event.getDamager())) && wcfg.explosionFlagCancellation) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
@@ -479,6 +489,11 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
event.blockList().clear();
|
||||
return;
|
||||
}
|
||||
} else if (ent instanceof AbstractWindCharge) {
|
||||
if (wcfg.blockWindChargeExplosions) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
if (wcfg.blockFireballExplosions) {
|
||||
event.setCancelled(true);
|
||||
@@ -489,10 +504,10 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
return;
|
||||
}
|
||||
}
|
||||
// allow wither skull blocking since there is no dedicated flag atm
|
||||
if (wcfg.useRegions) {
|
||||
if (wcfg.useRegions && !(ent instanceof WindCharge)) {
|
||||
for (Block block : event.blockList()) {
|
||||
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().getApplicableRegions(BukkitAdapter.adapt(block.getLocation())).testState(null, Flags.GHAST_FIREBALL)) {
|
||||
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.testState(BukkitAdapter.adapt(block.getLocation()), null, Entities.getExplosionFlag(ent))) {
|
||||
event.blockList().clear();
|
||||
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
|
||||
return;
|
||||
@@ -510,8 +525,8 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
}
|
||||
if (wcfg.useRegions) {
|
||||
for (Block block : event.blockList()) {
|
||||
if (!StateFlag.test(WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().queryState(BukkitAdapter.adapt(block.getLocation()),
|
||||
(RegionAssociable) null, Flags.WITHER_DAMAGE))) {
|
||||
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.testState(BukkitAdapter.adapt(block.getLocation()), null, Flags.WITHER_DAMAGE)) {
|
||||
event.blockList().clear();
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
@@ -526,7 +541,8 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
}
|
||||
if (wcfg.useRegions) {
|
||||
for (Block block : event.blockList()) {
|
||||
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery().getApplicableRegions(BukkitAdapter.adapt(block.getLocation())).testState(null, Flags.OTHER_EXPLOSION)) {
|
||||
if (!WorldGuard.getInstance().getPlatform().getRegionContainer().createQuery()
|
||||
.testState(BukkitAdapter.adapt(block.getLocation()), null, Flags.OTHER_EXPLOSION)) {
|
||||
event.blockList().clear();
|
||||
if (wcfg.explosionFlagCancellation) event.setCancelled(true);
|
||||
return;
|
||||
@@ -535,7 +551,6 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (wcfg.signChestProtection) {
|
||||
for (Block block : event.blockList()) {
|
||||
if (wcfg.isChestProtected(BukkitAdapter.adapt(block.getLocation()))) {
|
||||
@@ -582,12 +597,17 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else if (event.getEntityType() == EntityType.PRIMED_TNT
|
||||
|| event.getEntityType() == EntityType.MINECART_TNT) {
|
||||
} else if (event.getEntityType() == EntityType.TNT
|
||||
|| event.getEntityType() == EntityType.TNT_MINECART) {
|
||||
if (wcfg.blockTNTExplosions) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
} else if (event instanceof AbstractWindCharge) {
|
||||
if (wcfg.blockWindChargeExplosions) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -603,7 +623,7 @@ public class WorldGuardEntityListener extends AbstractListener {
|
||||
WorldConfiguration wcfg = getWorldConfig(event.getEntity().getWorld());
|
||||
|
||||
// allow spawning of creatures from plugins
|
||||
if (!wcfg.blockPluginSpawning && event.getSpawnReason() == CreatureSpawnEvent.SpawnReason.CUSTOM) {
|
||||
if (!wcfg.blockPluginSpawning && Entities.isPluginSpawning(event.getSpawnReason())) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
+9
@@ -307,6 +307,10 @@ public class WorldGuardPlayerListener extends AbstractListener {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
if (type == Material.SNIFFER_EGG && wcfg.disablePlayerSnifferEggTrampling) {
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGHEST)
|
||||
@@ -346,6 +350,11 @@ public class WorldGuardPlayerListener extends AbstractListener {
|
||||
|
||||
@EventHandler(priority = EventPriority.LOW, ignoreCancelled = true)
|
||||
public void onPlayerTeleport(PlayerTeleportEvent event) {
|
||||
if (event.getTo() == null) {
|
||||
// The target location for PlayerTeleportEvents can be null.
|
||||
// Those events will be ignored by the server, so we can ignore them too.
|
||||
return;
|
||||
}
|
||||
Player player = event.getPlayer();
|
||||
if (com.sk89q.worldguard.bukkit.util.Entities.isNPC(player)) return;
|
||||
LocalPlayer localPlayer = getPlugin().wrapPlayer(player);
|
||||
|
||||
+1
-1
@@ -54,7 +54,7 @@ public class InventoryMoveItemEventDebounce extends AbstractEventDebounce<Key> {
|
||||
if (holder instanceof BlockState blockState) {
|
||||
return new BlockMaterialKey(blockState);
|
||||
} else if (holder instanceof DoubleChest doubleChest) {
|
||||
InventoryHolder left = doubleChest.getLeftSide();
|
||||
InventoryHolder left = PaperLib.isPaper() ? doubleChest.getLeftSide(false) : doubleChest.getLeftSide();
|
||||
if (left instanceof Chest chest) {
|
||||
return new BlockMaterialKey(chest);
|
||||
} else {
|
||||
|
||||
@@ -19,15 +19,21 @@
|
||||
|
||||
package com.sk89q.worldguard.bukkit.util;
|
||||
|
||||
import com.sk89q.worldguard.protection.flags.Flags;
|
||||
import com.sk89q.worldguard.protection.flags.StateFlag;
|
||||
import org.bukkit.entity.Allay;
|
||||
import org.bukkit.entity.Ambient;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Arrow;
|
||||
import org.bukkit.entity.BreezeWindCharge;
|
||||
import org.bukkit.entity.Creature;
|
||||
import org.bukkit.entity.Creeper;
|
||||
import org.bukkit.entity.EnderCrystal;
|
||||
import org.bukkit.entity.EnderDragon;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.entity.Fireball;
|
||||
import org.bukkit.entity.Firework;
|
||||
import org.bukkit.entity.Flying;
|
||||
import org.bukkit.entity.Hanging;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
@@ -43,10 +49,14 @@ import org.bukkit.entity.Steerable;
|
||||
import org.bukkit.entity.TNTPrimed;
|
||||
import org.bukkit.entity.Tameable;
|
||||
import org.bukkit.entity.Vehicle;
|
||||
import org.bukkit.entity.WindCharge;
|
||||
import org.bukkit.entity.Wither;
|
||||
import org.bukkit.entity.minecart.ExplosiveMinecart;
|
||||
import org.bukkit.event.entity.CreatureSpawnEvent;
|
||||
import org.bukkit.inventory.InventoryHolder;
|
||||
import org.bukkit.projectiles.ProjectileSource;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
public final class Entities {
|
||||
@@ -112,8 +122,11 @@ public final class Entities {
|
||||
* @return true if the type is a Boat type
|
||||
*/
|
||||
public static boolean isBoat(EntityType type) {
|
||||
return switch(type) {
|
||||
case BOAT, CHEST_BOAT -> true;
|
||||
return switch (type) {
|
||||
case OAK_BOAT, DARK_OAK_BOAT, SPRUCE_BOAT, ACACIA_BOAT, CHERRY_BOAT, JUNGLE_BOAT, MANGROVE_BOAT,
|
||||
BIRCH_BOAT, PALE_OAK_BOAT, BAMBOO_RAFT, OAK_CHEST_BOAT, DARK_OAK_CHEST_BOAT, SPRUCE_CHEST_BOAT,
|
||||
ACACIA_CHEST_BOAT, CHERRY_CHEST_BOAT, JUNGLE_CHEST_BOAT, MANGROVE_CHEST_BOAT, BIRCH_CHEST_BOAT,
|
||||
PALE_OAK_CHEST_BOAT, BAMBOO_CHEST_RAFT -> true;
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
@@ -126,8 +139,8 @@ public final class Entities {
|
||||
*/
|
||||
public static boolean isMinecart(EntityType type) {
|
||||
return switch(type) {
|
||||
case MINECART, MINECART_CHEST, MINECART_COMMAND, MINECART_FURNACE,
|
||||
MINECART_HOPPER, MINECART_MOB_SPAWNER, MINECART_TNT -> true;
|
||||
case MINECART, CHEST_MINECART, COMMAND_BLOCK_MINECART, FURNACE_MINECART,
|
||||
HOPPER_MINECART, SPAWNER_MINECART, TNT_MINECART -> true;
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
@@ -230,4 +243,38 @@ public final class Entities {
|
||||
public static boolean isAoECloud(EntityType type) {
|
||||
return type == EntityType.AREA_EFFECT_CLOUD;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the spawn reason should be considered as a "plugin spawning".
|
||||
* This is true for custom creations or the summon command.
|
||||
*
|
||||
* @param spawnReason the reason
|
||||
* @return true if considered plugin spawning
|
||||
*/
|
||||
public static boolean isPluginSpawning(CreatureSpawnEvent.SpawnReason spawnReason) {
|
||||
return switch (spawnReason) {
|
||||
case CUSTOM, COMMAND -> true;
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the explosion flag relevant for an entity type.
|
||||
* @param entity the entity
|
||||
* @return the relevant StateFlag or OTHER_EXPLOSION if none is matching
|
||||
*/
|
||||
public static @Nonnull StateFlag getExplosionFlag(Entity entity) {
|
||||
return switch (entity) {
|
||||
case BreezeWindCharge breezeWindCharge -> Flags.BREEZE_WIND_CHARGE;
|
||||
case WindCharge windCharge -> Flags.WIND_CHARGE_BURST;
|
||||
case Firework firework -> Flags.FIREWORK_DAMAGE;
|
||||
case Fireball fireball -> Flags.GHAST_FIREBALL;
|
||||
case Wither wither -> Flags.WITHER_DAMAGE;
|
||||
case Creeper creeper -> Flags.CREEPER_EXPLOSION;
|
||||
case TNTPrimed tnt -> Flags.TNT;
|
||||
case ExplosiveMinecart minecart -> Flags.TNT;
|
||||
case EnderDragon dragon -> Flags.ENDERDRAGON_BLOCK_DAMAGE;
|
||||
case null, default -> Flags.OTHER_EXPLOSION;
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ import com.google.common.collect.BiMap;
|
||||
import com.google.common.collect.HashBiMap;
|
||||
import com.sk89q.worldguard.protection.flags.Flags;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Registry;
|
||||
import org.bukkit.Tag;
|
||||
import org.bukkit.entity.EntityType;
|
||||
import org.bukkit.potion.PotionEffect;
|
||||
@@ -53,9 +54,9 @@ public final class Materials {
|
||||
private static final Set<PotionEffectType> DAMAGE_EFFECTS = new HashSet<>();
|
||||
|
||||
private static void putMaterialTag(Tag<Material> tag, Integer value) {
|
||||
if (tag == null) return;
|
||||
tag.getValues().forEach(mat -> MATERIAL_FLAGS.put(mat, value));
|
||||
}
|
||||
private static Tag<Material> SIGNS_TAG;
|
||||
|
||||
static {
|
||||
ENTITY_ITEMS.put(EntityType.PAINTING, Material.PAINTING);
|
||||
@@ -63,22 +64,34 @@ public final class Materials {
|
||||
ENTITY_ITEMS.put(EntityType.SNOWBALL, Material.SNOWBALL);
|
||||
ENTITY_ITEMS.put(EntityType.FIREBALL, Material.FIRE_CHARGE);
|
||||
ENTITY_ITEMS.put(EntityType.ENDER_PEARL, Material.ENDER_PEARL);
|
||||
ENTITY_ITEMS.put(EntityType.THROWN_EXP_BOTTLE, Material.EXPERIENCE_BOTTLE);
|
||||
ENTITY_ITEMS.put(EntityType.EXPERIENCE_BOTTLE, Material.EXPERIENCE_BOTTLE);
|
||||
ENTITY_ITEMS.put(EntityType.ITEM_FRAME, Material.ITEM_FRAME);
|
||||
ENTITY_ITEMS.put(EntityType.GLOW_ITEM_FRAME, Material.GLOW_ITEM_FRAME);
|
||||
ENTITY_ITEMS.put(EntityType.PRIMED_TNT, Material.TNT);
|
||||
ENTITY_ITEMS.put(EntityType.FIREWORK, Material.FIREWORK_ROCKET);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART_COMMAND, Material.COMMAND_BLOCK_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.BOAT, Material.OAK_BOAT);
|
||||
ENTITY_ITEMS.put(EntityType.TNT, Material.TNT);
|
||||
ENTITY_ITEMS.put(EntityType.FIREWORK_ROCKET, Material.FIREWORK_ROCKET);
|
||||
ENTITY_ITEMS.put(EntityType.COMMAND_BLOCK_MINECART, Material.COMMAND_BLOCK_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART, Material.MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART_CHEST, Material.CHEST_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART_FURNACE, Material.FURNACE_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART_TNT, Material.TNT_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.MINECART_HOPPER, Material.HOPPER_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.SPLASH_POTION, Material.POTION);
|
||||
ENTITY_ITEMS.put(EntityType.CHEST_MINECART, Material.CHEST_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.FURNACE_MINECART, Material.FURNACE_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.TNT_MINECART, Material.TNT_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.HOPPER_MINECART, Material.HOPPER_MINECART);
|
||||
ENTITY_ITEMS.put(EntityType.POTION, Material.POTION);
|
||||
ENTITY_ITEMS.put(EntityType.EGG, Material.EGG);
|
||||
ENTITY_ITEMS.put(EntityType.ARMOR_STAND, Material.ARMOR_STAND);
|
||||
ENTITY_ITEMS.put(EntityType.ENDER_CRYSTAL, Material.END_CRYSTAL);
|
||||
ENTITY_ITEMS.put(EntityType.END_CRYSTAL, Material.END_CRYSTAL);
|
||||
|
||||
for (String wood : new String[]{"OAK", "SPRUCE", "BIRCH", "JUNGLE", "ACACIA", "DARK_OAK", "MANGROVE", "CHERRY", "PALE_OAK"}) {
|
||||
String regular = wood + "_BOAT";
|
||||
String chest = wood + "_CHEST_BOAT";
|
||||
ENTITY_ITEMS.put(EntityType.valueOf(regular), Material.getMaterial(regular));
|
||||
ENTITY_ITEMS.put(EntityType.valueOf(chest), Material.getMaterial(chest));
|
||||
}
|
||||
ENTITY_ITEMS.put(EntityType.BAMBOO_RAFT, Material.BAMBOO_RAFT);
|
||||
ENTITY_ITEMS.put(EntityType.BAMBOO_CHEST_RAFT, Material.BAMBOO_CHEST_RAFT);
|
||||
|
||||
// preset some tags to a default value, override some of them:
|
||||
putMaterialTag(Tag.DOORS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.TRAPDOORS, MODIFIED_ON_RIGHT);
|
||||
|
||||
MATERIAL_FLAGS.put(Material.AIR, 0);
|
||||
MATERIAL_FLAGS.put(Material.STONE, 0);
|
||||
@@ -100,7 +113,7 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.DETECTOR_RAIL, 0);
|
||||
MATERIAL_FLAGS.put(Material.STICKY_PISTON, 0);
|
||||
MATERIAL_FLAGS.put(Material.COBWEB, 0);
|
||||
MATERIAL_FLAGS.put(Material.GRASS, 0);
|
||||
MATERIAL_FLAGS.put(Material.SHORT_GRASS, 0);
|
||||
MATERIAL_FLAGS.put(Material.DEAD_BUSH, 0);
|
||||
MATERIAL_FLAGS.put(Material.PISTON, 0);
|
||||
MATERIAL_FLAGS.put(Material.PISTON_HEAD, 0);
|
||||
@@ -150,12 +163,6 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.CAKE, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.REPEATER, MODIFIED_ON_RIGHT);
|
||||
// MATERIAL_FLAGS.put(Material.STAINED_GLASS, 0);
|
||||
MATERIAL_FLAGS.put(Material.ACACIA_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.BIRCH_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.DARK_OAK_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.JUNGLE_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.OAK_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.SPRUCE_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.INFESTED_STONE, 0);
|
||||
MATERIAL_FLAGS.put(Material.INFESTED_STONE_BRICKS, 0);
|
||||
MATERIAL_FLAGS.put(Material.INFESTED_MOSSY_STONE_BRICKS, 0);
|
||||
@@ -227,11 +234,6 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.IRON_TRAPDOOR, 0);
|
||||
MATERIAL_FLAGS.put(Material.RED_SANDSTONE, 0);
|
||||
MATERIAL_FLAGS.put(Material.RED_SANDSTONE_STAIRS, 0);
|
||||
MATERIAL_FLAGS.put(Material.SPRUCE_DOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.BIRCH_DOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.JUNGLE_DOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.ACACIA_DOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.DARK_OAK_DOOR, MODIFIED_ON_RIGHT);
|
||||
|
||||
MATERIAL_FLAGS.put(Material.DIRT_PATH, 0);
|
||||
MATERIAL_FLAGS.put(Material.CHORUS_PLANT, 0);
|
||||
@@ -247,7 +249,7 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.PURPUR_SLAB, 0);
|
||||
MATERIAL_FLAGS.put(Material.STRUCTURE_BLOCK, MODIFIED_ON_LEFT | MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.REPEATING_COMMAND_BLOCK, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.CHAIN_COMMAND_BLOCK , MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.CHAIN_COMMAND_BLOCK, MODIFIED_ON_RIGHT);
|
||||
|
||||
MATERIAL_FLAGS.put(Material.MAGMA_BLOCK, 0);
|
||||
MATERIAL_FLAGS.put(Material.NETHER_WART_BLOCK, 0);
|
||||
@@ -641,7 +643,7 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.PUFFERFISH_BUCKET, 0);
|
||||
MATERIAL_FLAGS.put(Material.SALMON, 0);
|
||||
MATERIAL_FLAGS.put(Material.SALMON_BUCKET, 0);
|
||||
MATERIAL_FLAGS.put(Material.SCUTE, 0);
|
||||
MATERIAL_FLAGS.put(Material.TURTLE_SCUTE, 0);
|
||||
MATERIAL_FLAGS.put(Material.SPLASH_POTION, 0);
|
||||
MATERIAL_FLAGS.put(Material.TURTLE_HELMET, 0);
|
||||
MATERIAL_FLAGS.put(Material.TRIDENT, 0);
|
||||
@@ -677,7 +679,6 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.CRIMSON_FUNGUS, 0);
|
||||
MATERIAL_FLAGS.put(Material.CRIMSON_NYLIUM, 0);
|
||||
MATERIAL_FLAGS.put(Material.CRIMSON_ROOTS, 0);
|
||||
MATERIAL_FLAGS.put(Material.CRIMSON_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.CRYING_OBSIDIAN, 0);
|
||||
MATERIAL_FLAGS.put(Material.GILDED_BLACKSTONE, 0);
|
||||
MATERIAL_FLAGS.put(Material.LODESTONE, 0);
|
||||
@@ -718,7 +719,6 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.WARPED_FUNGUS_ON_A_STICK, 0);
|
||||
MATERIAL_FLAGS.put(Material.WARPED_NYLIUM, 0);
|
||||
MATERIAL_FLAGS.put(Material.WARPED_ROOTS, 0);
|
||||
MATERIAL_FLAGS.put(Material.WARPED_TRAPDOOR, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.WARPED_WART_BLOCK, 0);
|
||||
MATERIAL_FLAGS.put(Material.WEEPING_VINES, 0);
|
||||
MATERIAL_FLAGS.put(Material.WEEPING_VINES_PLANT, 0);
|
||||
@@ -820,22 +820,73 @@ public final class Materials {
|
||||
MATERIAL_FLAGS.put(Material.ECHO_SHARD, 0);
|
||||
MATERIAL_FLAGS.put(Material.REINFORCED_DEEPSLATE, 0);
|
||||
|
||||
// 1.19.3: Try to register those things
|
||||
try {
|
||||
SIGNS_TAG = Tag.ALL_SIGNS;
|
||||
MATERIAL_FLAGS.put(Material.BAMBOO_MOSAIC, 0);
|
||||
MATERIAL_FLAGS.put(Material.BAMBOO_BLOCK, 0);
|
||||
MATERIAL_FLAGS.put(Material.STRIPPED_BAMBOO_BLOCK, 0);
|
||||
MATERIAL_FLAGS.put(Material.SUSPICIOUS_SAND, 0);
|
||||
MATERIAL_FLAGS.put(Material.SUSPICIOUS_GRAVEL, 0);
|
||||
MATERIAL_FLAGS.put(Material.PITCHER_PLANT, 0);
|
||||
MATERIAL_FLAGS.put(Material.CHISELED_BOOKSHELF, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.DECORATED_POT, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.BRUSH, 0);
|
||||
MATERIAL_FLAGS.put(Material.SNIFFER_EGG, 0);
|
||||
MATERIAL_FLAGS.put(Material.CALIBRATED_SCULK_SENSOR, 0);
|
||||
MATERIAL_FLAGS.put(Material.PIGLIN_HEAD, 0);
|
||||
MATERIAL_FLAGS.put(Material.PIGLIN_WALL_HEAD, 0);
|
||||
MATERIAL_FLAGS.put(Material.TORCHFLOWER_SEEDS, 0);
|
||||
MATERIAL_FLAGS.put(Material.TORCHFLOWER_CROP, 0);
|
||||
MATERIAL_FLAGS.put(Material.PITCHER_CROP, 0);
|
||||
MATERIAL_FLAGS.put(Material.PINK_PETALS, 0);
|
||||
MATERIAL_FLAGS.put(Material.PITCHER_POD, 0);
|
||||
MATERIAL_FLAGS.put(Material.NETHERITE_UPGRADE_SMITHING_TEMPLATE, 0);
|
||||
|
||||
MATERIAL_FLAGS.put(Material.BAMBOO_MOSAIC, 0);
|
||||
MATERIAL_FLAGS.put(Material.BAMBOO_BLOCK, 0);
|
||||
MATERIAL_FLAGS.put(Material.STRIPPED_BAMBOO_BLOCK, 0);
|
||||
} catch (NoSuchFieldError ignored) {
|
||||
SIGNS_TAG = Tag.SIGNS;
|
||||
}
|
||||
MATERIAL_FLAGS.put(Material.ARMADILLO_SCUTE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WOLF_ARMOR, 0);
|
||||
|
||||
// 1.21
|
||||
MATERIAL_FLAGS.put(Material.CHISELED_TUFF, 0);
|
||||
MATERIAL_FLAGS.put(Material.POLISHED_TUFF, 0);
|
||||
MATERIAL_FLAGS.put(Material.TUFF_BRICKS, 0);
|
||||
MATERIAL_FLAGS.put(Material.CHISELED_TUFF_BRICKS, 0);
|
||||
MATERIAL_FLAGS.put(Material.HEAVY_CORE, 0);
|
||||
MATERIAL_FLAGS.put(Material.CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.EXPOSED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.WEATHERED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.OXIDIZED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_EXPOSED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_WEATHERED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_OXIDIZED_CHISELED_COPPER, 0);
|
||||
MATERIAL_FLAGS.put(Material.CRAFTER, 0);
|
||||
MATERIAL_FLAGS.put(Material.FLOW_BANNER_PATTERN, 0);
|
||||
MATERIAL_FLAGS.put(Material.GUSTER_BANNER_PATTERN, 0);
|
||||
MATERIAL_FLAGS.put(Material.COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WEATHERED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.EXPOSED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.OXIDIZED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_WEATHERED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_EXPOSED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_OXIDIZED_COPPER_GRATE, 0);
|
||||
MATERIAL_FLAGS.put(Material.COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.WEATHERED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.EXPOSED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.OXIDIZED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_WEATHERED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_EXPOSED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.WAXED_OXIDIZED_COPPER_BULB, 0);
|
||||
MATERIAL_FLAGS.put(Material.TRIAL_SPAWNER, 0);
|
||||
MATERIAL_FLAGS.put(Material.TRIAL_KEY, 0);
|
||||
MATERIAL_FLAGS.put(Material.OMINOUS_TRIAL_KEY, 0);
|
||||
MATERIAL_FLAGS.put(Material.VAULT, MODIFIED_ON_RIGHT);
|
||||
MATERIAL_FLAGS.put(Material.OMINOUS_BOTTLE, 0);
|
||||
MATERIAL_FLAGS.put(Material.BREEZE_ROD, 0);
|
||||
MATERIAL_FLAGS.put(Material.WIND_CHARGE, 0);
|
||||
|
||||
// Generated via tag
|
||||
putMaterialTag(Tag.WOODEN_DOORS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.WOODEN_TRAPDOORS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.SHULKER_BOXES, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.ITEMS_BOATS, 0);
|
||||
putMaterialTag(Tag.ITEMS_CHEST_BOATS, 0);
|
||||
putMaterialTag(Tag.BANNERS, 0);
|
||||
putMaterialTag(Tag.SLABS, 0);
|
||||
putMaterialTag(Tag.PLANKS, 0);
|
||||
@@ -849,10 +900,9 @@ public final class Materials {
|
||||
putMaterialTag(Tag.BUTTONS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.FLOWER_POTS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.WALLS, 0);
|
||||
putMaterialTag(SIGNS_TAG, 0);
|
||||
putMaterialTag(Tag.ALL_SIGNS, 0);
|
||||
putMaterialTag(Tag.SMALL_FLOWERS, 0);
|
||||
putMaterialTag(Tag.BEDS, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.ITEMS_MUSIC_DISCS, 0);
|
||||
putMaterialTag(Tag.ITEMS_BANNERS, 0);
|
||||
putMaterialTag(Tag.FENCE_GATES, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.FENCES, 0);
|
||||
@@ -869,6 +919,10 @@ public final class Materials {
|
||||
putMaterialTag(Tag.CANDLE_CAKES, MODIFIED_ON_RIGHT);
|
||||
putMaterialTag(Tag.CAULDRONS, MODIFIED_ON_RIGHT);
|
||||
|
||||
// 1.20
|
||||
putMaterialTag(Tag.ITEMS_TRIM_TEMPLATES, 0);
|
||||
putMaterialTag(Tag.ITEMS_DECORATED_POT_SHERDS, 0);
|
||||
|
||||
Stream.concat(Stream.concat(
|
||||
Tag.CORAL_BLOCKS.getValues().stream(),
|
||||
Tag.CORALS.getValues().stream()),
|
||||
@@ -881,29 +935,30 @@ public final class Materials {
|
||||
});
|
||||
|
||||
// Check for missing items/blocks
|
||||
for (Material material : Material.values()) {
|
||||
//noinspection deprecation
|
||||
if (material.isLegacy()) continue;
|
||||
Registry.MATERIAL.stream().forEach(material -> {
|
||||
// Add spawn eggs
|
||||
if (isSpawnEgg(material)) {
|
||||
MATERIAL_FLAGS.put(material, 0);
|
||||
}
|
||||
if (material.name().startsWith("MUSIC_DISC_")) {
|
||||
MATERIAL_FLAGS.put(material, 0);
|
||||
}
|
||||
if (!MATERIAL_FLAGS.containsKey(material)) {
|
||||
logger.fine("Missing material definition for " + (material.isBlock() ? "block " : "item ") + material.name());
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.SPEED);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.SLOW);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.FAST_DIGGING);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.SLOW_DIGGING);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.INCREASE_DAMAGE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.HEAL);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.HARM);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.JUMP);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.CONFUSION);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.SLOWNESS);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.HASTE);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.MINING_FATIGUE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.STRENGTH);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.INSTANT_HEALTH);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.INSTANT_DAMAGE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.JUMP_BOOST);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.NAUSEA);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.REGENERATION);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.DAMAGE_RESISTANCE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.RESISTANCE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.FIRE_RESISTANCE);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.WATER_BREATHING);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.INVISIBILITY);
|
||||
@@ -926,6 +981,11 @@ public final class Materials {
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.BAD_OMEN);
|
||||
// DAMAGE_EFFECTS.add(PotionEffectType.HERO_OF_THE_VILLAGE);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.DARKNESS);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.TRIAL_OMEN);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.WIND_CHARGED);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.WEAVING);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.OOZING);
|
||||
DAMAGE_EFFECTS.add(PotionEffectType.INFESTED);
|
||||
}
|
||||
|
||||
private Materials() {
|
||||
@@ -967,13 +1027,11 @@ public final class Materials {
|
||||
* @return the block material
|
||||
*/
|
||||
public static Material getBucketBlockMaterial(Material type) {
|
||||
switch (type) {
|
||||
case LAVA_BUCKET:
|
||||
return Material.LAVA;
|
||||
case WATER_BUCKET:
|
||||
default:
|
||||
return Material.WATER;
|
||||
}
|
||||
return switch (type) {
|
||||
case LAVA_BUCKET -> Material.LAVA;
|
||||
case WATER_BUCKET -> Material.WATER;
|
||||
default -> Material.WATER;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1113,6 +1171,8 @@ public final class Materials {
|
||||
|| material == Material.BARREL
|
||||
|| material == Material.BLAST_FURNACE
|
||||
|| material == Material.SMOKER
|
||||
|| material == Material.CHISELED_BOOKSHELF
|
||||
|| material == Material.CRAFTER
|
||||
|| Tag.ITEMS_CHEST_BOATS.isTagged(material)
|
||||
|| Tag.SHULKER_BOXES.isTagged(material);
|
||||
}
|
||||
@@ -1124,11 +1184,13 @@ public final class Materials {
|
||||
public static EntityType getEntitySpawnEgg(Material material) {
|
||||
return switch (material) {
|
||||
case ALLAY_SPAWN_EGG -> EntityType.ALLAY;
|
||||
case ARMADILLO_SPAWN_EGG -> EntityType.ARMADILLO;
|
||||
case AXOLOTL_SPAWN_EGG -> EntityType.AXOLOTL;
|
||||
case SPIDER_SPAWN_EGG -> EntityType.SPIDER;
|
||||
case BAT_SPAWN_EGG -> EntityType.BAT;
|
||||
case BEE_SPAWN_EGG -> EntityType.BEE;
|
||||
case BLAZE_SPAWN_EGG -> EntityType.BLAZE;
|
||||
case BOGGED_SPAWN_EGG -> EntityType.BOGGED;
|
||||
case BREEZE_SPAWN_EGG -> EntityType.BREEZE;
|
||||
case CAT_SPAWN_EGG -> EntityType.CAT;
|
||||
case CAMEL_SPAWN_EGG -> EntityType.CAMEL;
|
||||
case CAVE_SPIDER_SPAWN_EGG -> EntityType.CAVE_SPIDER;
|
||||
@@ -1156,7 +1218,7 @@ public final class Materials {
|
||||
case IRON_GOLEM_SPAWN_EGG -> EntityType.IRON_GOLEM;
|
||||
case LLAMA_SPAWN_EGG -> EntityType.LLAMA;
|
||||
case MAGMA_CUBE_SPAWN_EGG -> EntityType.MAGMA_CUBE;
|
||||
case MOOSHROOM_SPAWN_EGG -> EntityType.MUSHROOM_COW;
|
||||
case MOOSHROOM_SPAWN_EGG -> EntityType.MOOSHROOM;
|
||||
case MULE_SPAWN_EGG -> EntityType.MULE;
|
||||
case OCELOT_SPAWN_EGG -> EntityType.OCELOT;
|
||||
case PANDA_SPAWN_EGG -> EntityType.PANDA;
|
||||
@@ -1176,7 +1238,9 @@ public final class Materials {
|
||||
case SKELETON_HORSE_SPAWN_EGG -> EntityType.SKELETON_HORSE;
|
||||
case SKELETON_SPAWN_EGG -> EntityType.SKELETON;
|
||||
case SLIME_SPAWN_EGG -> EntityType.SLIME;
|
||||
case SNOW_GOLEM_SPAWN_EGG -> EntityType.SNOWMAN;
|
||||
case SNIFFER_SPAWN_EGG -> EntityType.SNIFFER;
|
||||
case SNOW_GOLEM_SPAWN_EGG -> EntityType.SNOW_GOLEM;
|
||||
case SPIDER_SPAWN_EGG -> EntityType.SPIDER;
|
||||
case SQUID_SPAWN_EGG -> EntityType.SQUID;
|
||||
case STRAY_SPAWN_EGG -> EntityType.STRAY;
|
||||
case STRIDER_SPAWN_EGG -> EntityType.STRIDER;
|
||||
@@ -1260,15 +1324,15 @@ public final class Materials {
|
||||
*/
|
||||
public static boolean isUseFlagApplicable(Material material) {
|
||||
if (Tag.BUTTONS.isTagged(material)
|
||||
|| Tag.WOODEN_DOORS.isTagged(material)
|
||||
|| Tag.WOODEN_TRAPDOORS.isTagged(material)
|
||||
|| Tag.DOORS.isTagged(material)
|
||||
|| Tag.TRAPDOORS.isTagged(material)
|
||||
|| Tag.FENCE_GATES.isTagged(material)
|
||||
|| Tag.PRESSURE_PLATES.isTagged(material)) {
|
||||
return true;
|
||||
}
|
||||
return switch (material) {
|
||||
case LEVER, LECTERN, ENCHANTING_TABLE, BELL, LOOM,
|
||||
CARTOGRAPHY_TABLE, STONECUTTER, GRINDSTONE -> true;
|
||||
CARTOGRAPHY_TABLE, STONECUTTER, GRINDSTONE, VAULT -> true;
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
@@ -1320,7 +1384,8 @@ public final class Materials {
|
||||
|| type == Material.DRAGON_EGG
|
||||
|| Tag.FLOWER_POTS.isTagged(type)
|
||||
|| Tag.CANDLES.isTagged(type)
|
||||
|| Tag.CANDLE_CAKES.isTagged(type);
|
||||
|| Tag.CANDLE_CAKES.isTagged(type)
|
||||
|| Tag.ALL_SIGNS.isTagged(type);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1350,15 +1415,13 @@ public final class Materials {
|
||||
* @return true if equippable armor
|
||||
*/
|
||||
public static boolean isArmor(Material type) {
|
||||
if (Tag.ITEMS_HEAD_ARMOR.isTagged(type) || Tag.ITEMS_CHEST_ARMOR.isTagged(type) ||
|
||||
Tag.ITEMS_LEG_ARMOR.isTagged(type) || Tag.ITEMS_FOOT_ARMOR.isTagged(type) ||
|
||||
Tag.ITEMS_SKULLS.isTagged(type)) {
|
||||
return true;
|
||||
}
|
||||
return switch (type) {
|
||||
case LEATHER_HELMET, LEATHER_CHESTPLATE, LEATHER_LEGGINGS, LEATHER_BOOTS,
|
||||
CHAINMAIL_HELMET, CHAINMAIL_CHESTPLATE, CHAINMAIL_LEGGINGS, CHAINMAIL_BOOTS,
|
||||
IRON_HELMET, IRON_CHESTPLATE, IRON_LEGGINGS, IRON_BOOTS,
|
||||
DIAMOND_HELMET, DIAMOND_CHESTPLATE, DIAMOND_LEGGINGS, DIAMOND_BOOTS,
|
||||
GOLDEN_HELMET, GOLDEN_CHESTPLATE, GOLDEN_LEGGINGS, GOLDEN_BOOTS,
|
||||
NETHERITE_HELMET, NETHERITE_CHESTPLATE, NETHERITE_LEGGINGS, NETHERITE_BOOTS,
|
||||
TURTLE_HELMET, ELYTRA ->
|
||||
true;
|
||||
case CARVED_PUMPKIN, ELYTRA -> true;
|
||||
default -> false;
|
||||
};
|
||||
}
|
||||
@@ -1433,9 +1496,17 @@ public final class Materials {
|
||||
case YELLOW_DYE:
|
||||
case GLOW_INK_SAC:
|
||||
case INK_SAC:
|
||||
return SIGNS_TAG.isTagged(targetMaterial);
|
||||
return Tag.ALL_SIGNS.isTagged(targetMaterial);
|
||||
case HONEYCOMB:
|
||||
return isUnwaxedCopper(targetMaterial);
|
||||
return isUnwaxedCopper(targetMaterial) || Tag.ALL_SIGNS.isTagged(targetMaterial);
|
||||
case BRUSH:
|
||||
return switch (targetMaterial) {
|
||||
case SUSPICIOUS_GRAVEL, SUSPICIOUS_SAND -> true;
|
||||
default -> false;
|
||||
};
|
||||
case WRITTEN_BOOK:
|
||||
case WRITABLE_BOOK:
|
||||
return targetMaterial == Material.LECTERN;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
@@ -1444,27 +1515,18 @@ public final class Materials {
|
||||
public static boolean isFire(Material type) {
|
||||
return type == Material.FIRE || type == Material.SOUL_FIRE;
|
||||
}
|
||||
|
||||
|
||||
public static boolean isWaxedCopper(Material type) {
|
||||
return switch (type) {
|
||||
case WAXED_COPPER_BLOCK, WAXED_EXPOSED_COPPER, WAXED_WEATHERED_COPPER, WAXED_OXIDIZED_COPPER,
|
||||
WAXED_CUT_COPPER, WAXED_EXPOSED_CUT_COPPER, WAXED_WEATHERED_CUT_COPPER,
|
||||
WAXED_OXIDIZED_CUT_COPPER, WAXED_CUT_COPPER_STAIRS, WAXED_EXPOSED_CUT_COPPER_STAIRS,
|
||||
WAXED_WEATHERED_CUT_COPPER_STAIRS, WAXED_OXIDIZED_CUT_COPPER_STAIRS, WAXED_CUT_COPPER_SLAB,
|
||||
WAXED_EXPOSED_CUT_COPPER_SLAB, WAXED_WEATHERED_CUT_COPPER_SLAB, WAXED_OXIDIZED_CUT_COPPER_SLAB ->
|
||||
true;
|
||||
default -> false;
|
||||
};
|
||||
// copied from the MaterialTags class in Paper
|
||||
return type.name().startsWith("WAXED_") && type.name().contains("COPPER");
|
||||
}
|
||||
|
||||
|
||||
public static boolean isUnwaxedCopper(Material type) {
|
||||
// copied from the MaterialTags class in Paper
|
||||
return switch (type) {
|
||||
case COPPER_BLOCK, EXPOSED_COPPER, WEATHERED_COPPER, OXIDIZED_COPPER, CUT_COPPER,
|
||||
EXPOSED_CUT_COPPER, WEATHERED_CUT_COPPER, OXIDIZED_CUT_COPPER, CUT_COPPER_STAIRS,
|
||||
EXPOSED_CUT_COPPER_STAIRS, WEATHERED_CUT_COPPER_STAIRS, OXIDIZED_CUT_COPPER_STAIRS,
|
||||
CUT_COPPER_SLAB, EXPOSED_CUT_COPPER_SLAB, WEATHERED_CUT_COPPER_SLAB, OXIDIZED_CUT_COPPER_SLAB ->
|
||||
true;
|
||||
default -> false;
|
||||
case COPPER_BLOCK, CHISELED_COPPER, COPPER_DOOR, COPPER_TRAPDOOR, COPPER_GRATE, COPPER_BULB -> true;
|
||||
default -> type.name().startsWith("EXPOSED_") || type.name().startsWith("WEATHERED_") ||
|
||||
type.name().startsWith("OXIDIZED_") || type.name().startsWith("CUT_COPPER");
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -3,4 +3,4 @@ main: com.sk89q.worldguard.bukkit.WorldGuardPlugin
|
||||
version: "${internalVersion}"
|
||||
depend: [WorldEdit]
|
||||
softdepend: [CommandBook]
|
||||
api-version: 1.19
|
||||
api-version: "1.21"
|
||||
@@ -1,20 +1,51 @@
|
||||
import org.cadixdev.gradle.licenser.LicenseExtension
|
||||
|
||||
plugins {
|
||||
`java-library`
|
||||
id("buildlogic.core-and-platform")
|
||||
}
|
||||
|
||||
applyPlatformAndCoreConfiguration()
|
||||
|
||||
dependencies {
|
||||
"api"(project(":worldguard-libs:core"))
|
||||
"api"("com.sk89q.worldedit:worldedit-core:${Versions.WORLDEDIT}")
|
||||
"implementation"("org.flywaydb:flyway-core:3.0")
|
||||
"implementation"("org.yaml:snakeyaml:1.33")
|
||||
"implementation"("com.google.guava:guava:${Versions.GUAVA}")
|
||||
constraints {
|
||||
"implementation"(libs.snakeyaml) {
|
||||
because("Bukkit provides SnakeYaml")
|
||||
}
|
||||
}
|
||||
|
||||
"compileOnly"("com.google.code.findbugs:jsr305:${Versions.FINDBUGS}")
|
||||
"testImplementation"("org.hamcrest:hamcrest-library:2.2")
|
||||
"api"(project(":worldguard-libs:core"))
|
||||
"api"(libs.worldedit.core)
|
||||
"implementation"(libs.flyway.core)
|
||||
"implementation"(libs.snakeyaml)
|
||||
"implementation"(libs.guava)
|
||||
"compileOnlyApi"(libs.jsr305)
|
||||
"implementation"(libs.gson)
|
||||
|
||||
"compileOnly"(libs.worldedit.libs.ap)
|
||||
"annotationProcessor"(libs.worldedit.libs.ap)
|
||||
// ensure this is on the classpath for the AP
|
||||
"annotationProcessor"(libs.guava)
|
||||
|
||||
"compileOnly"(libs.autoService) {
|
||||
because("Needed to resolve annotations in Piston")
|
||||
}
|
||||
|
||||
"testImplementation"(libs.hamcrest.library)
|
||||
}
|
||||
|
||||
tasks.withType<JavaCompile>().configureEach {
|
||||
tasks.compileJava {
|
||||
dependsOn(":worldguard-libs:build")
|
||||
}
|
||||
options.compilerArgs.add("-Aarg.name.key.prefix=")
|
||||
}
|
||||
|
||||
configure<LicenseExtension> {
|
||||
exclude {
|
||||
it.file.startsWith(project.layout.buildDirectory.get().asFile)
|
||||
}
|
||||
}
|
||||
|
||||
configure<PublishingExtension> {
|
||||
publications.named<MavenPublication>("maven") {
|
||||
artifactId = the<BasePluginExtension>().archivesName.get()
|
||||
from(components["java"])
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -95,9 +95,9 @@ public class DatabaseHandler implements LoggerHandler {
|
||||
stmt.setString(1, eventType.name());
|
||||
stmt.setString(2, worldName);
|
||||
stmt.setString(3, player != null ? player.getName() : "");
|
||||
stmt.setInt(4, pos.getBlockX());
|
||||
stmt.setInt(5, pos.getBlockY());
|
||||
stmt.setInt(6, pos.getBlockZ());
|
||||
stmt.setInt(4, pos.x());
|
||||
stmt.setInt(5, pos.y());
|
||||
stmt.setInt(6, pos.z());
|
||||
stmt.setString(7, item);
|
||||
stmt.setInt(8, (int)(System.currentTimeMillis() / 1000));
|
||||
stmt.setString(9, comment);
|
||||
|
||||
+1
-1
@@ -221,7 +221,7 @@ public class FileHandler implements LoggerHandler {
|
||||
* @return The position's coordinates in human-readable form
|
||||
*/
|
||||
private String getCoordinates(BlockVector3 pos) {
|
||||
return "@" + pos.getBlockX() + "," + pos.getBlockY() + "," + pos.getBlockZ();
|
||||
return "@" + pos.x() + "," + pos.y() + "," + pos.z();
|
||||
}
|
||||
|
||||
private void logEvent(BlacklistEvent event, String text, Target target, BlockVector3 pos, String comment) {
|
||||
|
||||
@@ -70,7 +70,7 @@ public class GeneralCommands {
|
||||
|
||||
// Keep track of this
|
||||
included = true;
|
||||
} else {
|
||||
} else if (!args.hasFlag('s')) {
|
||||
player.print("God enabled by " + sender.getDisplayName() + ".");
|
||||
|
||||
}
|
||||
@@ -79,7 +79,7 @@ public class GeneralCommands {
|
||||
|
||||
// The player didn't receive any items, then we need to send the
|
||||
// user a message so s/he know that something is indeed working
|
||||
if (!included && args.hasFlag('s')) {
|
||||
if (!included) {
|
||||
sender.print("Players now have god mode.");
|
||||
}
|
||||
}
|
||||
@@ -113,7 +113,7 @@ public class GeneralCommands {
|
||||
|
||||
// Keep track of this
|
||||
included = true;
|
||||
} else {
|
||||
} else if (!args.hasFlag('s')) {
|
||||
player.print("God disabled by " + sender.getDisplayName() + ".");
|
||||
|
||||
}
|
||||
@@ -122,7 +122,7 @@ public class GeneralCommands {
|
||||
|
||||
// The player didn't receive any items, then we need to send the
|
||||
// user a message so s/he know that something is indeed working
|
||||
if (!included && args.hasFlag('s')) {
|
||||
if (!included) {
|
||||
sender.print("Players no longer have god mode.");
|
||||
}
|
||||
}
|
||||
@@ -158,7 +158,7 @@ public class GeneralCommands {
|
||||
|
||||
// Keep track of this
|
||||
included = true;
|
||||
} else {
|
||||
} else if (!args.hasFlag('s')) {
|
||||
player.print("Healed by " + sender.getDisplayName() + ".");
|
||||
|
||||
}
|
||||
@@ -166,7 +166,7 @@ public class GeneralCommands {
|
||||
|
||||
// The player didn't receive any items, then we need to send the
|
||||
// user a message so s/he know that something is indeed working
|
||||
if (!included && args.hasFlag('s')) {
|
||||
if (!included) {
|
||||
sender.print("Players healed.");
|
||||
}
|
||||
}
|
||||
@@ -199,7 +199,7 @@ public class GeneralCommands {
|
||||
|
||||
// Keep track of this
|
||||
included = true;
|
||||
} else {
|
||||
} else if (!args.hasFlag('s')) {
|
||||
player.print("Slain by " + sender.getDisplayName() + ".");
|
||||
|
||||
}
|
||||
@@ -207,7 +207,7 @@ public class GeneralCommands {
|
||||
|
||||
// The player didn't receive any items, then we need to send the
|
||||
// user a message so s/he know that something is indeed working
|
||||
if (!included && args.hasFlag('s')) {
|
||||
if (!included) {
|
||||
sender.print("Players slain.");
|
||||
}
|
||||
}
|
||||
@@ -229,6 +229,7 @@ public class GeneralCommands {
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("removal")
|
||||
@Command(aliases = {"stack", ";"}, usage = "", desc = "Stack items", max = 0)
|
||||
@CommandPermissions({"worldguard.stack"})
|
||||
public void stack(CommandContext args, Actor sender) throws CommandException {
|
||||
|
||||
+1
-1
@@ -378,7 +378,7 @@ class FlagHelperBox extends PaginationBox {
|
||||
if (currVal == null) {
|
||||
currVal = getInheritedValue(region, flag);
|
||||
}
|
||||
String display = currVal == null ? regName : currVal.getId();
|
||||
String display = currVal == null ? regName : currVal.id();
|
||||
appendValueText(builder, flag, display, null);
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -308,8 +308,8 @@ class RegionCommandsBase {
|
||||
// Detect the type of region from WorldEdit
|
||||
if (selection instanceof Polygonal2DRegion) {
|
||||
Polygonal2DRegion polySel = (Polygonal2DRegion) selection;
|
||||
int minY = polySel.getMinimumPoint().getBlockY();
|
||||
int maxY = polySel.getMaximumPoint().getBlockY();
|
||||
int minY = polySel.getMinimumPoint().y();
|
||||
int maxY = polySel.getMaximumPoint().y();
|
||||
return new ProtectedPolygonalRegion(id, polySel.getPoints(), minY, maxY);
|
||||
} else if (selection instanceof CuboidRegion) {
|
||||
BlockVector3 min = selection.getMinimumPoint();
|
||||
@@ -348,7 +348,7 @@ class RegionCommandsBase {
|
||||
if (region instanceof GlobalProtectedRegion) {
|
||||
return;
|
||||
}
|
||||
int height = region.getMaximumPoint().getBlockY() - region.getMinimumPoint().getBlockY();
|
||||
int height = region.getMaximumPoint().y() - region.getMinimumPoint().y();
|
||||
if (height <= 2) {
|
||||
sender.printDebug("(Warning: The height of the region was " + (height + 1) + " block(s).)");
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ public abstract class WorldConfiguration {
|
||||
public boolean blockEnderDragonPortalCreation;
|
||||
public boolean blockFireballExplosions;
|
||||
public boolean blockFireballBlockDamage;
|
||||
public boolean blockWindChargeExplosions;
|
||||
public boolean blockOtherExplosions;
|
||||
public boolean blockEntityPaintingDestroy;
|
||||
public boolean blockEntityItemFrameDestroy;
|
||||
@@ -139,6 +140,8 @@ public abstract class WorldConfiguration {
|
||||
public boolean disablePlayerCropTrampling;
|
||||
public boolean disableCreatureTurtleEggTrampling;
|
||||
public boolean disablePlayerTurtleEggTrampling;
|
||||
public boolean disableCreatureSnifferEggTrampling;
|
||||
public boolean disablePlayerSnifferEggTrampling;
|
||||
public boolean preventLightningFire;
|
||||
public Set<String> disallowedLightningBlocks;
|
||||
public boolean disableThunder;
|
||||
@@ -164,6 +167,7 @@ public abstract class WorldConfiguration {
|
||||
public boolean disableEndermanGriefing;
|
||||
public boolean disableSnowmanTrails;
|
||||
public boolean disableSoilDehydration;
|
||||
public boolean disableSoilMoistureChange;
|
||||
public boolean disableCoralBlockFade;
|
||||
public boolean disableCopperBlockFade;
|
||||
public Set<String> allowedSnowFallOver;
|
||||
|
||||
+1
@@ -145,6 +145,7 @@ public interface WorldGuardPlatform {
|
||||
*
|
||||
* @param localPlayer The player
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
void stackPlayerInventory(LocalPlayer localPlayer);
|
||||
|
||||
/**
|
||||
|
||||
+1
-1
@@ -57,6 +57,6 @@ public class EntityTypeFlag extends Flag<EntityType> {
|
||||
|
||||
@Override
|
||||
public Object marshal(EntityType o) {
|
||||
return o.getId();
|
||||
return o.id();
|
||||
}
|
||||
}
|
||||
@@ -66,6 +66,7 @@ public final class Flags {
|
||||
public static final StateFlag CHEST_ACCESS = register(new StateFlag("chest-access", false));
|
||||
public static final StateFlag PLACE_VEHICLE = register(new StateFlag("vehicle-place", false));
|
||||
public static final StateFlag DESTROY_VEHICLE = register(new StateFlag("vehicle-destroy", false));
|
||||
public static final StateFlag DAMAGE_VEHICLE = register(new StateFlag("vehicle-damage", false));
|
||||
public static final StateFlag LIGHTER = register(new StateFlag("lighter", false));
|
||||
public static final StateFlag RIDE = register(new StateFlag("ride", false));
|
||||
public static final StateFlag POTION_SPLASH = register(new StateFlag("potion-splash", false));
|
||||
@@ -74,6 +75,7 @@ public final class Flags {
|
||||
public static final StateFlag FIREWORK_DAMAGE = register(new StateFlag("firework-damage", false));
|
||||
public static final StateFlag USE_ANVIL = register(new StateFlag("use-anvil", false));
|
||||
public static final StateFlag USE_DRIPLEAF = register(new StateFlag("use-dripleaf", false));
|
||||
public static final StateFlag WIND_CHARGE_BURST = register(new StateFlag("wind-charge-burst", false));
|
||||
|
||||
// These flags are similar to the ones above (used in tandem with BUILD),
|
||||
// but their defaults are set to TRUE because it is more user friendly.
|
||||
@@ -93,6 +95,7 @@ public final class Flags {
|
||||
public static final StateFlag ENDERDRAGON_BLOCK_DAMAGE = register(new StateFlag("enderdragon-block-damage", true));
|
||||
public static final StateFlag GHAST_FIREBALL = register(new StateFlag("ghast-fireball", true));
|
||||
public static final StateFlag OTHER_EXPLOSION = register(new StateFlag("other-explosion", true));
|
||||
public static final StateFlag BREEZE_WIND_CHARGE = register(new StateFlag("breeze-charge-explosion", true));
|
||||
public static final StateFlag WITHER_DAMAGE = register(new StateFlag("wither-damage", true));
|
||||
public static final StateFlag ENDER_BUILD = register(new StateFlag("enderman-grief", true));
|
||||
public static final StateFlag SNOWMAN_TRAILS = register(new StateFlag("snowman-trails", true));
|
||||
@@ -128,6 +131,7 @@ public final class Flags {
|
||||
public static final StateFlag COPPER_FADE = register(new StateFlag("copper-fade", true));
|
||||
public static final StateFlag WATER_FLOW = register(new StateFlag("water-flow", true));
|
||||
public static final StateFlag LAVA_FLOW = register(new StateFlag("lava-flow", true));
|
||||
public static final StateFlag MOISTURE_CHANGE = register(new StateFlag("moisture-change", true));
|
||||
|
||||
public static final RegistryFlag<WeatherType> WEATHER_LOCK = register(new RegistryFlag<>("weather-lock", WeatherType.REGISTRY));
|
||||
public static final StringFlag TIME_LOCK = register(new StringFlag("time-lock"));
|
||||
|
||||
+1
-1
@@ -57,6 +57,6 @@ public class GameModeTypeFlag extends Flag<GameMode> {
|
||||
|
||||
@Override
|
||||
public Object marshal(GameMode o) {
|
||||
return o.getId();
|
||||
return o.id();
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -137,9 +137,9 @@ public class LocationFlag extends Flag<Location> {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
vec.put("x", position.getX());
|
||||
vec.put("y", position.getY());
|
||||
vec.put("z", position.getZ());
|
||||
vec.put("x", position.x());
|
||||
vec.put("y", position.y());
|
||||
vec.put("z", position.z());
|
||||
vec.put("yaw", o.getYaw());
|
||||
vec.put("pitch", o.getPitch());
|
||||
return vec;
|
||||
|
||||
+1
-1
@@ -61,6 +61,6 @@ public class RegistryFlag<T extends Keyed> extends Flag<T> {
|
||||
|
||||
@Override
|
||||
public Object marshal(T o) {
|
||||
return o.getId();
|
||||
return o.id();
|
||||
}
|
||||
}
|
||||
@@ -82,9 +82,9 @@ public class VectorFlag extends Flag<Vector3> {
|
||||
@Override
|
||||
public Object marshal(Vector3 o) {
|
||||
Map<String, Object> vec = new HashMap<>();
|
||||
vec.put("x", o.getX());
|
||||
vec.put("y", o.getY());
|
||||
vec.put("z", o.getZ());
|
||||
vec.put("x", o.x());
|
||||
vec.put("y", o.y());
|
||||
vec.put("z", o.z());
|
||||
return vec;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -57,6 +57,6 @@ public class WeatherTypeFlag extends Flag<WeatherType> {
|
||||
|
||||
@Override
|
||||
public Object marshal(WeatherType o) {
|
||||
return o.getId();
|
||||
return o.id();
|
||||
}
|
||||
}
|
||||
+8
-8
@@ -93,10 +93,10 @@ public class ChunkHashTable implements ConcurrentRegionIndex {
|
||||
private ChunkState get(BlockVector2 position, boolean create) {
|
||||
ChunkState state;
|
||||
synchronized (lock) {
|
||||
state = states.get(position.getBlockX(), position.getBlockZ());
|
||||
state = states.get(position.x(), position.z());
|
||||
if (state == null && create) {
|
||||
state = new ChunkState(position);
|
||||
states.put(position.getBlockX(), position.getBlockZ(), state);
|
||||
states.put(position.x(), position.z(), state);
|
||||
executor.submit(new EnumerateRegions(position));
|
||||
}
|
||||
}
|
||||
@@ -130,7 +130,7 @@ public class ChunkHashTable implements ConcurrentRegionIndex {
|
||||
for (ChunkState state : previousStates.values()) {
|
||||
BlockVector2 position = state.getPosition();
|
||||
positions.add(position);
|
||||
states.put(position.getBlockX(), position.getBlockZ(), new ChunkState(position));
|
||||
states.put(position.x(), position.z(), new ChunkState(position));
|
||||
}
|
||||
|
||||
if (!positions.isEmpty()) {
|
||||
@@ -179,9 +179,9 @@ public class ChunkHashTable implements ConcurrentRegionIndex {
|
||||
public void forget(BlockVector2 chunkPosition) {
|
||||
checkNotNull(chunkPosition);
|
||||
synchronized (lock) {
|
||||
states.remove(chunkPosition.getBlockX(), chunkPosition.getBlockZ());
|
||||
states.remove(chunkPosition.x(), chunkPosition.z());
|
||||
ChunkState state = lastState;
|
||||
if (state != null && state.getPosition().getBlockX() == chunkPosition.getBlockX() && state.getPosition().getBlockZ() == chunkPosition.getBlockZ()) {
|
||||
if (state != null && state.getPosition().x() == chunkPosition.x() && state.getPosition().z() == chunkPosition.z()) {
|
||||
lastState = null;
|
||||
}
|
||||
}
|
||||
@@ -238,10 +238,10 @@ public class ChunkHashTable implements ConcurrentRegionIndex {
|
||||
checkNotNull(consumer);
|
||||
|
||||
ChunkState state = lastState;
|
||||
int chunkX = position.getBlockX() >> 4;
|
||||
int chunkZ = position.getBlockZ() >> 4;
|
||||
int chunkX = position.x() >> 4;
|
||||
int chunkZ = position.z() >> 4;
|
||||
|
||||
if (state == null || state.getPosition().getBlockX() != chunkX || state.getPosition().getBlockZ() != chunkZ) {
|
||||
if (state == null || state.getPosition().x() != chunkX || state.getPosition().z() != chunkZ) {
|
||||
state = get(BlockVector2.at(chunkX, chunkZ), false);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -69,7 +69,7 @@ public class PriorityRTreeIndex extends HashMapIndex {
|
||||
@Override
|
||||
public void applyContaining(BlockVector3 position, Predicate<ProtectedRegion> consumer) {
|
||||
Set<ProtectedRegion> seen = new HashSet<>();
|
||||
MBR pointMBR = new SimpleMBR(position.getX(), position.getX(), position.getY(), position.getY(), position.getZ(), position.getZ());
|
||||
MBR pointMBR = new SimpleMBR(position.x(), position.x(), position.y(), position.y(), position.z(), position.z());
|
||||
|
||||
for (ProtectedRegion region : tree.find(pointMBR)) {
|
||||
if (region.contains(position) && !seen.contains(region)) {
|
||||
@@ -87,7 +87,7 @@ public class PriorityRTreeIndex extends HashMapIndex {
|
||||
BlockVector3 max = region.getMaximumPoint().ceil();
|
||||
|
||||
Set<ProtectedRegion> candidates = new HashSet<>();
|
||||
MBR pointMBR = new SimpleMBR(min.getX(), max.getX(), min.getY(), max.getY(), min.getZ(), max.getZ());
|
||||
MBR pointMBR = new SimpleMBR(min.x(), max.x(), min.y(), max.y(), min.z(), max.z());
|
||||
|
||||
for (ProtectedRegion found : tree.find(pointMBR)) {
|
||||
candidates.add(found);
|
||||
|
||||
+2
-2
@@ -84,8 +84,8 @@ public class WorldHeightMigration extends AbstractMigration {
|
||||
if (min == 0 && max == 255) return;
|
||||
}
|
||||
for (ProtectedRegion region : regions) {
|
||||
if (region.getMinimumPoint().getBlockY() <= 0
|
||||
&& region.getMaximumPoint().getBlockY() >= 255) {
|
||||
if (region.getMinimumPoint().y() <= 0
|
||||
&& region.getMaximumPoint().y() >= 255) {
|
||||
expand(region, min, max);
|
||||
changed++;
|
||||
}
|
||||
|
||||
+8
-7
@@ -41,6 +41,7 @@ import com.sk89q.worldguard.protection.regions.ProtectedPolygonalRegion;
|
||||
import com.sk89q.worldguard.protection.regions.ProtectedRegion;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
|
||||
import org.yaml.snakeyaml.LoaderOptions;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
||||
import org.yaml.snakeyaml.parser.ParserException;
|
||||
@@ -89,7 +90,7 @@ public class YamlRegionFile implements RegionDatabase {
|
||||
options.setIndent(4);
|
||||
options.setDefaultFlowStyle(FlowStyle.AUTO);
|
||||
|
||||
ERROR_DUMP_YAML = new Yaml(new SafeConstructor(), new Representer(), options);
|
||||
ERROR_DUMP_YAML = new Yaml(new SafeConstructor(new LoaderOptions()), new Representer(new DumperOptions()), options);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -213,14 +214,14 @@ public class YamlRegionFile implements RegionDatabase {
|
||||
} else if (region instanceof ProtectedPolygonalRegion) {
|
||||
ProtectedPolygonalRegion poly = (ProtectedPolygonalRegion) region;
|
||||
node.setProperty("type", "poly2d");
|
||||
node.setProperty("min-y", poly.getMinimumPoint().getBlockY());
|
||||
node.setProperty("max-y", poly.getMaximumPoint().getBlockY());
|
||||
node.setProperty("min-y", poly.getMinimumPoint().y());
|
||||
node.setProperty("max-y", poly.getMaximumPoint().y());
|
||||
|
||||
List<Map<String, Object>> points = new ArrayList<>();
|
||||
for (BlockVector2 point : poly.getPoints()) {
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
data.put("x", point.getBlockX());
|
||||
data.put("z", point.getBlockZ());
|
||||
data.put("x", point.x());
|
||||
data.put("z", point.z());
|
||||
points.add(data);
|
||||
}
|
||||
|
||||
@@ -322,7 +323,7 @@ public class YamlRegionFile implements RegionDatabase {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a YAML processer instance.
|
||||
* Create a YAML processor instance.
|
||||
*
|
||||
* @param file the file
|
||||
* @return a processor instance
|
||||
@@ -336,7 +337,7 @@ public class YamlRegionFile implements RegionDatabase {
|
||||
* Dump the given object as YAML for debugging purposes.
|
||||
*
|
||||
* @param object the object
|
||||
* @return the YAML string or an error string if dumping fals
|
||||
* @return the YAML string or an error string if dumping fails
|
||||
*/
|
||||
private static String toYamlOutput(Object object) {
|
||||
try {
|
||||
|
||||
+10
-10
@@ -113,12 +113,12 @@ class RegionInserter {
|
||||
BlockVector3 max = region.getMaximumPoint();
|
||||
|
||||
stmt.setString(1, region.getId());
|
||||
stmt.setInt(2, min.getBlockZ());
|
||||
stmt.setInt(3, min.getBlockY());
|
||||
stmt.setInt(4, min.getBlockX());
|
||||
stmt.setInt(5, max.getBlockZ());
|
||||
stmt.setInt(6, max.getBlockY());
|
||||
stmt.setInt(7, max.getBlockX());
|
||||
stmt.setInt(2, min.z());
|
||||
stmt.setInt(3, min.y());
|
||||
stmt.setInt(4, min.x());
|
||||
stmt.setInt(5, max.z());
|
||||
stmt.setInt(6, max.y());
|
||||
stmt.setInt(7, max.x());
|
||||
stmt.addBatch();
|
||||
}
|
||||
|
||||
@@ -141,8 +141,8 @@ class RegionInserter {
|
||||
for (List<ProtectedPolygonalRegion> partition : Lists.partition(polygons, StatementBatch.MAX_BATCH_SIZE)) {
|
||||
for (ProtectedPolygonalRegion region : partition) {
|
||||
stmt.setString(1, region.getId());
|
||||
stmt.setInt(2, region.getMaximumPoint().getBlockY());
|
||||
stmt.setInt(3, region.getMinimumPoint().getBlockY());
|
||||
stmt.setInt(2, region.getMaximumPoint().y());
|
||||
stmt.setInt(3, region.getMinimumPoint().y());
|
||||
stmt.addBatch();
|
||||
}
|
||||
|
||||
@@ -167,8 +167,8 @@ class RegionInserter {
|
||||
for (ProtectedPolygonalRegion region : polygons) {
|
||||
for (BlockVector2 point : region.getPoints()) {
|
||||
stmt.setString(1, region.getId());
|
||||
stmt.setInt(2, point.getBlockZ());
|
||||
stmt.setInt(3, point.getBlockX());
|
||||
stmt.setInt(2, point.z());
|
||||
stmt.setInt(3, point.x());
|
||||
batch.addBatch();
|
||||
}
|
||||
}
|
||||
|
||||
+3
-2
@@ -32,6 +32,7 @@ import com.sk89q.worldguard.util.io.Closer;
|
||||
import com.sk89q.worldguard.util.sql.DataSourceConfig;
|
||||
import org.yaml.snakeyaml.DumperOptions;
|
||||
import org.yaml.snakeyaml.DumperOptions.FlowStyle;
|
||||
import org.yaml.snakeyaml.LoaderOptions;
|
||||
import org.yaml.snakeyaml.Yaml;
|
||||
import org.yaml.snakeyaml.constructor.SafeConstructor;
|
||||
import org.yaml.snakeyaml.representer.Representer;
|
||||
@@ -191,11 +192,11 @@ class SQLRegionDatabase implements RegionDatabase {
|
||||
DumperOptions options = new DumperOptions();
|
||||
options.setIndent(2);
|
||||
options.setDefaultFlowStyle(FlowStyle.FLOW);
|
||||
Representer representer = new Representer();
|
||||
Representer representer = new Representer(options);
|
||||
representer.setDefaultFlowStyle(FlowStyle.FLOW);
|
||||
|
||||
// We have to use this in order to properly save non-string values
|
||||
return new Yaml(new SafeConstructor(), new Representer(), options);
|
||||
return new Yaml(new SafeConstructor(new LoaderOptions()), representer, options);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -69,7 +69,7 @@ public class GlobalProtectedRegion extends ProtectedRegion {
|
||||
public List<BlockVector2> getPoints() {
|
||||
// This doesn't make sense
|
||||
List<BlockVector2> pts = new ArrayList<>();
|
||||
pts.add(BlockVector2.at(min.getBlockX(), min.getBlockZ()));
|
||||
pts.add(BlockVector2.at(min.x(), min.z()));
|
||||
return pts;
|
||||
}
|
||||
|
||||
|
||||
+17
-17
@@ -113,10 +113,10 @@ public class ProtectedCuboidRegion extends ProtectedRegion {
|
||||
@Override
|
||||
public List<BlockVector2> getPoints() {
|
||||
List<BlockVector2> pts = new ArrayList<>();
|
||||
int x1 = min.getBlockX();
|
||||
int x2 = max.getBlockX();
|
||||
int z1 = min.getBlockZ();
|
||||
int z2 = max.getBlockZ();
|
||||
int x1 = min.x();
|
||||
int x2 = max.x();
|
||||
int z1 = min.z();
|
||||
int z2 = max.z();
|
||||
|
||||
pts.add(BlockVector2.at(x1, z1));
|
||||
pts.add(BlockVector2.at(x2, z1));
|
||||
@@ -128,12 +128,12 @@ public class ProtectedCuboidRegion extends ProtectedRegion {
|
||||
|
||||
@Override
|
||||
public boolean contains(BlockVector3 pt) {
|
||||
final double x = pt.getX();
|
||||
final double y = pt.getY();
|
||||
final double z = pt.getZ();
|
||||
return x >= min.getBlockX() && x < max.getBlockX() + 1
|
||||
&& y >= min.getBlockY() && y < max.getBlockY() + 1
|
||||
&& z >= min.getBlockZ() && z < max.getBlockZ() + 1;
|
||||
final double x = pt.x();
|
||||
final double y = pt.y();
|
||||
final double z = pt.z();
|
||||
return x >= min.x() && x < max.x() + 1
|
||||
&& y >= min.y() && y < max.y() + 1
|
||||
&& z >= min.z() && z < max.z() + 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -143,10 +143,10 @@ public class ProtectedCuboidRegion extends ProtectedRegion {
|
||||
|
||||
@Override
|
||||
Area toArea() {
|
||||
int x = getMinimumPoint().getBlockX();
|
||||
int z = getMinimumPoint().getBlockZ();
|
||||
int width = getMaximumPoint().getBlockX() - x + 1;
|
||||
int height = getMaximumPoint().getBlockZ() - z + 1;
|
||||
int x = getMinimumPoint().x();
|
||||
int z = getMinimumPoint().z();
|
||||
int width = getMaximumPoint().x() - x + 1;
|
||||
int height = getMaximumPoint().z() - z + 1;
|
||||
return new Area(new Rectangle(x, z, width, height));
|
||||
}
|
||||
|
||||
@@ -161,9 +161,9 @@ public class ProtectedCuboidRegion extends ProtectedRegion {
|
||||
|
||||
@Override
|
||||
public int volume() {
|
||||
int xLength = max.getBlockX() - min.getBlockX() + 1;
|
||||
int yLength = max.getBlockY() - min.getBlockY() + 1;
|
||||
int zLength = max.getBlockZ() - min.getBlockZ() + 1;
|
||||
int xLength = max.x() - min.x() + 1;
|
||||
int yLength = max.y() - min.y() + 1;
|
||||
int zLength = max.z() - min.z() + 1;
|
||||
|
||||
try {
|
||||
long v = MathUtils.checkedMultiply(xLength, yLength);
|
||||
|
||||
+13
-13
@@ -65,8 +65,8 @@ public class ProtectedPolygonalRegion extends ProtectedRegion {
|
||||
ImmutableList<BlockVector2> immutablePoints = ImmutableList.copyOf(points);
|
||||
setMinMaxPoints(immutablePoints, minY, maxY);
|
||||
this.points = immutablePoints;
|
||||
this.minY = min.getBlockY();
|
||||
this.maxY = max.getBlockY();
|
||||
this.minY = min.y();
|
||||
this.maxY = max.y();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,7 +82,7 @@ public class ProtectedPolygonalRegion extends ProtectedRegion {
|
||||
List<BlockVector3> points = new ArrayList<>();
|
||||
int y = minY;
|
||||
for (BlockVector2 point2D : points2D) {
|
||||
points.add(BlockVector3.at(point2D.getBlockX(), y, point2D.getBlockZ()));
|
||||
points.add(BlockVector3.at(point2D.x(), y, point2D.z()));
|
||||
y = maxY;
|
||||
}
|
||||
setMinMaxPoints(points);
|
||||
@@ -102,15 +102,15 @@ public class ProtectedPolygonalRegion extends ProtectedRegion {
|
||||
public boolean contains(BlockVector3 position) {
|
||||
checkNotNull(position);
|
||||
|
||||
int targetX = position.getBlockX(); // Width
|
||||
int targetY = position.getBlockY(); // Height
|
||||
int targetZ = position.getBlockZ(); // Depth
|
||||
int targetX = position.x(); // Width
|
||||
int targetY = position.y(); // Height
|
||||
int targetZ = position.z(); // Depth
|
||||
|
||||
if (targetY < minY || targetY > maxY) {
|
||||
return false;
|
||||
}
|
||||
//Quick and dirty check.
|
||||
if (targetX < min.getBlockX() || targetX > max.getBlockX() || targetZ < min.getBlockZ() || targetZ > max.getBlockZ()) {
|
||||
if (targetX < min.x() || targetX > max.x() || targetZ < min.z() || targetZ > max.z()) {
|
||||
return false;
|
||||
}
|
||||
boolean inside = false;
|
||||
@@ -122,12 +122,12 @@ public class ProtectedPolygonalRegion extends ProtectedRegion {
|
||||
long crossproduct;
|
||||
int i;
|
||||
|
||||
xOld = points.get(npoints - 1).getBlockX();
|
||||
zOld = points.get(npoints - 1).getBlockZ();
|
||||
xOld = points.get(npoints - 1).x();
|
||||
zOld = points.get(npoints - 1).z();
|
||||
|
||||
for (i = 0; i < npoints; i++) {
|
||||
xNew = points.get(i).getBlockX();
|
||||
zNew = points.get(i).getBlockZ();
|
||||
xNew = points.get(i).x();
|
||||
zNew = points.get(i).z();
|
||||
//Check for corner
|
||||
if (xNew == targetX && zNew == targetZ) {
|
||||
return true;
|
||||
@@ -173,8 +173,8 @@ public class ProtectedPolygonalRegion extends ProtectedRegion {
|
||||
|
||||
int i = 0;
|
||||
for (BlockVector2 point : points) {
|
||||
xCoords[i] = point.getBlockX();
|
||||
yCoords[i] = point.getBlockZ();
|
||||
xCoords[i] = point.x();
|
||||
yCoords[i] = point.z();
|
||||
i++;
|
||||
}
|
||||
|
||||
|
||||
+21
-21
@@ -92,17 +92,17 @@ public abstract class ProtectedRegion implements ChangeTracked, Comparable<Prote
|
||||
* @param points the points to set with at least one entry
|
||||
*/
|
||||
protected void setMinMaxPoints(List<BlockVector3> points) {
|
||||
int minX = points.get(0).getBlockX();
|
||||
int minY = points.get(0).getBlockY();
|
||||
int minZ = points.get(0).getBlockZ();
|
||||
int minX = points.get(0).x();
|
||||
int minY = points.get(0).y();
|
||||
int minZ = points.get(0).z();
|
||||
int maxX = minX;
|
||||
int maxY = minY;
|
||||
int maxZ = minZ;
|
||||
|
||||
for (BlockVector3 v : points) {
|
||||
int x = v.getBlockX();
|
||||
int y = v.getBlockY();
|
||||
int z = v.getBlockZ();
|
||||
int x = v.x();
|
||||
int y = v.y();
|
||||
int z = v.z();
|
||||
|
||||
if (x < minX) minX = x;
|
||||
if (y < minY) minY = y;
|
||||
@@ -514,7 +514,7 @@ public abstract class ProtectedRegion implements ChangeTracked, Comparable<Prote
|
||||
*/
|
||||
public boolean contains(BlockVector2 position) {
|
||||
checkNotNull(position);
|
||||
return contains(BlockVector3.at(position.getBlockX(), min.getBlockY(), position.getBlockZ()));
|
||||
return contains(BlockVector3.at(position.x(), min.y(), position.z()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -607,16 +607,16 @@ public abstract class ProtectedRegion implements ChangeTracked, Comparable<Prote
|
||||
BlockVector3 rMaxPoint = region.getMaximumPoint();
|
||||
BlockVector3 min = getMinimumPoint();
|
||||
|
||||
if (rMaxPoint.getBlockX() < min.getBlockX()) return false;
|
||||
if (rMaxPoint.getBlockY() < min.getBlockY()) return false;
|
||||
if (rMaxPoint.getBlockZ() < min.getBlockZ()) return false;
|
||||
if (rMaxPoint.x() < min.x()) return false;
|
||||
if (rMaxPoint.y() < min.y()) return false;
|
||||
if (rMaxPoint.z() < min.z()) return false;
|
||||
|
||||
BlockVector3 rMinPoint = region.getMinimumPoint();
|
||||
BlockVector3 max = getMaximumPoint();
|
||||
|
||||
if (rMinPoint.getBlockX() > max.getBlockX()) return false;
|
||||
if (rMinPoint.getBlockY() > max.getBlockY()) return false;
|
||||
if (rMinPoint.getBlockZ() > max.getBlockZ()) return false;
|
||||
if (rMinPoint.x() > max.x()) return false;
|
||||
if (rMinPoint.y() > max.y()) return false;
|
||||
if (rMinPoint.z() > max.z()) return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -636,16 +636,16 @@ public abstract class ProtectedRegion implements ChangeTracked, Comparable<Prote
|
||||
for (BlockVector2 aPts2 : pts2) {
|
||||
|
||||
Line2D line1 = new Line2D.Double(
|
||||
lastPt1.getBlockX(),
|
||||
lastPt1.getBlockZ(),
|
||||
aPts1.getBlockX(),
|
||||
aPts1.getBlockZ());
|
||||
lastPt1.x(),
|
||||
lastPt1.z(),
|
||||
aPts1.x(),
|
||||
aPts1.z());
|
||||
|
||||
if (line1.intersectsLine(
|
||||
lastPt2.getBlockX(),
|
||||
lastPt2.getBlockZ(),
|
||||
aPts2.getBlockX(),
|
||||
aPts2.getBlockZ())) {
|
||||
lastPt2.x(),
|
||||
lastPt2.z(),
|
||||
aPts2.x(),
|
||||
aPts2.z())) {
|
||||
return true;
|
||||
}
|
||||
lastPt2 = aPts2;
|
||||
|
||||
+12
-18
@@ -30,27 +30,21 @@ public class ProtectedRegionMBRConverter implements MBRConverter<ProtectedRegion
|
||||
|
||||
@Override
|
||||
public double getMax(int dimension, ProtectedRegion region) {
|
||||
switch (dimension) {
|
||||
case 0:
|
||||
return region.getMaximumPoint().getBlockX();
|
||||
case 1:
|
||||
return region.getMaximumPoint().getBlockY();
|
||||
case 2:
|
||||
return region.getMaximumPoint().getBlockZ();
|
||||
}
|
||||
return 0;
|
||||
return switch (dimension) {
|
||||
case 0 -> region.getMaximumPoint().x();
|
||||
case 1 -> region.getMaximumPoint().y();
|
||||
case 2 -> region.getMaximumPoint().z();
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getMin(int dimension, ProtectedRegion region) {
|
||||
switch (dimension) {
|
||||
case 0:
|
||||
return region.getMinimumPoint().getBlockX();
|
||||
case 1:
|
||||
return region.getMinimumPoint().getBlockY();
|
||||
case 2:
|
||||
return region.getMinimumPoint().getBlockZ();
|
||||
}
|
||||
return 0;
|
||||
return switch (dimension) {
|
||||
case 0 -> region.getMinimumPoint().x();
|
||||
case 1 -> region.getMinimumPoint().y();
|
||||
case 2 -> region.getMinimumPoint().z();
|
||||
default -> 0;
|
||||
};
|
||||
}
|
||||
}
|
||||
+2
-2
@@ -50,7 +50,7 @@ public final class WorldEditRegionConverter {
|
||||
}
|
||||
if (region instanceof ProtectedPolygonalRegion) {
|
||||
return new Polygonal2DRegion(null, region.getPoints(),
|
||||
region.getMinimumPoint().getY(), region.getMaximumPoint().getY());
|
||||
region.getMinimumPoint().y(), region.getMaximumPoint().y());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
@@ -68,7 +68,7 @@ public final class WorldEditRegionConverter {
|
||||
}
|
||||
if (region instanceof ProtectedPolygonalRegion) {
|
||||
return new Polygonal2DRegionSelector(null, region.getPoints(),
|
||||
region.getMinimumPoint().getY(), region.getMaximumPoint().getY());
|
||||
region.getMinimumPoint().y(), region.getMaximumPoint().y());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
+21
-8
@@ -19,6 +19,7 @@
|
||||
|
||||
package com.sk89q.worldguard.session;
|
||||
|
||||
import com.google.common.cache.Cache;
|
||||
import com.google.common.cache.CacheBuilder;
|
||||
import com.google.common.cache.CacheLoader;
|
||||
import com.google.common.cache.LoadingCache;
|
||||
@@ -67,10 +68,9 @@ public abstract class AbstractSessionManager implements SessionManager {
|
||||
.expireAfterWrite(2, TimeUnit.SECONDS)
|
||||
.build(CacheLoader.from(tuple -> BYPASS_PERMISSION_TEST.test(tuple.getWorld(), tuple.getPlayer())));
|
||||
|
||||
private final LoadingCache<CacheKey, Session> sessions = CacheBuilder.newBuilder()
|
||||
private final Cache<CacheKey, Session> sessions = CacheBuilder.newBuilder()
|
||||
.expireAfterAccess(SESSION_LIFETIME, TimeUnit.MINUTES)
|
||||
.build(CacheLoader.from(key ->
|
||||
createSession(key.playerRef.get())));
|
||||
.build();
|
||||
|
||||
private boolean hasCustom = false;
|
||||
private List<Handler.Factory<? extends Handler>> handlers = new LinkedList<>();
|
||||
@@ -152,7 +152,7 @@ public abstract class AbstractSessionManager implements SessionManager {
|
||||
@Override
|
||||
public void resetState(LocalPlayer player) {
|
||||
checkNotNull(player, "player");
|
||||
@Nullable Session session = sessions.getIfPresent(new CacheKey(player));
|
||||
@Nullable Session session = getIfPresentInternal(new CacheKey(player));
|
||||
if (session != null) {
|
||||
session.resetState(player);
|
||||
}
|
||||
@@ -161,22 +161,35 @@ public abstract class AbstractSessionManager implements SessionManager {
|
||||
@Override
|
||||
@Nullable
|
||||
public Session getIfPresent(LocalPlayer player) {
|
||||
return sessions.getIfPresent(new CacheKey(player));
|
||||
return getIfPresentInternal(new CacheKey(player));
|
||||
}
|
||||
|
||||
private Session getIfPresentInternal(CacheKey cacheKey) {
|
||||
@Nullable Session session = sessions.getIfPresent(cacheKey);
|
||||
if (session != null) {
|
||||
session.ensureInitialized(cacheKey.playerRef.get(), this::initializeSession);
|
||||
return session;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Session get(LocalPlayer player) {
|
||||
return sessions.getUnchecked(new CacheKey(player));
|
||||
Session session = sessions.asMap().computeIfAbsent(new CacheKey(player), (k) -> new Session(this));
|
||||
session.ensureInitialized(player, this::initializeSession);
|
||||
return session;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Session createSession(LocalPlayer player) {
|
||||
Session session = new Session(this);
|
||||
return get(player);
|
||||
}
|
||||
|
||||
private void initializeSession(Session session, LocalPlayer player) {
|
||||
for (Handler.Factory<? extends Handler> factory : handlers) {
|
||||
session.register(factory.create(session));
|
||||
}
|
||||
session.initialize(player);
|
||||
return session;
|
||||
}
|
||||
|
||||
protected static final class CacheKey {
|
||||
|
||||
@@ -38,6 +38,7 @@ import javax.annotation.Nullable;
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
import java.util.function.BiConsumer;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
|
||||
@@ -52,6 +53,7 @@ public class Session {
|
||||
private Location lastValid;
|
||||
private Set<ProtectedRegion> lastRegionSet;
|
||||
private final AtomicBoolean needRefresh = new AtomicBoolean(false);
|
||||
private boolean initialized;
|
||||
|
||||
/**
|
||||
* Create a new session.
|
||||
@@ -110,7 +112,7 @@ public class Session {
|
||||
disableBypass = cfg.disableDefaultBypass;
|
||||
if (cfg.announceBypassStatus && player.hasPermission("worldguard.region.toggle-bypass")) {
|
||||
player.printInfo(TextComponent.of(
|
||||
"You are " + (disableBypass ? "not" : "") + " bypassing region protection. " +
|
||||
"You are " + (disableBypass ? "not " : "") + "bypassing region protection. " +
|
||||
"You can toggle this with /rg bypass", TextColor.DARK_PURPLE));
|
||||
}
|
||||
|
||||
@@ -120,6 +122,14 @@ public class Session {
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void ensureInitialized(LocalPlayer player, BiConsumer<Session, LocalPlayer> initializer) {
|
||||
if (initialized) {
|
||||
return;
|
||||
}
|
||||
initialized = true;
|
||||
initializer.accept(this, player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Uninitialize the session.
|
||||
*
|
||||
|
||||
@@ -95,7 +95,9 @@ public interface SessionManager {
|
||||
*
|
||||
* @param player The player
|
||||
* @return The new session
|
||||
* @deprecated Use {@link SessionManager#get} instead
|
||||
*/
|
||||
@Deprecated
|
||||
Session createSession(LocalPlayer player);
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
tasks.register("build") {
|
||||
dependsOn(subprojects.map { it.tasks.named("build") })
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
applyLibrariesConfiguration()
|
||||
@@ -1,18 +1,10 @@
|
||||
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
|
||||
|
||||
applyLibrariesConfiguration()
|
||||
plugins {
|
||||
id("buildlogic.libs")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
"shade"("org.enginehub:squirrelid:${Versions.SQUIRRELID}")
|
||||
"shade"("org.khelekore:prtree:1.5.0")
|
||||
}
|
||||
|
||||
tasks.named<ShadowJar>("jar") {
|
||||
dependencies {
|
||||
relocate("org.enginehub.squirrelid", "com.sk89q.worldguard.util.profile") {
|
||||
include(dependency("org.enginehub:squirrelid"))
|
||||
}
|
||||
|
||||
include(dependency("org.khelekore:prtree"))
|
||||
"shade"(libs.squirrelid) {
|
||||
isTransitive = false
|
||||
}
|
||||
"shade"(libs.prtree)
|
||||
}
|
||||
Reference in new issue
Block a user