diff --git a/.gitignore b/.gitignore
index 8729a2d8..875d4c5d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
+/.gradle/
+/build/
/.idea/
/api/target/
/api/.flattened-pom.xml
@@ -6,32 +8,6 @@
/common/target/
/common/.flattened-pom.xml
/common/ore-control-common.iml
-/impl/v1_18_R1/target/
-/impl/v1_18_R1/.flattened-pom.xml
-/impl/v1_18_R1/ore-control-impl-v1_18_R1.iml
-/impl/v1_18_R2/target/
-/impl/v1_18_R2/.flattened-pom.xml
-/impl/v1_18_R2/ore-control-impl-v1_18_R2.iml
-/impl/v1_19_R1/target/
-/impl/v1_19_R1/.flattened-pom.xml
-/impl/v1_19_R1/ore-control-impl-v1_19_R1.iml
-/impl/v1_19_R2/target/
-/impl/v1_19_R2/.flattened-pom.xml
-/impl/v1_19_R2/ore-control-impl-v1_19_R2.iml
-/impl/v1_19_R3/target/
-/impl/v1_19_R3/.flattened-pom.xml
-/impl/v1_19_R3/ore-control-impl-v1_19_R3.iml
-/impl/v1_20_R1/target/
-/impl/v1_20_R1/.flattened-pom.xml
-/impl/v1_20_R1/ore-control-impl-v1_20_R1.iml
-/impl/v1_20_R2/target/
-/impl/v1_20_R2/.flattened-pom.xml
-/impl/v1_20_R2/ore-control-impl-v1_20_R2.iml
-/impl/v1_20_R3/target/
-/impl/v1_20_R3/.flattened-pom.xml
-/impl/v1_20_R3/ore-control-impl-v1_20_R3.iml
-/impl/.flattened-pom.xml
-/impl/ore-control-impl.iml
/ore-control/target/
/ore-control/.flattened-pom.xml
/ore-control/ore-control.iml
@@ -40,4 +16,7 @@
.flattened-pom.xml
target
*.iml
-
+*/build/
+*/.gradle
+impl/*/build/
+impl/*/.gradle
\ No newline at end of file
diff --git a/api/build.gradle.kts b/api/build.gradle.kts
new file mode 100644
index 00000000..6ad7f362
--- /dev/null
+++ b/api/build.gradle.kts
@@ -0,0 +1,14 @@
+
+plugins {
+ `java-library`
+ id("buildlogic.common")
+}
+
+repositories {
+ maven("https://repo.papermc.io/repository/maven-public/")
+}
+
+dependencies {
+ compileOnly(libs.paperApi)
+ compileOnly(libs.jetbrainsAnnotations)
+}
diff --git a/api/pom.xml b/api/pom.xml
deleted file mode 100644
index 02c2c350..00000000
--- a/api/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
- 4.0.0
-
-
- ore-control-parent
- de.derfrzocker
- ${revision}
-
-
- ore-control-api
-
-
\ No newline at end of file
diff --git a/api/src/main/java/de/derfrzocker/feature/api/Feature.java b/api/src/main/java/de/derfrzocker/feature/api/Feature.java
index 3c026689..ba4eca15 100644
--- a/api/src/main/java/de/derfrzocker/feature/api/Feature.java
+++ b/api/src/main/java/de/derfrzocker/feature/api/Feature.java
@@ -11,16 +11,16 @@
* Each Feature contains one generator and can have multiple placement modifiers.
* The order of the placement modifiers is important. A list which preserves its order should be used.
*
- * @param key The unique key of this feature.
+ * @param namedKey The unique key of this feature.
* @param generator The generator which generates the blocks.
* @param placementModifiers The placement modifiers which determine the positions to generate the feature.
*/
-public record Feature(@NotNull NamespacedKey key, @NotNull FeatureGenerator> generator,
+public record Feature(@NotNull NamespacedKey namedKey, @NotNull FeatureGenerator> generator,
@NotNull List> placementModifiers) implements Keyed {
@NotNull
@Override
public NamespacedKey getKey() {
- return key();
+ return namedKey();
}
}
diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts
new file mode 100644
index 00000000..d113a8cb
--- /dev/null
+++ b/build-logic/build.gradle.kts
@@ -0,0 +1,15 @@
+plugins {
+ `kotlin-dsl`
+}
+
+repositories {
+ mavenCentral()
+ gradlePluginPortal()
+}
+
+dependencies {
+ implementation(gradleApi())
+ implementation(libs.grgit)
+ implementation(libs.paperweight)
+ implementation(libs.shadow)
+}
diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts
new file mode 100644
index 00000000..aa5e146f
--- /dev/null
+++ b/build-logic/settings.gradle.kts
@@ -0,0 +1,9 @@
+dependencyResolutionManagement {
+ versionCatalogs {
+ create("libs") {
+ from(files("../gradle/libs.versions.toml"))
+ }
+ }
+}
+
+rootProject.name = "build-logic"
diff --git a/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts b/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts
new file mode 100644
index 00000000..4cf12058
--- /dev/null
+++ b/build-logic/src/main/kotlin/buildlogic.adapter.gradle.kts
@@ -0,0 +1,36 @@
+plugins {
+ `java-library`
+ id("io.papermc.paperweight.userdev")
+ id("buildlogic.common-java")
+}
+
+repositories {
+ maven {
+ name = "Paper"
+ url = uri("https://repo.papermc.io/repository/maven-public/")
+ }
+ maven {
+ name = "DerFrZocker-Releases"
+ url = uri("https://nexus.derfrzocker.de/repository/maven-releases/")
+ metadataSources {
+ artifact()
+ }
+ }
+ mavenCentral()
+}
+
+paperweight.reobfArtifactConfiguration = io.papermc.paperweight.userdev.ReobfArtifactConfiguration.REOBF_PRODUCTION
+
+dependencies {
+ "compileOnly"(project(":api"))
+ "compileOnly"(project(":common"))
+ constraints {
+ "remapper"("net.fabricmc:tiny-remapper:[0.8.11,)") {
+ because("Need remapper to support Java 21")
+ }
+ }
+}
+
+tasks.named("assemble").configure {
+ dependsOn("reobfJar")
+}
diff --git a/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts
new file mode 100644
index 00000000..c4ec93c1
--- /dev/null
+++ b/build-logic/src/main/kotlin/buildlogic.common-java.gradle.kts
@@ -0,0 +1,16 @@
+
+plugins {
+ id("eclipse")
+ id("idea")
+}
+
+tasks
+ .withType()
+ .matching { it.name == "compileJava" || it.name == "compileTestJava" }
+ .configureEach {
+ options.release.set(21)
+ options.encoding = "UTF-8"
+ options.compilerArgs.add("-parameters")
+ options.compilerArgs.add("-Werror")
+ }
+
diff --git a/build-logic/src/main/kotlin/buildlogic.common.gradle.kts b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts
new file mode 100644
index 00000000..90394ecf
--- /dev/null
+++ b/build-logic/src/main/kotlin/buildlogic.common.gradle.kts
@@ -0,0 +1,26 @@
+import org.gradle.kotlin.dsl.`java-library`
+import org.gradle.kotlin.dsl.repositories
+
+plugins {
+ `java-library`
+ id("buildlogic.common-java")
+}
+
+repositories {
+ maven {
+ name = "Paper"
+ url = uri("https://repo.papermc.io/repository/maven-public/")
+ }
+ maven {
+ name = "DerFrZocker-Releases"
+ url = uri("https://nexus.derfrzocker.de/repository/maven-releases/")
+ metadataSources {
+ artifact()
+ }
+ }
+ maven {
+ name = "CodeMC"
+ url = uri("https://repo.codemc.org/repository/maven-public")
+ }
+ mavenCentral()
+}
diff --git a/build-logic/src/main/kotlin/buildlogic.shadow.gradle.kts b/build-logic/src/main/kotlin/buildlogic.shadow.gradle.kts
new file mode 100644
index 00000000..a504488e
--- /dev/null
+++ b/build-logic/src/main/kotlin/buildlogic.shadow.gradle.kts
@@ -0,0 +1,5 @@
+
+plugins {
+ id("com.gradleup.shadow")
+ id("buildlogic.common-java")
+}
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 00000000..0730a743
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,25 @@
+import org.ajoberstar.grgit.Grgit
+import java.time.LocalDate
+import java.time.format.DateTimeFormatter
+
+plugins {
+ jacoco
+ id("org.ajoberstar.grgit") version "5.2.2"
+}
+
+val date: String = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd"))
+
+if (!project.hasProperty("gitCommitHash")) {
+ apply(plugin = "org.ajoberstar.grgit")
+ val gitCommitHash: String? = try {
+ extensions.getByName("grgit").head()?.abbreviatedId
+ } catch (e: Exception) {
+ logger.warn("Error getting commit hash", e)
+ ""
+ }
+ version = "$date-$gitCommitHash"
+} else {
+ version = date
+}
+
+group = "de.derfrzocker"
diff --git a/common/build.gradle.kts b/common/build.gradle.kts
new file mode 100644
index 00000000..1fed1fe9
--- /dev/null
+++ b/common/build.gradle.kts
@@ -0,0 +1,12 @@
+plugins {
+ `java-library`
+ id("buildlogic.common")
+}
+
+dependencies {
+ compileOnly(libs.paperApi)
+ implementation(project(":api"))
+ implementation(libs.bstats)
+ implementation(libs.spigotutils)
+ compileOnly(libs.exp4j)
+}
diff --git a/common/pom.xml b/common/pom.xml
deleted file mode 100644
index 03148611..00000000
--- a/common/pom.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
- 4.0.0
-
-
- ore-control-parent
- de.derfrzocker
- ${revision}
-
-
- ore-control-common
-
-
-
- de.derfrzocker
- ore-control-api
- ${project.version}
- provided
-
-
- net.objecthunter
- exp4j
- 0.4.8
- provided
-
-
-
-
\ No newline at end of file
diff --git a/common/src/main/java/de/derfrzocker/feature/common/util/Refraction.java b/common/src/main/java/de/derfrzocker/feature/common/util/Refraction.java
new file mode 100644
index 00000000..96f1f19a
--- /dev/null
+++ b/common/src/main/java/de/derfrzocker/feature/common/util/Refraction.java
@@ -0,0 +1,23 @@
+package de.derfrzocker.feature.common.util;
+
+public class Refraction {
+ private static final String MOJANG_MAPPED_CLASS_NAME = "net.minecraft.nbt.ListTag";
+ private static final boolean IS_MOJANG_MAPPED;
+
+ static {
+ boolean isMojangMapped;
+ try {
+ Class.forName(MOJANG_MAPPED_CLASS_NAME, false, Refraction.class.getClassLoader());
+ isMojangMapped = true;
+ } catch (ClassNotFoundException e) {
+ isMojangMapped = false;
+ }
+ IS_MOJANG_MAPPED = isMojangMapped;
+ }
+
+ public static String pickName(String mojangName, String spigotName) {
+ return IS_MOJANG_MAPPED ? mojangName : spigotName;
+ }
+
+ private Refraction() {}
+}
diff --git a/gradle/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties
new file mode 100644
index 00000000..63e5bbdf
--- /dev/null
+++ b/gradle/gradle-daemon-jvm.properties
@@ -0,0 +1,2 @@
+#This file is generated by updateDaemonJvm
+toolchainVersion=21
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
new file mode 100644
index 00000000..a2e0baf0
--- /dev/null
+++ b/gradle/libs.versions.toml
@@ -0,0 +1,23 @@
+[libraries]
+grgit = "org.ajoberstar.grgit:grgit-gradle:5.2.2"
+shadow = "com.gradleup.shadow:shadow-gradle-plugin:8.3.5"
+
+paperweight = "io.papermc.paperweight.userdev:io.papermc.paperweight.userdev.gradle.plugin:1.7.7"
+
+jsr305 = "com.google.code.findbugs:jsr305:3.0.2"
+jetbrainsAnnotations = "org.jetbrains:annotations:24.1.0"
+
+junit = "org.junit.jupiter:junit-jupiter:5.10.0-M1"
+
+mockito-bom = "org.mockito:mockito-bom:5.11.0"
+mockito-core.module = "org.mockito:mockito-core"
+mockito-junit-jupiter.module = "org.mockito:mockito-junit-jupiter"
+
+commonsCli = "commons-cli:commons-cli:1.4"
+
+paperApi = "io.papermc.paper:paper-api:1.20.2-R0.1-SNAPSHOT"
+paperLib = "io.papermc:paperlib:1.0.8"
+
+bstats = "org.bstats:bstats-bukkit:3.0.0"
+spigotutils = "de.derfrzocker:spigot-utils:97"
+exp4j = "net.objecthunter:exp4j:0.4.8"
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 00000000..a4b76b95
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 00000000..cea7a793
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,7 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip
+networkTimeout=10000
+validateDistributionUrl=true
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 00000000..f5feea6d
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,252 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+# SPDX-License-Identifier: Apache-2.0
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
+' "$PWD" ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ 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.
+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=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# 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" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 00000000..9d21a218
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,94 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+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
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+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
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/impl/pom.xml b/impl/pom.xml
deleted file mode 100644
index 77eec655..00000000
--- a/impl/pom.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-
-
- 4.0.0
-
-
- ore-control-parent
- de.derfrzocker
- ${revision}
-
-
-
- v1_18_R1
- v1_18_R2
- v1_19_R1
- v1_19_R2
- v1_19_R3
- v1_20_R1
- v1_20_R2
- v1_20_R3
- v1_20_R4
- v1_21_R1
- v1_21_R2
- v1_21_R3
-
-
- ore-control-impl
- pom
-
-
\ No newline at end of file
diff --git a/impl/v1_18_R1/pom.xml b/impl/v1_18_R1/pom.xml
deleted file mode 100644
index 9081a326..00000000
--- a/impl/v1_18_R1/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
- 4.0.0
-
-
- ore-control-impl
- de.derfrzocker
- ${revision}
-
-
- ore-control-impl-v1_18_R1
-
-
-
- de.derfrzocker
- ore-control-api
- ${project.version}
- provided
-
-
- de.derfrzocker
- ore-control-common
- ${project.version}
- provided
-
-
- org.spigotmc
- spigot
- 1.18.1-R0.1-SNAPSHOT
- remapped-mojang
- provided
- true
-
-
-
-
-
-
- net.md-5
- specialsource-maven-plugin
- 1.2.3
-
-
- package
-
- remap
-
- remap-obf
-
- org.spigotmc:minecraft-server:1.18.1-R0.1-SNAPSHOT:txt:maps-mojang
- true
- org.spigotmc:spigot:1.18.1-R0.1-SNAPSHOT:jar:remapped-mojang
-
- true
- remapped-obf
-
-
-
- package
-
- remap
-
- remap-spigot
-
-
- ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
-
- org.spigotmc:minecraft-server:1.18.1-R0.1-SNAPSHOT:csrg:maps-spigot
- org.spigotmc:spigot:1.18.1-R0.1-SNAPSHOT:jar:remapped-obf
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGenerator.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGenerator.java
deleted file mode 100644
index 4b9e26eb..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGenerator.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Configuration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.Random;
-import java.util.Set;
-
-public class GlowstoneBlobFeatureGenerator extends MinecraftFeatureGenerator {
-
- public GlowstoneBlobFeatureGenerator(Registries registries) {
- super(registries, Feature.GLOWSTONE_BLOB, "glowstone_blob");
- }
-
- @Override
- public @NotNull Set getSettings() {
- return Collections.emptySet();
- }
-
- @Override
- public @NotNull Configuration createEmptyConfiguration() {
- return new EmptyFeatureConfiguration(this);
- }
-
- @Override
- public EmptyFeatureConfiguration mergeConfig(EmptyFeatureConfiguration first, EmptyFeatureConfiguration second) {
- return first;
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
-
- @Override
- public JsonElement toJson(EmptyFeatureConfiguration value) {
- return new JsonObject();
- }
-
- @Override
- public EmptyFeatureConfiguration fromJson(JsonElement jsonElement) {
- return new EmptyFeatureConfiguration(GlowstoneBlobFeatureGenerator.this);
- }
- };
- }
-
- @Override
- public NoneFeatureConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull EmptyFeatureConfiguration configuration) {
- return NoneFeatureConfiguration.INSTANCE;
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/MinecraftFeatureGenerator.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/MinecraftFeatureGenerator.java
deleted file mode 100644
index a2cb5a47..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/MinecraftFeatureGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.feature.generator;
-
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.util.Parser;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
-import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-import java.util.Random;
-
-public abstract class MinecraftFeatureGenerator implements FeatureGenerator {
-
- private final Parser parser;
- private final Feature feature;
- private final NamespacedKey namespacedKey;
-
- public MinecraftFeatureGenerator(Registries registries, Feature feature, String name) {
- this.parser = (Parser) createParser(registries);
- this.feature = feature;
- this.namespacedKey = NamespacedKey.minecraft(name);
- }
-
- public abstract C mergeConfig(C first, C second);
-
- public abstract Parser createParser(Registries registries);
-
- public abstract M createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @NotNull
- @Override
- public C merge(@NotNull FeatureGeneratorConfiguration first, @NotNull FeatureGeneratorConfiguration second) {
- return mergeConfig((C) first, (C) second);
- }
-
- @Override
- public void place(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration) {
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- M config = createConfiguration(worldInfo, random, position, limitedRegion, configuration);
- feature.place(new FeaturePlaceContext<>(Optional.empty(), level, level.getMinecraftWorld().getChunkSource().getGenerator(), random, new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()), config));
- }
-
- @NotNull
- @Override
- public Parser getParser() {
- return parser;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/OreFeatureGenerator.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/OreFeatureGenerator.java
deleted file mode 100644
index 91092372..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/OreFeatureGenerator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetValue;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-public class OreFeatureGenerator extends MinecraftFeatureGenerator {
-
- public OreFeatureGenerator(Registries registries) {
- super(registries, OreFeature.ORE, "ore");
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(OreFeatureConfiguration value) {
- JsonObject jsonObject = new JsonObject();
-
- if (value.getSize() != null) {
- JsonObject size = value.getSize().getValueType().getParser().toJson(value.getSize()).getAsJsonObject();
- size.addProperty("size_type", value.getSize().getValueType().getKey().toString());
- jsonObject.add("size", size);
- }
-
- if (value.getDiscardChanceOnAirExposure() != null) {
- JsonObject discardChanceOnAirExposure = value.getDiscardChanceOnAirExposure().getValueType().getParser().toJson(value.getDiscardChanceOnAirExposure()).getAsJsonObject();
- discardChanceOnAirExposure.addProperty("discard_chance_on_air_exposure_type", value.getDiscardChanceOnAirExposure().getValueType().getKey().toString());
- }
-
- return jsonObject;
- }
-
- @Override
- public OreFeatureConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue size = null;
- if (jsonObject.has("size")) {
- JsonObject sizes = jsonObject.getAsJsonObject("size");
- size = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(sizes.getAsJsonPrimitive("size_type").getAsString())).get().getParser().fromJson(sizes);
- }
-
- FloatValue discardChanceOnAirExposure = null;
- if (jsonObject.has("discard_chance_on_air_exposure")) {
- JsonObject chance = jsonObject.getAsJsonObject("discard_chance_on_air_exposure");
- discardChanceOnAirExposure = registries.getValueTypeRegistry(FloatType.class).get(NamespacedKey.fromString(chance.getAsJsonPrimitive("discard_chance_on_air_exposure_type").getAsString())).get().getParser().fromJson(chance);
- }
-
- return new OreFeatureConfiguration(OreFeatureGenerator.this, null, size, discardChanceOnAirExposure);
- }
- };
- }
-
- @Override
- public OreFeatureConfiguration mergeConfig(OreFeatureConfiguration first, OreFeatureConfiguration second) {
- return new OreFeatureConfiguration(this,
- first.getTargets() != null ? first.getTargets() : second.getTargets(),
- first.getSize() != null ? first.getSize() : second.getSize(),
- first.getDiscardChanceOnAirExposure() != null ? first.getDiscardChanceOnAirExposure() : second.getDiscardChanceOnAirExposure());
- }
-
- @Override
- public OreConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates = new ArrayList<>();
- if (configuration.getTargets() != null) {
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size = 0;
- if (configuration.getSize() != null) {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure = 0f;
- if (configuration.getDiscardChanceOnAirExposure() != null) {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return OreFeatureConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public OreFeatureConfiguration createEmptyConfiguration() {
- return new OreFeatureConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/ScatteredOreGenerator.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/ScatteredOreGenerator.java
deleted file mode 100644
index a460963c..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/ScatteredOreGenerator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetValue;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-public class ScatteredOreGenerator extends MinecraftFeatureGenerator {
-
- public ScatteredOreGenerator(Registries registries) {
- super(registries, OreFeature.SCATTERED_ORE, "scattered_ore");
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(OreFeatureConfiguration value) {
- JsonObject jsonObject = new JsonObject();
-
- if (value.getSize() != null) {
- JsonObject size = value.getSize().getValueType().getParser().toJson(value.getSize()).getAsJsonObject();
- size.addProperty("size_type", value.getSize().getValueType().getKey().toString());
- jsonObject.add("size", size);
- }
-
- if (value.getDiscardChanceOnAirExposure() != null) {
- JsonObject discardChanceOnAirExposure = value.getDiscardChanceOnAirExposure().getValueType().getParser().toJson(value.getDiscardChanceOnAirExposure()).getAsJsonObject();
- discardChanceOnAirExposure.addProperty("discard_chance_on_air_exposure_type", value.getDiscardChanceOnAirExposure().getValueType().getKey().toString());
- }
-
- return jsonObject;
- }
-
- @Override
- public OreFeatureConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue size = null;
- if (jsonObject.has("size")) {
- JsonObject sizes = jsonObject.getAsJsonObject("size");
- size = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(sizes.getAsJsonPrimitive("size_type").getAsString())).get().getParser().fromJson(sizes);
- }
-
- FloatValue discardChanceOnAirExposure = null;
- if (jsonObject.has("discard_chance_on_air_exposure")) {
- JsonObject chance = jsonObject.getAsJsonObject("discard_chance_on_air_exposure");
- discardChanceOnAirExposure = registries.getValueTypeRegistry(FloatType.class).get(NamespacedKey.fromString(chance.getAsJsonPrimitive("discard_chance_on_air_exposure_type").getAsString())).get().getParser().fromJson(chance);
- }
-
- return new OreFeatureConfiguration(ScatteredOreGenerator.this, null, size, discardChanceOnAirExposure);
- }
- };
- }
-
- @Override
- public OreFeatureConfiguration mergeConfig(OreFeatureConfiguration first, OreFeatureConfiguration second) {
- return new OreFeatureConfiguration(this,
- first.getTargets() != null ? first.getTargets() : second.getTargets(),
- first.getSize() != null ? first.getSize() : second.getSize(),
- first.getDiscardChanceOnAirExposure() != null ? first.getDiscardChanceOnAirExposure() : second.getDiscardChanceOnAirExposure());
- }
-
- @Override
- public OreConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates = new ArrayList<>();
- if (configuration.getTargets() != null) {
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size = 0;
- if (configuration.getSize() != null) {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure = 0f;
- if (configuration.getDiscardChanceOnAirExposure() != null) {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return OreFeatureConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public OreFeatureConfiguration createEmptyConfiguration() {
- return new OreFeatureConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/configuration/OreFeatureConfiguration.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/configuration/OreFeatureConfiguration.java
deleted file mode 100644
index 24f32d20..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/feature/generator/configuration/OreFeatureConfiguration.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration;
-
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.Value;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetValue;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-public class OreFeatureConfiguration implements FeatureGeneratorConfiguration {
-
- public final static Set SETTINGS;
- private final static Setting SIZE = new Setting("size", IntegerType.class);
- private final static Setting DISCARD_CHANCE_ON_AIR_EXPOSURE = new Setting("discard-chance-on-air-exposure", FloatType.class);
-
- static {
- Set settings = new LinkedHashSet<>();
- settings.add(SIZE);
- settings.add(DISCARD_CHANCE_ON_AIR_EXPOSURE);
- SETTINGS = Collections.unmodifiableSet(settings);
- }
-
- private final FeatureGenerator> featureGenerator;
- private final List targets;
- private IntegerValue size;
- private FloatValue discardChanceOnAirExposure;
- private boolean dirty = false;
-
- public OreFeatureConfiguration(FeatureGenerator> featureGenerator, List targets, IntegerValue size, FloatValue discardChanceOnAirExposure) {
- this.featureGenerator = featureGenerator;
- this.targets = targets;
- this.size = size;
- this.discardChanceOnAirExposure = discardChanceOnAirExposure;
- }
-
- public List getTargets() {
- return targets;
- }
-
- public IntegerValue getSize() {
- return size;
- }
-
- public FloatValue getDiscardChanceOnAirExposure() {
- return discardChanceOnAirExposure;
- }
-
- @NotNull
- @Override
- public FeatureGenerator> getOwner() {
- return featureGenerator;
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SETTINGS;
- }
-
- @Override
- public Value, ?, ?> getValue(@NotNull Setting setting) {
- if (setting == SIZE) {
- return getSize();
- }
-
- if (setting == DISCARD_CHANCE_ON_AIR_EXPOSURE) {
- return getDiscardChanceOnAirExposure();
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "OreFeatureConfiguration"));
- }
-
- @Override
- public void setValue(@NotNull Setting setting, Value, ?, ?> value) {
- if (setting == SIZE) {
- size = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- if (setting == DISCARD_CHANCE_ON_AIR_EXPOSURE) {
- discardChanceOnAirExposure = (FloatValue) value;
- dirty = true;
- return;
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "OreFeatureConfiguration"));
- }
-
- @Override
- public boolean isDirty() {
- if (dirty) {
- return true;
- }
-
- if (size != null && size.isDirty()) {
- return true;
- }
-
- return discardChanceOnAirExposure != null && discardChanceOnAirExposure.isDirty();
- }
-
- @Override
- public void saved() {
- dirty = false;
-
- if (size != null) {
- size.saved();
- }
-
- if (discardChanceOnAirExposure != null) {
- discardChanceOnAirExposure.saved();
- }
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/CountModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/CountModifier.java
deleted file mode 100644
index 019bb95f..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/CountModifier.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.CountModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class CountModifier extends MinecraftPlacementModifier {
-
- public CountModifier(@NotNull Registries registries) {
- super(registries, "count");
- }
-
- @Override
- public CountModifierConfiguration mergeConfig(CountModifierConfiguration first, CountModifierConfiguration second) {
- return new CountModifierConfiguration(this,
- first.getCount() != null ? first.getCount() : second.getCount());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(CountModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getCount() != null) {
- JsonObject entry = value.getCount().getValueType().getParser().toJson(value.getCount()).getAsJsonObject();
- entry.addProperty("count_type", value.getCount().getValueType().getKey().toString());
- jsonObject.add("count", entry);
- }
- return jsonObject;
- }
-
- @Override
- public CountModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("count")) {
- JsonObject entry = jsonObject.getAsJsonObject("count");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("count_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new CountModifierConfiguration(CountModifier.this, count);
- }
- };
- }
-
- @Override
- public CountPlacement createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull CountModifierConfiguration configuration) {
- int count;
- if (configuration.getCount() != null) {
- count = configuration.getCount().getValue(worldInfo, random, position, limitedRegion);
- } else {
- count = 0;
- }
-
- return CountPlacement.of(count);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return CountModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public CountModifierConfiguration createEmptyConfiguration() {
- return new CountModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/HeightRangeModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/HeightRangeModifier.java
deleted file mode 100644
index 54f9d9b1..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/HeightRangeModifier.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.HeightRangeModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.VerticalAnchor;
-import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class HeightRangeModifier extends MinecraftPlacementModifier {
-
- public HeightRangeModifier(@NotNull Registries registries) {
- super(registries, "height_range");
- }
-
- @Override
- public HeightRangeModifierConfiguration mergeConfig(HeightRangeModifierConfiguration first, HeightRangeModifierConfiguration second) {
- return new HeightRangeModifierConfiguration(this,
- first.getHeight() != null ? first.getHeight() : second.getHeight());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(HeightRangeModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getHeight() != null) {
- JsonObject entry = value.getHeight().getValueType().getParser().toJson(value.getHeight()).getAsJsonObject();
- entry.addProperty("height_range_type", value.getHeight().getValueType().getKey().toString());
- jsonObject.add("height", entry);
- }
- return jsonObject;
- }
-
- @Override
- public HeightRangeModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("height")) {
- JsonObject entry = jsonObject.getAsJsonObject("height");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("height_range_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new HeightRangeModifierConfiguration(HeightRangeModifier.this, count);
- }
- };
- }
-
- @Override
- public HeightRangePlacement createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull HeightRangeModifierConfiguration configuration) {
- HeightProvider height;
- if (configuration.getHeight() != null) {
- height = ConstantHeight.of(VerticalAnchor.absolute(configuration.getHeight().getValue(worldInfo, random, position, limitedRegion)));
- } else {
- height = ConstantHeight.of(VerticalAnchor.bottom());
- }
-
- return HeightRangePlacement.of(height);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return HeightRangeModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public HeightRangeModifierConfiguration createEmptyConfiguration() {
- return new HeightRangeModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/MinecraftPlacementModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/MinecraftPlacementModifier.java
deleted file mode 100644
index 90ec7f76..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/MinecraftPlacementModifier.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.util.Parser;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.levelgen.placement.PlacementContext;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-import java.util.Random;
-import java.util.stream.Stream;
-
-public abstract class MinecraftPlacementModifier implements FeaturePlacementModifier {
-
- private final Parser parser;
- private final NamespacedKey namespacedKey;
-
- public MinecraftPlacementModifier(@NotNull Registries registries, @NotNull String name) {
- this.parser = (Parser) createParser(registries);
- this.namespacedKey = NamespacedKey.minecraft(name);
- }
-
- public abstract C mergeConfig(C first, C second);
-
- public abstract Parser createParser(Registries registries);
-
- public abstract M createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @NotNull
- @Override
- public C merge(@NotNull PlacementModifierConfiguration first, @NotNull PlacementModifierConfiguration second) {
- return mergeConfig((C) first, (C) second);
- }
-
- @NotNull
- @Override
- public Stream getPositions(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration) {
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- M placementModifier = createPlacementModifier(worldInfo, random, position, limitedRegion, configuration);
- return placementModifier.getPositions(new PlacementContext(level, level.getMinecraftWorld().getChunkSource().getGenerator(), Optional.empty()), random, new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ())).
- map(pos -> new BlockVector(pos.getX(), pos.getY(), pos.getZ()));
- }
-
- @NotNull
- @Override
- public Parser getParser() {
- return parser;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/RarityModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/RarityModifier.java
deleted file mode 100644
index 34ab05d8..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/RarityModifier.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.RarityModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class RarityModifier extends MinecraftPlacementModifier {
-
- public RarityModifier(@NotNull Registries registries) {
- super(registries, "rarity_filter");
- }
-
-
- @Override
- public RarityModifierConfiguration mergeConfig(RarityModifierConfiguration first, RarityModifierConfiguration second) {
- return new RarityModifierConfiguration(this,
- first.getChance() != null ? first.getChance() : second.getChance());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(RarityModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getChance() != null) {
- JsonObject entry = value.getChance().getValueType().getParser().toJson(value.getChance()).getAsJsonObject();
- entry.addProperty("chance_type", value.getChance().getValueType().getKey().toString());
- jsonObject.add("chance", entry);
- }
- return jsonObject;
- }
-
- @Override
- public RarityModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("chance")) {
- JsonObject entry = jsonObject.getAsJsonObject("chance");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("chance_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new RarityModifierConfiguration(RarityModifier.this, count);
- }
- };
- }
-
- @Override
- public RarityFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull RarityModifierConfiguration configuration) {
- int chance = 0;
- if (configuration.getChance() != null) {
- chance = configuration.getChance().getValue(worldInfo, random, position, limitedRegion);
- }
- return RarityFilter.onAverageOnceEvery(chance);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return RarityModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public RarityModifierConfiguration createEmptyConfiguration() {
- return new RarityModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifier.java
deleted file mode 100644
index 26a18046..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifier.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.configuration.SurfaceRelativeThresholdModifierConfiguration;
-import net.minecraft.world.level.levelgen.Heightmap;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class SurfaceRelativeThresholdModifier extends MinecraftPlacementModifier {
- public SurfaceRelativeThresholdModifier(@NotNull Registries registries) {
- super(registries, "surface_relative_threshold_filter");
- }
-
- @Override
- public SurfaceRelativeThresholdModifierConfiguration mergeConfig(SurfaceRelativeThresholdModifierConfiguration first, SurfaceRelativeThresholdModifierConfiguration second) {
- return new SurfaceRelativeThresholdModifierConfiguration(this,
- first.getHeightmap() != null ? first.getHeightmap() : second.getHeightmap(),
- first.getMinInclusive() != null ? first.getMinInclusive() : second.getMinInclusive(),
- first.getMaxInclusive() != null ? first.getMaxInclusive() : second.getMaxInclusive());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(SurfaceRelativeThresholdModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getMinInclusive() != null) {
- JsonObject entry = value.getMinInclusive().getValueType().getParser().toJson(value.getMinInclusive()).getAsJsonObject();
- entry.addProperty("min_inclusive_type", value.getMinInclusive().getValueType().getKey().toString());
- jsonObject.add("min_inclusive", entry);
- }
-
- if (value.getMaxInclusive() != null) {
- JsonObject entry = value.getMaxInclusive().getValueType().getParser().toJson(value.getMaxInclusive()).getAsJsonObject();
- entry.addProperty("max_inclusive_type", value.getMaxInclusive().getValueType().getKey().toString());
- jsonObject.add("max_inclusive", entry);
- }
-
- return jsonObject;
- }
-
- @Override
- public SurfaceRelativeThresholdModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue minInclusive = null;
- if (jsonObject.has("min_inclusive")) {
- JsonObject entry = jsonObject.getAsJsonObject("min_inclusive");
- minInclusive = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("min_inclusive_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- IntegerValue maxInclusive = null;
- if (jsonObject.has("max_inclusive")) {
- JsonObject entry = jsonObject.getAsJsonObject("max_inclusive");
- maxInclusive = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("max_inclusive_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new SurfaceRelativeThresholdModifierConfiguration(SurfaceRelativeThresholdModifier.this, null, minInclusive, maxInclusive);
- }
- };
- }
-
- @Override
- public SurfaceRelativeThresholdFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceRelativeThresholdModifierConfiguration configuration) {
- Heightmap.Types heightmap = Heightmap.Types.MOTION_BLOCKING;
- if (configuration.getHeightmap() != null) {
- heightmap = configuration.getHeightmap().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int minInclusive = 0;
- if (configuration.getMinInclusive() != null) {
- minInclusive = configuration.getMinInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int maxInclusive = 0;
- if (configuration.getMaxInclusive() != null) {
- maxInclusive = configuration.getMaxInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
- return SurfaceRelativeThresholdFilter.of(heightmap, minInclusive, maxInclusive);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SurfaceRelativeThresholdModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public SurfaceRelativeThresholdModifierConfiguration createEmptyConfiguration() {
- return new SurfaceRelativeThresholdModifierConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceWaterDepthModifier.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceWaterDepthModifier.java
deleted file mode 100644
index 9bff5da0..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/SurfaceWaterDepthModifier.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.SurfaceWaterDepthModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class SurfaceWaterDepthModifier extends MinecraftPlacementModifier {
-
- public SurfaceWaterDepthModifier(@NotNull Registries registries) {
- super(registries, "surface_water_depth_filter");
- }
-
- @Override
- public SurfaceWaterDepthModifierConfiguration mergeConfig(SurfaceWaterDepthModifierConfiguration first, SurfaceWaterDepthModifierConfiguration second) {
- return new SurfaceWaterDepthModifierConfiguration(this,
- first.getMaxWaterDepth() != null ? first.getMaxWaterDepth() : second.getMaxWaterDepth());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(SurfaceWaterDepthModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getMaxWaterDepth() != null) {
- JsonObject entry = value.getMaxWaterDepth().getValueType().getParser().toJson(value.getMaxWaterDepth()).getAsJsonObject();
- entry.addProperty("max_water_depth_type", value.getMaxWaterDepth().getValueType().getKey().toString());
- jsonObject.add("max_water_depth", entry);
- }
- return jsonObject;
- }
-
- @Override
- public SurfaceWaterDepthModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("max_water_depth")) {
- JsonObject entry = jsonObject.getAsJsonObject("max_water_depth");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("max_water_depth_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new SurfaceWaterDepthModifierConfiguration(SurfaceWaterDepthModifier.this, count);
- }
- };
- }
-
- @Override
- public SurfaceWaterDepthFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceWaterDepthModifierConfiguration configuration) {
- int maxWaterDepth = 0;
- if (configuration.getMaxWaterDepth() != null) {
- maxWaterDepth = configuration.getMaxWaterDepth().getValue(worldInfo, random, position, limitedRegion);
- }
- return SurfaceWaterDepthFilter.forMaxDepth(maxWaterDepth);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SurfaceWaterDepthModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public SurfaceWaterDepthModifierConfiguration createEmptyConfiguration() {
- return new SurfaceWaterDepthModifierConfiguration(this, null);
- }
-}
\ No newline at end of file
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java
deleted file mode 100644
index 8296e1e9..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.placement.configuration;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.Value;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.heightmap.HeightmapValue;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-public class SurfaceRelativeThresholdModifierConfiguration implements PlacementModifierConfiguration {
-
- public final static Set SETTINGS;
- private final static Setting MIN_INCLUSIVE = new Setting("min-inclusive", IntegerType.class);
- private final static Setting MAX_INCLUSIVE = new Setting("max-inclusive", IntegerType.class);
-
- static {
- Set settings = new LinkedHashSet<>();
- settings.add(MIN_INCLUSIVE);
- settings.add(MAX_INCLUSIVE);
- SETTINGS = Collections.unmodifiableSet(settings);
- }
-
- private final FeaturePlacementModifier> placementModifier;
- private final HeightmapValue heightmap;
- private IntegerValue minInclusive;
- private IntegerValue maxInclusive;
- private boolean dirty = false;
-
- public SurfaceRelativeThresholdModifierConfiguration(FeaturePlacementModifier> placementModifier, HeightmapValue heightmap, IntegerValue minInclusive, IntegerValue maxInclusive) {
- this.placementModifier = placementModifier;
- this.heightmap = heightmap;
- this.minInclusive = minInclusive;
- this.maxInclusive = maxInclusive;
- }
-
- @NotNull
- @Override
- public FeaturePlacementModifier> getOwner() {
- return placementModifier;
- }
-
- public HeightmapValue getHeightmap() {
- return heightmap;
- }
-
- public IntegerValue getMinInclusive() {
- return minInclusive;
- }
-
- public IntegerValue getMaxInclusive() {
- return maxInclusive;
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SETTINGS;
- }
-
- @Override
- public Value, ?, ?> getValue(@NotNull Setting setting) {
- if (setting == MIN_INCLUSIVE) {
- return getMinInclusive();
- }
-
- if (setting == MAX_INCLUSIVE) {
- return getMaxInclusive();
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "SurfaceRelativeThresholdModifierConfiguration"));
- }
-
- @Override
- public void setValue(@NotNull Setting setting, Value, ?, ?> value) {
- if (setting == MIN_INCLUSIVE) {
- minInclusive = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- if (setting == MAX_INCLUSIVE) {
- maxInclusive = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "SurfaceRelativeThresholdModifierConfiguration"));
- }
-
- @Override
- public boolean isDirty() {
- if (dirty) {
- return true;
- }
-
- if (minInclusive != null && minInclusive.isDirty()) {
- return true;
- }
-
- return maxInclusive != null && maxInclusive.isDirty();
- }
-
- @Override
- public void saved() {
- dirty = false;
-
- if (minInclusive != null) {
- minInclusive.saved();
- }
-
- if (maxInclusive != null) {
- maxInclusive.saved();
- }
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapType.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapType.java
deleted file mode 100644
index e031730c..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.heightmap;
-
-import de.derfrzocker.feature.api.ValueType;
-import net.minecraft.world.level.levelgen.Heightmap;
-
-public abstract class HeightmapType implements ValueType {
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapValue.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapValue.java
deleted file mode 100644
index 4455b6df..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/heightmap/HeightmapValue.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.heightmap;
-
-import de.derfrzocker.feature.common.AbstractValue;
-import net.minecraft.world.level.levelgen.Heightmap;
-
-public abstract class HeightmapValue extends AbstractValue {
-
- @Override
- public abstract HeightmapValue clone();
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSAboveBottomOffsetIntegerValue.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSAboveBottomOffsetIntegerValue.java
deleted file mode 100644
index be973050..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSAboveBottomOffsetIntegerValue.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.offset;
-
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.offset.AboveBottomOffsetIntegerValue;
-import net.minecraft.world.level.WorldGenLevel;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class NMSAboveBottomOffsetIntegerValue extends AboveBottomOffsetIntegerValue {
-
- public NMSAboveBottomOffsetIntegerValue(IntegerValue base) {
- super(base);
- }
-
- @Override
- public Integer getValue(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion) {
- int baseValue = getBase() == null ? 0 : getBase().getValue(worldInfo, random, position, limitedRegion);
-
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
-
- return Math.max(level.getMinBuildHeight(), level.getLevel().getChunkSource().chunkMap.generator.getMinY()) + baseValue;
- }
-
- @Override
- public AboveBottomOffsetIntegerValue clone() {
- return new NMSAboveBottomOffsetIntegerValue(getBase() == null ? null : getBase().clone());
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSBelowTopOffsetIntegerValue.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSBelowTopOffsetIntegerValue.java
deleted file mode 100644
index 89d89699..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/offset/NMSBelowTopOffsetIntegerValue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.offset;
-
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.offset.BelowTopOffsetIntegerValue;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class NMSBelowTopOffsetIntegerValue extends BelowTopOffsetIntegerValue {
-
- public NMSBelowTopOffsetIntegerValue(IntegerValue base) {
- super(base);
- }
-
- @Override
- public Integer getValue(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion) {
- int baseValue = getBase() == null ? 0 : getBase().getValue(worldInfo, random, position, limitedRegion);
-
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- ChunkGenerator chunkGenerator = level.getLevel().getChunkSource().chunkMap.generator;
-
- return Math.min(level.getHeight(), chunkGenerator.getGenDepth()) - 1 + Math.max(level.getMinBuildHeight(), chunkGenerator.getMinY()) - baseValue;
- }
-
- @Override
- public NMSBelowTopOffsetIntegerValue clone() {
- return new NMSBelowTopOffsetIntegerValue(getBase() == null ? null : getBase().clone());
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetType.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetType.java
deleted file mode 100644
index 13060b4f..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.target;
-
-import de.derfrzocker.feature.api.ValueType;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-
-public abstract class TargetType implements ValueType {
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetValue.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetValue.java
deleted file mode 100644
index 7e88d603..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/feature/impl/v1_18_R1/value/target/TargetValue.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R1.value.target;
-
-import de.derfrzocker.feature.common.AbstractValue;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-
-public abstract class TargetValue extends AbstractValue {
-
- @Override
- public abstract TargetValue clone();
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/ConversionUtil.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/ConversionUtil.java
deleted file mode 100644
index 78cd6332..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/ConversionUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1;
-
-import de.derfrzocker.feature.common.value.number.FixedFloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.biased.BiasedToBottomIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.clamped.ClampedIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.clamped.ClampedNormalIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.uniform.UniformIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.weighted.WeightedListIntegerValue;
-import net.minecraft.util.random.SimpleWeightedRandomList;
-import net.minecraft.util.random.WeightedEntry;
-import net.minecraft.util.valueproviders.ClampedInt;
-import net.minecraft.util.valueproviders.ClampedNormalInt;
-import net.minecraft.util.valueproviders.IntProvider;
-import net.minecraft.util.valueproviders.IntProviderType;
-import net.minecraft.util.valueproviders.WeightedListInt;
-
-import java.lang.reflect.Field;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-public final class ConversionUtil {
-
- private ConversionUtil() {
- }
-
- public static IntegerValue convert(IntProvider intProvider) {
- try {
- if (intProvider.getType() == IntProviderType.CONSTANT) {
- return new FixedDoubleToIntegerValue(intProvider.getMinValue());
- } else if (intProvider.getType() == IntProviderType.UNIFORM) {
- return new UniformIntegerValue(new FixedDoubleToIntegerValue(intProvider.getMinValue()), new FixedDoubleToIntegerValue(intProvider.getMaxValue()));
- } else if (intProvider.getType() == IntProviderType.BIASED_TO_BOTTOM) {
- return new BiasedToBottomIntegerValue(new FixedDoubleToIntegerValue(intProvider.getMinValue()), new FixedDoubleToIntegerValue(intProvider.getMaxValue()));
- } else if (intProvider.getType() == IntProviderType.CLAMPED) {
- Field sourceField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_SOURCE);
- Field minField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_MIN_INCLUSIVE);
- Field maxField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_MAX_INCLUSIVE);
- sourceField.setAccessible(true);
- minField.setAccessible(true);
- maxField.setAccessible(true);
-
- IntProvider source = (IntProvider) sourceField.get(intProvider);
- int min = (int) minField.get(intProvider);
- int max = (int) maxField.get(intProvider);
- return new ClampedIntegerValue(convert(source), new FixedDoubleToIntegerValue(min), new FixedDoubleToIntegerValue(max));
- } else if (intProvider.getType() == IntProviderType.WEIGHTED_LIST) {
- Field distributionField = WeightedListInt.class.getDeclaredField(NMSReflectionNames.WEIGHTED_LIST_INT_DISTRIBUTION);
- distributionField.setAccessible(true);
- SimpleWeightedRandomList distribution = (SimpleWeightedRandomList) distributionField.get(intProvider);
-
- Map values = new LinkedHashMap<>();
- for (WeightedEntry.Wrapper wrapper : distribution.unwrap()) {
- values.put(convert(wrapper.getData()), new FixedDoubleToIntegerValue(wrapper.getWeight().asInt()));
- }
-
- return new WeightedListIntegerValue(values);
- } else if (intProvider.getType() == IntProviderType.CLAMPED_NORMAL) {
- Field meanField = ClampedNormalInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_NORMAL_INT_MEAN);
- Field deviationField = ClampedNormalInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_NORMAL_INT_DEVIATION);
- meanField.setAccessible(true);
- deviationField.setAccessible(true);
-
- float mean = (float) meanField.get(intProvider);
- float deviation = (float) meanField.get(intProvider);
- int min = intProvider.getMinValue();
- int max = intProvider.getMaxValue();
- return new ClampedNormalIntegerValue(new FixedFloatValue(mean), new FixedFloatValue(deviation), new FixedDoubleToIntegerValue(min), new FixedDoubleToIntegerValue(max));
- } else {
- throw new UnsupportedOperationException(String.format("No integer value equivalent for IntProvider '%s'", intProvider));
- }
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReflectionNames.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReflectionNames.java
deleted file mode 100644
index 4f0b5094..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReflectionNames.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1;
-
-public final class NMSReflectionNames {
-
- public final static String BIOME_GENERATION_SETTINGS_FEATURES = "e";
- public final static String BIOME_GENERATION_SETTINGS_FEATURE_SET = "g";
- public final static String WEIGHTED_LIST_INT_DISTRIBUTION = "b";
- public final static String COUNT_PLACEMENT_COUNT = "c";
- public final static String HEIGHT_RANGE_PLACEMENT_HEIGHT = "c";
- public final static String RARITY_FILTER_CHANCE = "c";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_HEIGHTMAP = "c";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_MIN_INCLUSIVE = "d";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_MAX_INCLUSIVE = "e";
- public final static String SURFACE_WATER_DEPTH_FILTER_MAX_WATER_DEPTH = "c";
- public static final String CLAMPED_INT_SOURCE = "b";
- public static final String CLAMPED_INT_MIN_INCLUSIVE = "f";
- public static final String CLAMPED_INT_MAX_INCLUSIVE = "g";
- public static final String CLAMPED_NORMAL_INT_MEAN = "b";
- public static final String CLAMPED_NORMAL_INT_DEVIATION = "f";
-
- private NMSReflectionNames() {
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReplacer_v1_18_R1.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReplacer_v1_18_R1.java
deleted file mode 100644
index b92cbce1..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/NMSReplacer_v1_18_R1.java
+++ /dev/null
@@ -1,484 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1;
-
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import de.derfrzocker.feature.common.value.number.FixedFloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.offset.AboveBottomOffsetIntegerType;
-import de.derfrzocker.feature.common.value.offset.BelowTopOffsetIntegerType;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.GlowstoneBlobFeatureGenerator;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.OreFeatureGenerator;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.ScatteredOreGenerator;
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.CountModifier;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.HeightRangeModifier;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.RarityModifier;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.SurfaceRelativeThresholdModifier;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.SurfaceWaterDepthModifier;
-import de.derfrzocker.feature.impl.v1_18_R1.value.heightmap.HeightmapType;
-import de.derfrzocker.feature.impl.v1_18_R1.value.offset.NMSAboveBottomOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.offset.NMSBelowTopOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetType;
-import de.derfrzocker.ore.control.api.NMSReplacer;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.OreControlRegistries;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator.GlowstoneBlobFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator.OreFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator.ScatteredOreFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.placement.CountModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.placement.HeightRangeModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.placement.RarityModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.placement.SurfaceRelativeThresholdModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R1.placement.SurfaceWaterDepthModifierHook;
-import net.minecraft.core.Registry;
-import net.minecraft.core.RegistryAccess;
-import net.minecraft.data.BuiltinRegistries;
-import net.minecraft.resources.ResourceKey;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.server.dedicated.DedicatedServer;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.world.level.biome.Biome;
-import net.minecraft.world.level.biome.BiomeGenerationSettings;
-import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.GlowstoneFeature;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.ScatteredOreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import net.minecraft.world.level.levelgen.placement.PlacedFeature;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter;
-import org.bukkit.Bukkit;
-import org.bukkit.NamespacedKey;
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_18_R1.CraftServer;
-import org.bukkit.craftbukkit.v1_18_R1.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R1.util.CraftNamespacedKey;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-public class NMSReplacer_v1_18_R1 implements NMSReplacer {
-
- private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
- private final Parser configParser;
- private final OreControlManager oreControlManager;
- @NotNull
- private final OreControlRegistries registries;
- private final ConfigManager configManager;
-
- public NMSReplacer_v1_18_R1(@NotNull OreControlManager oreControlManager, Parser configParser) {
- this.oreControlManager = oreControlManager;
- this.registries = oreControlManager.getRegistries();
- this.configManager = oreControlManager.getConfigManager();
- this.configParser = configParser;
- }
-
- @Override
- public void register() {
- registerValueTypes();
- registerFeatureGenerators();
- registerPlacementModifier();
- registerFeatures();
- registerBiomes();
- }
-
- private void registerValueTypes() {
- registries.getValueTypeRegistry(IntegerType.class).register(new AboveBottomOffsetIntegerType(registries, NMSAboveBottomOffsetIntegerValue::new));
- registries.getValueTypeRegistry(IntegerType.class).register(new BelowTopOffsetIntegerType(registries, NMSBelowTopOffsetIntegerValue::new));
- }
-
- private void registerFeatureGenerators() {
- registries.getFeatureGeneratorRegistry().register(new OreFeatureGenerator(registries));
- registries.getFeatureGeneratorRegistry().register(new ScatteredOreGenerator(registries));
- registries.getFeatureGeneratorRegistry().register(new GlowstoneBlobFeatureGenerator(registries));
- }
-
- private void registerPlacementModifier() {
- registries.getPlacementModifierRegistry().register(new RarityModifier(registries));
- registries.getPlacementModifierRegistry().register(new SurfaceRelativeThresholdModifier(registries));
- registries.getPlacementModifierRegistry().register(new SurfaceWaterDepthModifier(registries));
- registries.getPlacementModifierRegistry().register(new CountModifier(registries));
- registries.getPlacementModifierRegistry().register(new HeightRangeModifier(registries));
- }
-
- private void registerFeatures() {
- Registry placedFeatureRegistry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- Registry> featureRegistry = getRegistry().registryOrThrow(Registry.FEATURE_REGISTRY);
- Registry> placementModifierTypes = getRegistry().registryOrThrow(Registry.PLACEMENT_MODIFIER_REGISTRY);
-
- for (PlacedFeature placedFeature : placedFeatureRegistry) {
- Feature> feature = placedFeature.getFeatures().findFirst().get().feature();
- ResourceLocation resourceLocation = featureRegistry.getKey(feature);
- Optional> featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.fromString(resourceLocation.toString()));
-
- if (featureGenerator.isEmpty()) {
- continue;
- }
-
- boolean hasCount = false;
- List> modifiers = new LinkedList<>();
- for (PlacementModifier modifier : placedFeature.getPlacement()) {
- if (modifier.type() == PlacementModifierType.COUNT) {
- hasCount = true;
- }
- ResourceLocation placementModifierType = placementModifierTypes.getKey(modifier.type());
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString(placementModifierType.toString()));
- modifierOptional.ifPresent(modifiers::add);
- }
-
- if (!hasCount) {
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString("minecraft:count"));
- modifierOptional.ifPresent(modifiers::add);
- }
-
- registries.getFeatureRegistry().register(new de.derfrzocker.feature.api.Feature(NamespacedKey.fromString(placedFeatureRegistry.getKey(placedFeature).toString()), featureGenerator.get(), modifiers));
- }
- }
-
- private void registerBiomes() {
- Registry placedFeatureRegistry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- forEachBiome((biome, resourceLocation) -> {
- de.derfrzocker.ore.control.api.Biome bio = new de.derfrzocker.ore.control.api.Biome(CraftNamespacedKey.fromMinecraft(resourceLocation));
-
- biome.getGenerationSettings().features().forEach(featureSet -> featureSet.forEach(holder -> {
- PlacedFeature feature = holder.get();
- ResourceLocation featureKey = placedFeatureRegistry.getKey(feature);
-
- if (featureKey == null) {
- // Skip if the feature is not registered, this can happen if another plugin adds a feature without registering it
- return;
- }
-
- registries.getFeatureRegistry().get(CraftNamespacedKey.fromMinecraft(featureKey)).ifPresent(value -> bio.getFeatures().add(value));
- }));
-
- registries.getBiomeRegistry().register(bio);
- });
- }
-
- @Override
- public void saveDefaultValues(File directory) {
- File world = new File(directory, "world");
- File biomes = new File(directory, "biome");
-
- saveWorldValues(world);
- saveBiomeValues(biomes);
- }
-
- @Override
- public void hookIntoBiomes() {
- forEachBiome((biome, resourceLocation) -> {
- try {
- hookIntoBiome(biome, resourceLocation);
- } catch (final Exception e) {
- throw new RuntimeException("Unexpected error while hooking in NMS for Biome: " + biome, e);
- }
- });
- }
-
- @Override
- public Set getBiomes(World world) {
- Set biomes = new LinkedHashSet<>();
- ServerLevel level = ((CraftWorld) world).getHandle();
- Registry registry = getRegistry().registryOrThrow(Registry.BIOME_REGISTRY);
-
- for (Biome biome : level.getChunkSource().chunkMap.generator.getBiomeSource().possibleBiomes()) {
- ResourceLocation key = registry.getKey(biome);
-
- biomes.add(registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(key)).get());
- }
-
- return biomes;
- }
-
- private void saveWorldValues(File directory) {
- Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- for (Map.Entry, PlacedFeature> entry : registry.entrySet()) {
- ResourceLocation key = entry.getKey().location();
- File file = new File(directory, key.getNamespace() + "/" + key.getPath() + ".json");
- try {
- saveFeature(file, null, CraftNamespacedKey.fromMinecraft(key), entry.getValue());
- } catch (Exception e) {
- throw new RuntimeException(String.format("Error while saving feature '%s'", key), e);
- }
- }
- }
-
- private void saveBiomeValues(File directory) {
- forEachBiome((biome, biomeKey) -> {
- File biomeFile = new File(directory, biomeKey.getNamespace() + "/" + biomeKey.getPath());
- List>> decorations = biome.getGenerationSettings().features();
- for (List> list : decorations) {
- for (Supplier featureSupplier : list) {
- PlacedFeature feature = featureSupplier.get();
- Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- ResourceLocation featureKey = registry.getKey(feature);
-
- if (featureKey == null) {
- // Skip if the feature is not registered, this can happen if another plugin adds a feature without registering it
- return;
- }
-
- File featureFile = new File(biomeFile, featureKey.getNamespace() + "/" + featureKey.getPath() + ".json");
- try {
- saveFeature(featureFile, registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(biomeKey)).get(), CraftNamespacedKey.fromMinecraft(featureKey), feature);
- } catch (Exception e) {
- throw new RuntimeException(String.format("Error while saving feature '%s' in biome '%s'", featureKey, biomeKey), e);
- }
- }
- }
- });
- }
-
- private void saveFeature(File file, de.derfrzocker.ore.control.api.Biome biome, NamespacedKey featureKey, PlacedFeature feature) {
- ConfiguredFeature, ?> configuredFeature = feature.getFeatures().findFirst().orElse(null);
-
- if (configuredFeature == null) {
- return;
- }
-
- if (!(configuredFeature.feature() instanceof OreFeature) && !(configuredFeature.feature() instanceof ScatteredOreFeature) && !(configuredFeature.feature() instanceof GlowstoneFeature)) {
- return;
- }
-
- file.getParentFile().mkdirs();
-
- FeatureGenerator> featureGenerator;
- FeatureGeneratorConfiguration featureConfiguration;
-
- if (configuredFeature.feature() instanceof OreFeature) {
- OreConfiguration configuration = (OreConfiguration) configuredFeature.config();
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("ore")).get();
- featureConfiguration = new OreFeatureConfiguration(featureGenerator, null, new FixedDoubleToIntegerValue(configuration.size), new FixedFloatValue(configuration.discardChanceOnAirExposure));
- } else if (configuredFeature.feature() instanceof ScatteredOreFeature) {
- OreConfiguration configuration = (OreConfiguration) configuredFeature.config();
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("scattered_ore")).get();
- featureConfiguration = new OreFeatureConfiguration(featureGenerator, null, new FixedDoubleToIntegerValue(configuration.size), new FixedFloatValue(configuration.discardChanceOnAirExposure));
- } else if (configuredFeature.feature() instanceof GlowstoneFeature) {
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("glowstone_blob")).get();
- featureConfiguration = new EmptyFeatureConfiguration(featureGenerator);
- } else {
- throw new RuntimeException("HOW?");
- }
-
- boolean hasCount = false;
- List placementConfiguration = new ArrayList<>();
- Registry> placementModifierTypes = getRegistry().registryOrThrow(Registry.PLACEMENT_MODIFIER_REGISTRY);
- for (PlacementModifier placement : feature.getPlacement()) {
- ResourceLocation placementModifierType = placementModifierTypes.getKey(placement.type());
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString(placementModifierType.toString()));
-
- if (modifierOptional.isEmpty()) {
- continue;
- }
-
- if (placement.type() == PlacementModifierType.RARITY_FILTER && placement instanceof RarityFilter) {
- placementConfiguration.add(RarityModifierHook.createDefaultConfiguration((RarityFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.SURFACE_RELATIVE_THRESHOLD_FILTER && placement instanceof SurfaceRelativeThresholdFilter) {
- placementConfiguration.add(SurfaceRelativeThresholdModifierHook.createDefaultConfiguration((SurfaceRelativeThresholdFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.SURFACE_WATER_DEPTH_FILTER && placement instanceof SurfaceWaterDepthFilter) {
- placementConfiguration.add(SurfaceWaterDepthModifierHook.createDefaultConfiguration((SurfaceWaterDepthFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.COUNT && placement instanceof CountPlacement) {
- placementConfiguration.add(CountModifierHook.createDefaultConfiguration((CountPlacement) placement, modifierOptional.get()));
- hasCount = true;
- }
- if (placement.type() == PlacementModifierType.HEIGHT_RANGE && placement instanceof HeightRangePlacement) {
- placementConfiguration.add(HeightRangeModifierHook.createDefaultConfiguration((HeightRangePlacement) placement, modifierOptional.get()));
- }
- }
-
- if (!hasCount) {
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString("minecraft:count"));
-
- modifierOptional.ifPresent(modifier -> placementConfiguration.add(0, CountModifierHook.createDefaultConfiguration(CountPlacement.of(1), modifier)));
- }
-
- Config config = new Config(placementConfiguration, featureConfiguration);
-
- if (biome == null) {
- configManager.setDefaultConfig(featureKey, config);
- } else {
- configManager.setDefaultConfig(biome, featureKey, config);
- }
-
- if (file.exists()) {
- return;
- }
-
- try {
- file.createNewFile();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- JsonElement element = configParser.toJson(config);
- try (FileWriter writer = new FileWriter(file)) {
- writer.write(GSON.toJson(element));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void forEachBiome(BiConsumer consumer) {
- Registry registry = getRegistry().registryOrThrow(Registry.BIOME_REGISTRY);
- for (Biome biome : registry) {
- consumer.accept(biome, registry.getKey(biome));
- }
- }
-
- private void hookIntoBiome(@NotNull final Biome biome, ResourceLocation minecraftKey) throws NoSuchFieldException, IllegalAccessException {
- de.derfrzocker.ore.control.api.Biome oreControlBiome = registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(minecraftKey)).get();
- List>> decorations = biome.getGenerationSettings().features();
- List>> newDecorations = new ArrayList<>();
- for (List> list : decorations) {
- List> newList = new ArrayList<>();
-
- for (Supplier featureSupplier : list) {
- PlacedFeature feature = featureSupplier.get();
-
- PlacedFeature newFeature = check(oreControlBiome, minecraftKey, feature);
-
- if (newFeature != null) {
- addToList(newList, list.indexOf(featureSupplier), newFeature);
- } else {
- newList.add(featureSupplier);
- }
- }
-
- newDecorations.add(decorations.indexOf(list), newList);
- }
-
- {
- final Field field = getField(BiomeGenerationSettings.class, NMSReflectionNames.BIOME_GENERATION_SETTINGS_FEATURES);
- field.setAccessible(true);
- field.set(biome.getGenerationSettings(), newDecorations);
- }
- {
- final Field field = getField(BiomeGenerationSettings.class, NMSReflectionNames.BIOME_GENERATION_SETTINGS_FEATURE_SET);
- field.setAccessible(true);
- field.set(biome.getGenerationSettings(), newDecorations.stream().flatMap(Collection::stream).map(Supplier::get).collect(Collectors.toSet()));
- }
- }
-
- private void addToList(List> list, int index, PlacedFeature feature) {
- list.add(index, () -> feature);
- }
-
- @Nullable
- private PlacedFeature check(de.derfrzocker.ore.control.api.Biome biome, ResourceLocation biomeKey, PlacedFeature feature) {
- // Not the best method to do this, but hey it works
- final Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- ResourceLocation featureKey = registry.getKey(feature);
-
- // Return if the featureKey is null, this can happen when plugins are adding placed features to the biome without registering them
- if (featureKey == null) {
- // TODO add debug message
- return null;
- }
-
- NamespacedKey key = CraftNamespacedKey.fromMinecraft(featureKey);
- feature = BuiltinRegistries.PLACED_FEATURE.get(featureKey);
-
- if (feature == null) {
- return null;
- }
-
- ConfiguredFeature, ?> configuredFeature = feature.getFeatures().findFirst().orElse(null);
-
- if (configuredFeature == null) {
- return null;
- }
-
- if (!(configuredFeature.feature() instanceof OreFeature) && !(configuredFeature.feature() instanceof ScatteredOreFeature) && !(configuredFeature.feature() instanceof GlowstoneFeature)) {
- return null;
- }
-
- boolean hasCount = false;
- List placementModifiers = new ArrayList<>();
- for (PlacementModifier placement : feature.getPlacement()) {
- if (placement.type() == PlacementModifierType.RARITY_FILTER) {
- placementModifiers.add(new RarityModifierHook(oreControlManager, biome, key, (RarityFilter) placement));
- } else if (placement.type() == PlacementModifierType.SURFACE_RELATIVE_THRESHOLD_FILTER) {
- placementModifiers.add(new SurfaceRelativeThresholdModifierHook(oreControlManager, biome, key, (SurfaceRelativeThresholdFilter) placement));
- } else if (placement.type() == PlacementModifierType.SURFACE_WATER_DEPTH_FILTER) {
- placementModifiers.add(new SurfaceWaterDepthModifierHook(oreControlManager, biome, key, (SurfaceWaterDepthFilter) placement));
- } else if (placement.type() == PlacementModifierType.COUNT) {
- hasCount = true;
- placementModifiers.add(new CountModifierHook(oreControlManager, biome, key, (CountPlacement) placement));
- } else if (placement.type() == PlacementModifierType.HEIGHT_RANGE) {
- placementModifiers.add(new HeightRangeModifierHook(oreControlManager, biome, key, (HeightRangePlacement) placement));
- } else {
- placementModifiers.add(placement);
- }
- }
-
- if (!hasCount) {
- placementModifiers.add(0, new CountModifierHook(oreControlManager, biome, key, CountPlacement.of(1)));
- }
-
- if (configuredFeature.feature() instanceof OreFeature) {
- return new PlacedFeature(() -> new ConfiguredFeature(new OreFeatureGeneratorHook(oreControlManager, key, biome), configuredFeature.config()), placementModifiers);
- } else if (configuredFeature.feature() instanceof ScatteredOreFeature) {
- return new PlacedFeature(() -> new ConfiguredFeature(new ScatteredOreFeatureGeneratorHook(oreControlManager, key, biome), configuredFeature.config()), placementModifiers);
- } else if (configuredFeature.feature() instanceof GlowstoneFeature) {
- return new PlacedFeature(() -> new ConfiguredFeature(new GlowstoneBlobFeatureGeneratorHook(oreControlManager, biome, key), configuredFeature.config()), placementModifiers);
- }
-
- throw new RuntimeException("HOW?");
- }
-
- @SuppressWarnings("rawtypes")
- private Field getField(@NotNull final Class clazz, @NotNull final String fieldName) throws NoSuchFieldException {
- try {
- return clazz.getDeclaredField(fieldName);
- } catch (final NoSuchFieldException e) {
- final Class superClass = clazz.getSuperclass();
- if (superClass == null) {
- throw e;
- } else {
- return getField(superClass, fieldName);
- }
- }
- }
-
- @NotNull
- private RegistryAccess getRegistry() {
- final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer();
-
- return server.registryAccess();
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGeneratorHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGeneratorHook.java
deleted file mode 100644
index f24e6fd1..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/GlowstoneBlobFeatureGeneratorHook.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator;
-
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class GlowstoneBlobFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public GlowstoneBlobFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, Biome biome, NamespacedKey namespacedKey) {
- super(NoneFeatureConfiguration.CODEC, GLOWSTONE_BLOB, oreControlManager, "glowstone_blob", biome, namespacedKey);
- }
-
- @Override
- public NoneFeatureConfiguration createConfig(@NotNull NoneFeatureConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull EmptyFeatureConfiguration configuration) {
- return defaultConfiguration;
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/MinecraftFeatureGeneratorHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/MinecraftFeatureGeneratorHook.java
deleted file mode 100644
index ae559f3c..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/MinecraftFeatureGeneratorHook.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator;
-
-import com.mojang.serialization.Codec;
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.FeatureGeneratorHook;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
-import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-
-public abstract class MinecraftFeatureGeneratorHook extends Feature implements FeatureGeneratorHook {
-
- private final Map cache = new ConcurrentHashMap<>();
- private final Feature feature;
- private final ConfigManager configManager;
- private final FeatureGenerator featureGenerator;
- private final Biome biome;
- private final NamespacedKey namespacedKey;
-
- public MinecraftFeatureGeneratorHook(Codec codec, Feature feature, @NotNull OreControlManager oreControlManager, @NotNull String name, Biome biome, NamespacedKey namespacedKey) {
- super(codec);
- this.feature = feature;
- this.configManager = oreControlManager.getConfigManager();
- this.featureGenerator = (FeatureGenerator) oreControlManager.getRegistries().getFeatureGeneratorRegistry().get(NamespacedKey.minecraft(name)).get();
- this.biome = biome;
- this.namespacedKey = namespacedKey;
-
- oreControlManager.addValueChangeListener(cache::clear);
- }
-
- public abstract M createConfig(@NotNull M defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @Override
- public FeatureGenerator getFeatureGenerator() {
- return featureGenerator;
- }
-
- @Override
- public Biome getBiome() {
- return biome;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-
- @Override
- public boolean place(FeaturePlaceContext context) {
- BlockPos origin = context.origin();
-
- FeatureGeneratorConfiguration configuration = cache.computeIfAbsent(context.level().getMinecraftWorld().getWorld().getName(), this::loadConfig);
- if (configuration == null) {
- return feature.place(context);
- }
-
- CraftLimitedRegion limitedRegion = new CraftLimitedRegion(context.level(), new ChunkPos(origin));
- M config = createConfig(context.config(), context.level().getMinecraftWorld().getWorld(), context.random(), new BlockVector(origin.getX(), origin.getY(), origin.getZ()), limitedRegion, (C) configuration);
- limitedRegion.breakLink();
-
- return place(context.topFeature(), context.level(), context.chunkGenerator(), context.random(), origin, config);
- }
-
- private FeatureGeneratorConfiguration loadConfig(String name) {
- Config config = configManager.getGenerationConfig(configManager.getOrCreateConfigInfo(name), biome, namespacedKey).orElse(null);
-
- if (config == null) {
- return null;
- }
-
- return config.getFeature();
- }
-
- private boolean place(Optional> top, WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos pos, M config) {
- return feature.place(new FeaturePlaceContext<>(top, world, generator, random, pos, config));
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/OreFeatureGeneratorHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/OreFeatureGeneratorHook.java
deleted file mode 100644
index 7e3cf67b..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/OreFeatureGeneratorHook.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator;
-
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class OreFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public OreFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, @NotNull NamespacedKey namespacedKey, @NotNull Biome biome) {
- super(OreConfiguration.CODEC, Feature.ORE, oreControlManager, "ore", biome, namespacedKey);
- }
-
- @Override
- public OreConfiguration createConfig(@NotNull OreConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates;
- if (configuration.getTargets() == null) {
- blockStates = defaultConfiguration.targetStates;
- } else {
- blockStates = new ArrayList<>();
-
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size;
- if (configuration.getSize() == null) {
- size = defaultConfiguration.size;
- } else {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure;
- if (configuration.getDiscardChanceOnAirExposure() == null) {
- discardChanceOnAirExposure = defaultConfiguration.discardChanceOnAirExposure;
- } else {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/ScatteredOreFeatureGeneratorHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/ScatteredOreFeatureGeneratorHook.java
deleted file mode 100644
index 83088072..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/feature/generator/ScatteredOreFeatureGeneratorHook.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.feature.generator;
-
-import de.derfrzocker.feature.impl.v1_18_R1.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R1.value.target.TargetValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class ScatteredOreFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public ScatteredOreFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, @NotNull NamespacedKey namespacedKey, @NotNull Biome biome) {
- super(OreConfiguration.CODEC, Feature.SCATTERED_ORE, oreControlManager, "scattered_ore", biome, namespacedKey);
- }
-
- @Override
- public OreConfiguration createConfig(@NotNull OreConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates;
- if (configuration.getTargets() == null) {
- blockStates = defaultConfiguration.targetStates;
- } else {
- blockStates = new ArrayList<>();
-
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size;
- if (configuration.getSize() == null) {
- size = defaultConfiguration.size;
- } else {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure;
- if (configuration.getDiscardChanceOnAirExposure() == null) {
- discardChanceOnAirExposure = defaultConfiguration.discardChanceOnAirExposure;
- } else {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/CountModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/CountModifierHook.java
deleted file mode 100644
index e2d54856..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/CountModifierHook.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.CountModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.ConversionUtil;
-import de.derfrzocker.ore.control.impl.v1_18_R1.NMSReflectionNames;
-import net.minecraft.util.valueproviders.IntProvider;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class CountModifierHook extends MinecraftPlacementModifierHook {
-
- public CountModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull CountPlacement defaultModifier) {
- super(oreControlManager, "count", defaultModifier, biome, namespacedKey);
- }
-
- public static CountModifierConfiguration createDefaultConfiguration(@NotNull CountPlacement defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field count = CountPlacement.class.getDeclaredField(NMSReflectionNames.COUNT_PLACEMENT_COUNT);
- count.setAccessible(true);
- IntProvider value = (IntProvider) count.get(defaultModifier);
- IntegerValue integerValue = ConversionUtil.convert(value);
- return new CountModifierConfiguration(modifier, integerValue);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public CountModifierConfiguration createDefaultConfiguration(@NotNull CountPlacement defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public CountPlacement createModifier(@NotNull CountModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull CountModifierConfiguration configuration) {
- int count;
- if (configuration.getCount() == null) {
- count = defaultConfiguration.getCount().getValue(worldInfo, random, position, limitedRegion);
- } else {
- count = configuration.getCount().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return CountPlacement.of(count);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/HeightRangeModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/HeightRangeModifierHook.java
deleted file mode 100644
index 7ab5d404..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/HeightRangeModifierHook.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.HeightRangeModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.trapezoid.TrapezoidIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.uniform.UniformIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.offset.NMSAboveBottomOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.value.offset.NMSBelowTopOffsetIntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.VerticalAnchor;
-import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProviderType;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class HeightRangeModifierHook extends MinecraftPlacementModifierHook {
-
- public HeightRangeModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull HeightRangePlacement defaultModifier) {
- super(oreControlManager, "height_range", defaultModifier, biome, namespacedKey);
- }
-
- public static HeightRangeModifierConfiguration createDefaultConfiguration(@NotNull HeightRangePlacement defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field height = HeightRangePlacement.class.getDeclaredField(NMSReflectionNames.HEIGHT_RANGE_PLACEMENT_HEIGHT);
- height.setAccessible(true);
- HeightProvider value = (HeightProvider) height.get(defaultModifier);
-
- IntegerValue integerValue;
- if (value.getType() == HeightProviderType.CONSTANT) {
- integerValue = getIntegerValue(value.toString());
- } else if (value.getType() == HeightProviderType.UNIFORM) {
- String uniform = value.toString();
- uniform = uniform.substring(1);
- uniform = uniform.substring(0, uniform.length() - 1);
- int charType = uniform.indexOf("-", 1);
- String[] anchors = new String[]{uniform.substring(0, charType), uniform.substring(charType + 1)};
-
- integerValue = new UniformIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]));
- } else if (value.getType() == HeightProviderType.TRAPEZOID) {
- String trapezoid = value.toString();
- if (trapezoid.startsWith("triangle")) {
- trapezoid = trapezoid.replace("triangle (", "");
- trapezoid = trapezoid.substring(0, trapezoid.length() - 1);
- int charType = trapezoid.indexOf("-", 1);
- String[] anchors = new String[]{trapezoid.substring(0, charType), trapezoid.substring(charType + 1)};
-
- integerValue = new TrapezoidIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]), new FixedDoubleToIntegerValue(0));
- } else if (trapezoid.startsWith("trapezoid")) {
- trapezoid = trapezoid.replace("trapezoid (", "");
- trapezoid = trapezoid.substring(0, trapezoid.length() - 1);
- String[] split = trapezoid.split("\\) in \\[");
-
- if (split.length != 2) {
- throw new IllegalStateException(String.format("Expected a split of size '2', but got '%s' for input '%s'", split.length, trapezoid));
- }
-
- int plateau = Integer.parseInt(split[0]);
- int charType = trapezoid.indexOf("-", 1);
- String[] anchors = new String[]{trapezoid.substring(0, charType), trapezoid.substring(charType + 1)};
- integerValue = new TrapezoidIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]), new FixedDoubleToIntegerValue(plateau));
- } else {
- throw new UnsupportedOperationException(String.format("Unknown trapezoid value '%s'", trapezoid));
- }
-
- } else { // TODO add rest of HeightProvider types
- throw new UnsupportedOperationException(String.format("No integer value equivalent for HeightProvider '%s'", value));
- }
-
- return new HeightRangeModifierConfiguration(modifier, integerValue);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static IntegerValue getIntegerValue(String anchor) {
- String[] values = anchor.split(" ");
- int value = Integer.parseInt(values[0]);
-
- if (values.length == 2 && values[1].equals("absolute")) {
- return new FixedDoubleToIntegerValue(value);
- }
-
- if (values.length == 3 && values[1].equals("above") && values[2].equals("bottom")) {
- return new NMSAboveBottomOffsetIntegerValue(new FixedDoubleToIntegerValue(value));
- }
-
- if (values.length == 3 && values[1].equals("below") && values[2].equals("top")) {
- return new NMSBelowTopOffsetIntegerValue(new FixedDoubleToIntegerValue(value));
- }
-
- throw new UnsupportedOperationException(String.format("Unknown vertical anchor '%s'", anchor));
- }
-
- @Override
- public HeightRangeModifierConfiguration createDefaultConfiguration(@NotNull HeightRangePlacement defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public HeightRangePlacement createModifier(@NotNull HeightRangeModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull HeightRangeModifierConfiguration configuration) {
- int height;
- if (configuration.getHeight() == null) {
- height = defaultConfiguration.getHeight().getValue(worldInfo, random, position, limitedRegion);
- } else {
- height = configuration.getHeight().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return HeightRangePlacement.of(ConstantHeight.of(VerticalAnchor.absolute(height)));
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/MinecraftPlacementModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/MinecraftPlacementModifierHook.java
deleted file mode 100644
index 77f57cb8..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/MinecraftPlacementModifierHook.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.PlacementModifierHook;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import net.minecraft.world.level.levelgen.placement.PlacedFeature;
-import net.minecraft.world.level.levelgen.placement.PlacementContext;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R1.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Stream;
-
-public abstract class MinecraftPlacementModifierHook extends PlacementModifier implements PlacementModifierHook {
-
- private final Map cache = new ConcurrentHashMap<>();
- private final FeaturePlacementModifier placementModifier;
- private final ConfigManager configManager;
- private final M defaultModifier;
- private final C defaultConfiguration;
- private final Biome biome;
- private final NamespacedKey namespacedKey;
-
- public MinecraftPlacementModifierHook(@NotNull OreControlManager oreControlManager, @NotNull String name, @NotNull M defaultModifier, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey) {
- this.configManager = oreControlManager.getConfigManager();
- this.placementModifier = (FeaturePlacementModifier) oreControlManager.getRegistries().getPlacementModifierRegistry().get(NamespacedKey.minecraft(name)).get();
- this.defaultModifier = defaultModifier;
- this.defaultConfiguration = createDefaultConfiguration(defaultModifier);
- this.biome = biome;
- this.namespacedKey = namespacedKey;
-
- oreControlManager.addValueChangeListener(cache::clear);
- }
-
- public abstract M createModifier(@NotNull C defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- public abstract C createDefaultConfiguration(M defaultModifier);
-
- @Override
- public FeaturePlacementModifier getPlacementModifier() {
- return placementModifier;
- }
-
- @Override
- public Biome getBiome() {
- return biome;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-
- @Override
- public Stream getPositions(PlacementContext context, Random random, BlockPos blockPos) {
- PlacementModifierConfiguration configuration = cache.computeIfAbsent(context.getLevel().getMinecraftWorld().getWorld().getName(), this::loadConfig);
-
- M modifier = defaultModifier;
- if (configuration != null) {
- CraftLimitedRegion limitedRegion = new CraftLimitedRegion(context.getLevel(), new ChunkPos(blockPos));
- modifier = createModifier(defaultConfiguration, context.getLevel().getMinecraftWorld().getWorld(), random, new BlockVector(blockPos.getX(), blockPos.getY(), blockPos.getZ()), limitedRegion, (C) configuration);
- limitedRegion.breakLink();
- }
-
- return getPositions(context.topFeature(), context.getLevel(), context.generator(), random, blockPos, modifier);
- }
-
- private PlacementModifierConfiguration loadConfig(String name) {
- Config config = configManager.getGenerationConfig(configManager.getOrCreateConfigInfo(name), biome, namespacedKey).orElse(null);
-
- if (config == null) {
- return null;
- }
-
- return config.getPlacements().get(placementModifier);
- }
-
- @Override
- public PlacementModifierType> type() {
- return null;
- }
-
- private Stream getPositions(Optional top, WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos pos, M modifier) {
- return modifier.getPositions(new PlacementContext(world, generator, top), random, pos);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/RarityModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/RarityModifierHook.java
deleted file mode 100644
index ffadb725..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/RarityModifierHook.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.RarityModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.bukkit.util.NumberConversions;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class RarityModifierHook extends MinecraftPlacementModifierHook {
-
- public RarityModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull RarityFilter defaultModifier) {
- super(oreControlManager, "rarity_filter", defaultModifier, biome, namespacedKey);
- }
-
- public static RarityModifierConfiguration createDefaultConfiguration(@NotNull RarityFilter defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field chance = RarityFilter.class.getDeclaredField(NMSReflectionNames.RARITY_FILTER_CHANCE);
- chance.setAccessible(true);
- Object value = chance.get(defaultModifier);
- return new RarityModifierConfiguration(modifier, new FixedDoubleToIntegerValue(NumberConversions.toInt(value)));
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public RarityModifierConfiguration createDefaultConfiguration(@NotNull RarityFilter defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public RarityFilter createModifier(@NotNull RarityModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull RarityModifierConfiguration configuration) {
- int chance;
- if (configuration.getChance() == null) {
- chance = defaultConfiguration.getChance().getValue(worldInfo, random, position, limitedRegion);
- } else {
- chance = configuration.getChance().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return RarityFilter.onAverageOnceEvery(chance);
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifierHook.java
deleted file mode 100644
index 26b45386..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceRelativeThresholdModifierHook.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R1.placement.configuration.SurfaceRelativeThresholdModifierConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.Heightmap;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.bukkit.util.NumberConversions;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class SurfaceRelativeThresholdModifierHook extends MinecraftPlacementModifierHook {
-
- public SurfaceRelativeThresholdModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull SurfaceRelativeThresholdFilter defaultModifier) {
- super(oreControlManager, "surface_relative_threshold_filter", defaultModifier, biome, namespacedKey);
- }
-
- public static SurfaceRelativeThresholdModifierConfiguration createDefaultConfiguration(@NotNull SurfaceRelativeThresholdFilter defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field heightmap = SurfaceRelativeThresholdFilter.class.getDeclaredField(NMSReflectionNames.SURFACE_RELATIVE_THRESHOLD_FILTER_HEIGHTMAP);
- heightmap.setAccessible(true);
-
- Field minInclusive = SurfaceRelativeThresholdFilter.class.getDeclaredField(NMSReflectionNames.SURFACE_RELATIVE_THRESHOLD_FILTER_MIN_INCLUSIVE);
- minInclusive.setAccessible(true);
-
- Field maxInclusive = SurfaceRelativeThresholdFilter.class.getDeclaredField(NMSReflectionNames.SURFACE_RELATIVE_THRESHOLD_FILTER_MAX_INCLUSIVE);
- maxInclusive.setAccessible(true);
-
- Object heightmapValue = heightmap.get(defaultModifier);
- Object minInclusiveValue = minInclusive.get(defaultModifier);
- Object maxInclusiveValue = maxInclusive.get(defaultModifier);
- return new SurfaceRelativeThresholdModifierConfiguration(modifier, null, new FixedDoubleToIntegerValue(NumberConversions.toInt(minInclusiveValue)), new FixedDoubleToIntegerValue(NumberConversions.toInt(maxInclusiveValue)));
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public SurfaceRelativeThresholdFilter createModifier(@NotNull SurfaceRelativeThresholdModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceRelativeThresholdModifierConfiguration configuration) {
- Heightmap.Types heightmap;
- if (configuration.getHeightmap() == null) {
- heightmap = defaultConfiguration.getHeightmap().getValue(worldInfo, random, position, limitedRegion);
- } else {
- heightmap = configuration.getHeightmap().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int minInclusive;
- if (configuration.getMinInclusive() == null) {
- minInclusive = defaultConfiguration.getMinInclusive().getValue(worldInfo, random, position, limitedRegion);
- } else {
- minInclusive = configuration.getMinInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int maxInclusive;
- if (configuration.getMaxInclusive() == null) {
- maxInclusive = defaultConfiguration.getMaxInclusive().getValue(worldInfo, random, position, limitedRegion);
- } else {
- maxInclusive = configuration.getMaxInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return SurfaceRelativeThresholdFilter.of(heightmap, minInclusive, maxInclusive);
- }
-
- @Override
- public SurfaceRelativeThresholdModifierConfiguration createDefaultConfiguration(SurfaceRelativeThresholdFilter defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-}
diff --git a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceWaterDepthModifierHook.java b/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceWaterDepthModifierHook.java
deleted file mode 100644
index 47d8a08d..00000000
--- a/impl/v1_18_R1/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R1/placement/SurfaceWaterDepthModifierHook.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R1.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.SurfaceWaterDepthModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R1.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.bukkit.util.NumberConversions;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class SurfaceWaterDepthModifierHook extends MinecraftPlacementModifierHook {
-
- public SurfaceWaterDepthModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull SurfaceWaterDepthFilter defaultModifier) {
- super(oreControlManager, "surface_water_depth_filter", defaultModifier, biome, namespacedKey);
- }
-
- public static SurfaceWaterDepthModifierConfiguration createDefaultConfiguration(@NotNull SurfaceWaterDepthFilter defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field maxWaterDepth = SurfaceWaterDepthFilter.class.getDeclaredField(NMSReflectionNames.SURFACE_WATER_DEPTH_FILTER_MAX_WATER_DEPTH);
- maxWaterDepth.setAccessible(true);
- Object value = maxWaterDepth.get(defaultModifier);
- return new SurfaceWaterDepthModifierConfiguration(modifier, new FixedDoubleToIntegerValue(NumberConversions.toInt(value)));
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public SurfaceWaterDepthModifierConfiguration createDefaultConfiguration(@NotNull SurfaceWaterDepthFilter defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public SurfaceWaterDepthFilter createModifier(@NotNull SurfaceWaterDepthModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceWaterDepthModifierConfiguration configuration) {
- int maxWaterDepth;
- if (configuration.getMaxWaterDepth() == null) {
- maxWaterDepth = defaultConfiguration.getMaxWaterDepth().getValue(worldInfo, random, position, limitedRegion);
- } else {
- maxWaterDepth = configuration.getMaxWaterDepth().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return SurfaceWaterDepthFilter.forMaxDepth(maxWaterDepth);
- }
-}
\ No newline at end of file
diff --git a/impl/v1_18_R2/pom.xml b/impl/v1_18_R2/pom.xml
deleted file mode 100644
index 1bcbeb78..00000000
--- a/impl/v1_18_R2/pom.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
- 4.0.0
-
-
- ore-control-impl
- de.derfrzocker
- ${revision}
-
-
- ore-control-impl-v1_18_R2
-
-
-
- de.derfrzocker
- ore-control-api
- ${project.version}
- provided
-
-
- de.derfrzocker
- ore-control-common
- ${project.version}
- provided
-
-
- org.spigotmc
- spigot
- 1.18.2-R0.1-SNAPSHOT
- remapped-mojang
- provided
- true
-
-
-
-
-
-
- net.md-5
- specialsource-maven-plugin
- 1.2.3
-
-
- package
-
- remap
-
- remap-obf
-
- org.spigotmc:minecraft-server:1.18.2-R0.1-SNAPSHOT:txt:maps-mojang
- true
- org.spigotmc:spigot:1.18.2-R0.1-SNAPSHOT:jar:remapped-mojang
-
- true
- remapped-obf
-
-
-
- package
-
- remap
-
- remap-spigot
-
-
- ${project.build.directory}/${project.artifactId}-${project.version}-remapped-obf.jar
-
- org.spigotmc:minecraft-server:1.18.2-R0.1-SNAPSHOT:csrg:maps-spigot
- org.spigotmc:spigot:1.18.2-R0.1-SNAPSHOT:jar:remapped-obf
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGenerator.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGenerator.java
deleted file mode 100644
index 8879d352..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGenerator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Configuration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.Random;
-import java.util.Set;
-
-public class GlowstoneBlobFeatureGenerator extends MinecraftFeatureGenerator {
-
- public GlowstoneBlobFeatureGenerator(Registries registries) {
- super(registries, Feature.GLOWSTONE_BLOB, "glowstone_blob");
- }
-
- @Override
- public @NotNull Set getSettings() {
- return Collections.emptySet();
- }
-
- @Override
- public @NotNull Configuration createEmptyConfiguration() {
- return new EmptyFeatureConfiguration(this);
- }
-
- @Override
- public EmptyFeatureConfiguration mergeConfig(EmptyFeatureConfiguration first, EmptyFeatureConfiguration second) {
- return first;
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(EmptyFeatureConfiguration value) {
- return new JsonObject();
- }
-
- @Override
- public EmptyFeatureConfiguration fromJson(JsonElement jsonElement) {
- return new EmptyFeatureConfiguration(GlowstoneBlobFeatureGenerator.this);
- }
- };
- }
-
- @Override
- public NoneFeatureConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull EmptyFeatureConfiguration configuration) {
- return NoneFeatureConfiguration.INSTANCE;
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/MinecraftFeatureGenerator.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/MinecraftFeatureGenerator.java
deleted file mode 100644
index c2721ce0..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/MinecraftFeatureGenerator.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.feature.generator;
-
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.util.Parser;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
-import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-import java.util.Random;
-
-public abstract class MinecraftFeatureGenerator implements FeatureGenerator {
-
- private final Parser parser;
- private final Feature feature;
- private final NamespacedKey namespacedKey;
-
- public MinecraftFeatureGenerator(Registries registries, Feature feature, String name) {
- this.parser = (Parser) createParser(registries);
- this.feature = feature;
- this.namespacedKey = NamespacedKey.minecraft(name);
- }
-
- public abstract C mergeConfig(C first, C second);
-
- public abstract Parser createParser(Registries registries);
-
- public abstract M createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @NotNull
- @Override
- public C merge(@NotNull FeatureGeneratorConfiguration first, @NotNull FeatureGeneratorConfiguration second) {
- return mergeConfig((C) first, (C) second);
- }
-
- @Override
- public void place(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration) {
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- M config = createConfiguration(worldInfo, random, position, limitedRegion, configuration);
- feature.place(new FeaturePlaceContext<>(Optional.empty(), level, level.getMinecraftWorld().getChunkSource().getGenerator(), random, new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ()), config));
- }
-
- @NotNull
- @Override
- public Parser getParser() {
- return parser;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/OreFeatureGenerator.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/OreFeatureGenerator.java
deleted file mode 100644
index 55942e34..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/OreFeatureGenerator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetValue;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-public class OreFeatureGenerator extends MinecraftFeatureGenerator {
-
- public OreFeatureGenerator(Registries registries) {
- super(registries, OreFeature.ORE, "ore");
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(OreFeatureConfiguration value) {
- JsonObject jsonObject = new JsonObject();
-
- if (value.getSize() != null) {
- JsonObject size = value.getSize().getValueType().getParser().toJson(value.getSize()).getAsJsonObject();
- size.addProperty("size_type", value.getSize().getValueType().getKey().toString());
- jsonObject.add("size", size);
- }
-
- if (value.getDiscardChanceOnAirExposure() != null) {
- JsonObject discardChanceOnAirExposure = value.getDiscardChanceOnAirExposure().getValueType().getParser().toJson(value.getDiscardChanceOnAirExposure()).getAsJsonObject();
- discardChanceOnAirExposure.addProperty("discard_chance_on_air_exposure_type", value.getDiscardChanceOnAirExposure().getValueType().getKey().toString());
- }
-
- return jsonObject;
- }
-
- @Override
- public OreFeatureConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue size = null;
- if (jsonObject.has("size")) {
- JsonObject sizes = jsonObject.getAsJsonObject("size");
- size = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(sizes.getAsJsonPrimitive("size_type").getAsString())).get().getParser().fromJson(sizes);
- }
-
- FloatValue discardChanceOnAirExposure = null;
- if (jsonObject.has("discard_chance_on_air_exposure")) {
- JsonObject chance = jsonObject.getAsJsonObject("discard_chance_on_air_exposure");
- discardChanceOnAirExposure = registries.getValueTypeRegistry(FloatType.class).get(NamespacedKey.fromString(chance.getAsJsonPrimitive("discard_chance_on_air_exposure_type").getAsString())).get().getParser().fromJson(chance);
- }
-
- return new OreFeatureConfiguration(OreFeatureGenerator.this, null, size, discardChanceOnAirExposure);
- }
- };
- }
-
- @Override
- public OreFeatureConfiguration mergeConfig(OreFeatureConfiguration first, OreFeatureConfiguration second) {
- return new OreFeatureConfiguration(this,
- first.getTargets() != null ? first.getTargets() : second.getTargets(),
- first.getSize() != null ? first.getSize() : second.getSize(),
- first.getDiscardChanceOnAirExposure() != null ? first.getDiscardChanceOnAirExposure() : second.getDiscardChanceOnAirExposure());
- }
-
- @Override
- public OreConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates = new ArrayList<>();
- if (configuration.getTargets() != null) {
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size = 0;
- if (configuration.getSize() != null) {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure = 0f;
- if (configuration.getDiscardChanceOnAirExposure() != null) {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return OreFeatureConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public OreFeatureConfiguration createEmptyConfiguration() {
- return new OreFeatureConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/ScatteredOreGenerator.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/ScatteredOreGenerator.java
deleted file mode 100644
index 20f87e90..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/ScatteredOreGenerator.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.feature.generator;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetValue;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-public class ScatteredOreGenerator extends MinecraftFeatureGenerator {
-
- public ScatteredOreGenerator(Registries registries) {
- super(registries, OreFeature.SCATTERED_ORE, "scattered_ore");
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(OreFeatureConfiguration value) {
- JsonObject jsonObject = new JsonObject();
-
- if (value.getSize() != null) {
- JsonObject size = value.getSize().getValueType().getParser().toJson(value.getSize()).getAsJsonObject();
- size.addProperty("size_type", value.getSize().getValueType().getKey().toString());
- jsonObject.add("size", size);
- }
-
- if (value.getDiscardChanceOnAirExposure() != null) {
- JsonObject discardChanceOnAirExposure = value.getDiscardChanceOnAirExposure().getValueType().getParser().toJson(value.getDiscardChanceOnAirExposure()).getAsJsonObject();
- discardChanceOnAirExposure.addProperty("discard_chance_on_air_exposure_type", value.getDiscardChanceOnAirExposure().getValueType().getKey().toString());
- }
-
- return jsonObject;
- }
-
- @Override
- public OreFeatureConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue size = null;
- if (jsonObject.has("size")) {
- JsonObject sizes = jsonObject.getAsJsonObject("size");
- size = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(sizes.getAsJsonPrimitive("size_type").getAsString())).get().getParser().fromJson(sizes);
- }
-
- FloatValue discardChanceOnAirExposure = null;
- if (jsonObject.has("discard_chance_on_air_exposure")) {
- JsonObject chance = jsonObject.getAsJsonObject("discard_chance_on_air_exposure");
- discardChanceOnAirExposure = registries.getValueTypeRegistry(FloatType.class).get(NamespacedKey.fromString(chance.getAsJsonPrimitive("discard_chance_on_air_exposure_type").getAsString())).get().getParser().fromJson(chance);
- }
-
- return new OreFeatureConfiguration(ScatteredOreGenerator.this, null, size, discardChanceOnAirExposure);
- }
- };
- }
-
- @Override
- public OreFeatureConfiguration mergeConfig(OreFeatureConfiguration first, OreFeatureConfiguration second) {
- return new OreFeatureConfiguration(this,
- first.getTargets() != null ? first.getTargets() : second.getTargets(),
- first.getSize() != null ? first.getSize() : second.getSize(),
- first.getDiscardChanceOnAirExposure() != null ? first.getDiscardChanceOnAirExposure() : second.getDiscardChanceOnAirExposure());
- }
-
- @Override
- public OreConfiguration createConfiguration(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates = new ArrayList<>();
- if (configuration.getTargets() != null) {
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size = 0;
- if (configuration.getSize() != null) {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure = 0f;
- if (configuration.getDiscardChanceOnAirExposure() != null) {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return OreFeatureConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public OreFeatureConfiguration createEmptyConfiguration() {
- return new OreFeatureConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/configuration/OreFeatureConfiguration.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/configuration/OreFeatureConfiguration.java
deleted file mode 100644
index f9eff346..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/feature/generator/configuration/OreFeatureConfiguration.java
+++ /dev/null
@@ -1,124 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration;
-
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.Value;
-import de.derfrzocker.feature.common.value.number.FloatType;
-import de.derfrzocker.feature.common.value.number.FloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetValue;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
-public class OreFeatureConfiguration implements FeatureGeneratorConfiguration {
-
- public final static Set SETTINGS;
- private final static Setting SIZE = new Setting("size", IntegerType.class);
- private final static Setting DISCARD_CHANCE_ON_AIR_EXPOSURE = new Setting("discard-chance-on-air-exposure", FloatType.class);
-
- static {
- Set settings = new LinkedHashSet<>();
- settings.add(SIZE);
- settings.add(DISCARD_CHANCE_ON_AIR_EXPOSURE);
- SETTINGS = Collections.unmodifiableSet(settings);
- }
-
- private final FeatureGenerator> featureGenerator;
- private final List targets;
- private IntegerValue size;
- private FloatValue discardChanceOnAirExposure;
- private boolean dirty = false;
-
- public OreFeatureConfiguration(FeatureGenerator> featureGenerator, List targets, IntegerValue size, FloatValue discardChanceOnAirExposure) {
- this.featureGenerator = featureGenerator;
- this.targets = targets;
- this.size = size;
- this.discardChanceOnAirExposure = discardChanceOnAirExposure;
- }
-
- public List getTargets() {
- return targets;
- }
-
- public IntegerValue getSize() {
- return size;
- }
-
- public FloatValue getDiscardChanceOnAirExposure() {
- return discardChanceOnAirExposure;
- }
-
- @NotNull
- @Override
- public FeatureGenerator> getOwner() {
- return featureGenerator;
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SETTINGS;
- }
-
- @Override
- public Value, ?, ?> getValue(@NotNull Setting setting) {
- if (setting == SIZE) {
- return getSize();
- }
-
- if (setting == DISCARD_CHANCE_ON_AIR_EXPOSURE) {
- return getDiscardChanceOnAirExposure();
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "OreFeatureConfiguration"));
- }
-
- @Override
- public void setValue(@NotNull Setting setting, Value, ?, ?> value) {
- if (setting == SIZE) {
- size = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- if (setting == DISCARD_CHANCE_ON_AIR_EXPOSURE) {
- discardChanceOnAirExposure = (FloatValue) value;
- dirty = true;
- return;
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "OreFeatureConfiguration"));
- }
-
- @Override
- public boolean isDirty() {
- if (dirty) {
- return true;
- }
-
- if (size != null && size.isDirty()) {
- return true;
- }
-
- return discardChanceOnAirExposure != null && discardChanceOnAirExposure.isDirty();
- }
-
- @Override
- public void saved() {
- dirty = false;
-
- if (size != null) {
- size.saved();
- }
-
- if (discardChanceOnAirExposure != null) {
- discardChanceOnAirExposure.saved();
- }
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/CountModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/CountModifier.java
deleted file mode 100644
index bd94e826..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/CountModifier.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.CountModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class CountModifier extends MinecraftPlacementModifier {
-
- public CountModifier(@NotNull Registries registries) {
- super(registries, "count");
- }
-
- @Override
- public CountModifierConfiguration mergeConfig(CountModifierConfiguration first, CountModifierConfiguration second) {
- return new CountModifierConfiguration(this,
- first.getCount() != null ? first.getCount() : second.getCount());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(CountModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getCount() != null) {
- JsonObject entry = value.getCount().getValueType().getParser().toJson(value.getCount()).getAsJsonObject();
- entry.addProperty("count_type", value.getCount().getValueType().getKey().toString());
- jsonObject.add("count", entry);
- }
- return jsonObject;
- }
-
- @Override
- public CountModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("count")) {
- JsonObject entry = jsonObject.getAsJsonObject("count");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("count_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new CountModifierConfiguration(CountModifier.this, count);
- }
- };
- }
-
- @Override
- public CountPlacement createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull CountModifierConfiguration configuration) {
- int count;
- if (configuration.getCount() != null) {
- count = configuration.getCount().getValue(worldInfo, random, position, limitedRegion);
- } else {
- count = 0;
- }
-
- return CountPlacement.of(count);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return CountModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public CountModifierConfiguration createEmptyConfiguration() {
- return new CountModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/HeightRangeModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/HeightRangeModifier.java
deleted file mode 100644
index 4d4c43ad..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/HeightRangeModifier.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.HeightRangeModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.VerticalAnchor;
-import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class HeightRangeModifier extends MinecraftPlacementModifier {
-
- public HeightRangeModifier(@NotNull Registries registries) {
- super(registries, "height_range");
- }
-
- @Override
- public HeightRangeModifierConfiguration mergeConfig(HeightRangeModifierConfiguration first, HeightRangeModifierConfiguration second) {
- return new HeightRangeModifierConfiguration(this,
- first.getHeight() != null ? first.getHeight() : second.getHeight());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(HeightRangeModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getHeight() != null) {
- JsonObject entry = value.getHeight().getValueType().getParser().toJson(value.getHeight()).getAsJsonObject();
- entry.addProperty("height_range_type", value.getHeight().getValueType().getKey().toString());
- jsonObject.add("height", entry);
- }
- return jsonObject;
- }
-
- @Override
- public HeightRangeModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("height")) {
- JsonObject entry = jsonObject.getAsJsonObject("height");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("height_range_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new HeightRangeModifierConfiguration(HeightRangeModifier.this, count);
- }
- };
- }
-
- @Override
- public HeightRangePlacement createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull HeightRangeModifierConfiguration configuration) {
- HeightProvider height;
- if (configuration.getHeight() != null) {
- height = ConstantHeight.of(VerticalAnchor.absolute(configuration.getHeight().getValue(worldInfo, random, position, limitedRegion)));
- } else {
- height = ConstantHeight.of(VerticalAnchor.bottom());
- }
-
- return HeightRangePlacement.of(height);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return HeightRangeModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public HeightRangeModifierConfiguration createEmptyConfiguration() {
- return new HeightRangeModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/MinecraftPlacementModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/MinecraftPlacementModifier.java
deleted file mode 100644
index 40fd25cb..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/MinecraftPlacementModifier.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.util.Parser;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.levelgen.placement.PlacementContext;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Optional;
-import java.util.Random;
-import java.util.stream.Stream;
-
-public abstract class MinecraftPlacementModifier implements FeaturePlacementModifier {
-
- private final Parser parser;
- private final NamespacedKey namespacedKey;
-
- public MinecraftPlacementModifier(@NotNull Registries registries, @NotNull String name) {
- this.parser = (Parser) createParser(registries);
- this.namespacedKey = NamespacedKey.minecraft(name);
- }
-
- public abstract C mergeConfig(C first, C second);
-
- public abstract Parser createParser(Registries registries);
-
- public abstract M createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @NotNull
- @Override
- public C merge(@NotNull PlacementModifierConfiguration first, @NotNull PlacementModifierConfiguration second) {
- return mergeConfig((C) first, (C) second);
- }
-
- @NotNull
- @Override
- public Stream getPositions(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration) {
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- M placementModifier = createPlacementModifier(worldInfo, random, position, limitedRegion, configuration);
- return placementModifier.getPositions(new PlacementContext(level, level.getMinecraftWorld().getChunkSource().getGenerator(), Optional.empty()), random, new BlockPos(position.getBlockX(), position.getBlockY(), position.getBlockZ())).
- map(pos -> new BlockVector(pos.getX(), pos.getY(), pos.getZ()));
- }
-
- @NotNull
- @Override
- public Parser getParser() {
- return parser;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/RarityModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/RarityModifier.java
deleted file mode 100644
index 21da0cac..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/RarityModifier.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.RarityModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class RarityModifier extends MinecraftPlacementModifier {
-
- public RarityModifier(@NotNull Registries registries) {
- super(registries, "rarity_filter");
- }
-
-
- @Override
- public RarityModifierConfiguration mergeConfig(RarityModifierConfiguration first, RarityModifierConfiguration second) {
- return new RarityModifierConfiguration(this,
- first.getChance() != null ? first.getChance() : second.getChance());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(RarityModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getChance() != null) {
- JsonObject entry = value.getChance().getValueType().getParser().toJson(value.getChance()).getAsJsonObject();
- entry.addProperty("chance_type", value.getChance().getValueType().getKey().toString());
- jsonObject.add("chance", entry);
- }
- return jsonObject;
- }
-
- @Override
- public RarityModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("chance")) {
- JsonObject entry = jsonObject.getAsJsonObject("chance");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("chance_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new RarityModifierConfiguration(RarityModifier.this, count);
- }
- };
- }
-
- @Override
- public RarityFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull RarityModifierConfiguration configuration) {
- int chance = 0;
- if (configuration.getChance() != null) {
- chance = configuration.getChance().getValue(worldInfo, random, position, limitedRegion);
- }
- return RarityFilter.onAverageOnceEvery(chance);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return RarityModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public RarityModifierConfiguration createEmptyConfiguration() {
- return new RarityModifierConfiguration(this, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifier.java
deleted file mode 100644
index c3906989..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifier.java
+++ /dev/null
@@ -1,107 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.configuration.SurfaceRelativeThresholdModifierConfiguration;
-import net.minecraft.world.level.levelgen.Heightmap;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class SurfaceRelativeThresholdModifier extends MinecraftPlacementModifier {
- public SurfaceRelativeThresholdModifier(@NotNull Registries registries) {
- super(registries, "surface_relative_threshold_filter");
- }
-
- @Override
- public SurfaceRelativeThresholdModifierConfiguration mergeConfig(SurfaceRelativeThresholdModifierConfiguration first, SurfaceRelativeThresholdModifierConfiguration second) {
- return new SurfaceRelativeThresholdModifierConfiguration(this,
- first.getHeightmap() != null ? first.getHeightmap() : second.getHeightmap(),
- first.getMinInclusive() != null ? first.getMinInclusive() : second.getMinInclusive(),
- first.getMaxInclusive() != null ? first.getMaxInclusive() : second.getMaxInclusive());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(SurfaceRelativeThresholdModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getMinInclusive() != null) {
- JsonObject entry = value.getMinInclusive().getValueType().getParser().toJson(value.getMinInclusive()).getAsJsonObject();
- entry.addProperty("min_inclusive_type", value.getMinInclusive().getValueType().getKey().toString());
- jsonObject.add("min_inclusive", entry);
- }
-
- if (value.getMaxInclusive() != null) {
- JsonObject entry = value.getMaxInclusive().getValueType().getParser().toJson(value.getMaxInclusive()).getAsJsonObject();
- entry.addProperty("max_inclusive_type", value.getMaxInclusive().getValueType().getKey().toString());
- jsonObject.add("max_inclusive", entry);
- }
-
- return jsonObject;
- }
-
- @Override
- public SurfaceRelativeThresholdModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue minInclusive = null;
- if (jsonObject.has("min_inclusive")) {
- JsonObject entry = jsonObject.getAsJsonObject("min_inclusive");
- minInclusive = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("min_inclusive_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- IntegerValue maxInclusive = null;
- if (jsonObject.has("max_inclusive")) {
- JsonObject entry = jsonObject.getAsJsonObject("max_inclusive");
- maxInclusive = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("max_inclusive_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new SurfaceRelativeThresholdModifierConfiguration(SurfaceRelativeThresholdModifier.this, null, minInclusive, maxInclusive);
- }
- };
- }
-
- @Override
- public SurfaceRelativeThresholdFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceRelativeThresholdModifierConfiguration configuration) {
- Heightmap.Types heightmap = Heightmap.Types.MOTION_BLOCKING;
- if (configuration.getHeightmap() != null) {
- heightmap = configuration.getHeightmap().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int minInclusive = 0;
- if (configuration.getMinInclusive() != null) {
- minInclusive = configuration.getMinInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
-
- int maxInclusive = 0;
- if (configuration.getMaxInclusive() != null) {
- maxInclusive = configuration.getMaxInclusive().getValue(worldInfo, random, position, limitedRegion);
- }
- return SurfaceRelativeThresholdFilter.of(heightmap, minInclusive, maxInclusive);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SurfaceRelativeThresholdModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public SurfaceRelativeThresholdModifierConfiguration createEmptyConfiguration() {
- return new SurfaceRelativeThresholdModifierConfiguration(this, null, null, null);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceWaterDepthModifier.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceWaterDepthModifier.java
deleted file mode 100644
index a4f0f340..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/SurfaceWaterDepthModifier.java
+++ /dev/null
@@ -1,82 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement;
-
-import com.google.gson.JsonElement;
-import com.google.gson.JsonObject;
-import de.derfrzocker.feature.api.Registries;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.placement.configuration.SurfaceWaterDepthModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-import java.util.Set;
-
-public class SurfaceWaterDepthModifier extends MinecraftPlacementModifier {
-
- public SurfaceWaterDepthModifier(@NotNull Registries registries) {
- super(registries, "surface_water_depth_filter");
- }
-
- @Override
- public SurfaceWaterDepthModifierConfiguration mergeConfig(SurfaceWaterDepthModifierConfiguration first, SurfaceWaterDepthModifierConfiguration second) {
- return new SurfaceWaterDepthModifierConfiguration(this,
- first.getMaxWaterDepth() != null ? first.getMaxWaterDepth() : second.getMaxWaterDepth());
- }
-
- @Override
- public Parser createParser(Registries registries) {
- return new Parser<>() {
- @Override
- public JsonElement toJson(SurfaceWaterDepthModifierConfiguration value) {
- JsonObject jsonObject = new JsonObject();
- if (value.getMaxWaterDepth() != null) {
- JsonObject entry = value.getMaxWaterDepth().getValueType().getParser().toJson(value.getMaxWaterDepth()).getAsJsonObject();
- entry.addProperty("max_water_depth_type", value.getMaxWaterDepth().getValueType().getKey().toString());
- jsonObject.add("max_water_depth", entry);
- }
- return jsonObject;
- }
-
- @Override
- public SurfaceWaterDepthModifierConfiguration fromJson(JsonElement jsonElement) {
- JsonObject jsonObject = jsonElement.getAsJsonObject();
-
- IntegerValue count = null;
- if (jsonObject.has("max_water_depth")) {
- JsonObject entry = jsonObject.getAsJsonObject("max_water_depth");
- count = registries.getValueTypeRegistry(IntegerType.class).get(NamespacedKey.fromString(entry.getAsJsonPrimitive("max_water_depth_type").getAsString())).get().getParser().fromJson(entry);
- }
-
- return new SurfaceWaterDepthModifierConfiguration(SurfaceWaterDepthModifier.this, count);
- }
- };
- }
-
- @Override
- public SurfaceWaterDepthFilter createPlacementModifier(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull SurfaceWaterDepthModifierConfiguration configuration) {
- int maxWaterDepth = 0;
- if (configuration.getMaxWaterDepth() != null) {
- maxWaterDepth = configuration.getMaxWaterDepth().getValue(worldInfo, random, position, limitedRegion);
- }
- return SurfaceWaterDepthFilter.forMaxDepth(maxWaterDepth);
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SurfaceWaterDepthModifierConfiguration.SETTINGS;
- }
-
- @NotNull
- @Override
- public SurfaceWaterDepthModifierConfiguration createEmptyConfiguration() {
- return new SurfaceWaterDepthModifierConfiguration(this, null);
- }
-}
\ No newline at end of file
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java
deleted file mode 100644
index 437d5e40..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/placement/configuration/SurfaceRelativeThresholdModifierConfiguration.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.placement.configuration;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.Setting;
-import de.derfrzocker.feature.api.Value;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.heightmap.HeightmapValue;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-public class SurfaceRelativeThresholdModifierConfiguration implements PlacementModifierConfiguration {
-
- public final static Set SETTINGS;
- private final static Setting MIN_INCLUSIVE = new Setting("min-inclusive", IntegerType.class);
- private final static Setting MAX_INCLUSIVE = new Setting("max-inclusive", IntegerType.class);
-
- static {
- Set settings = new LinkedHashSet<>();
- settings.add(MIN_INCLUSIVE);
- settings.add(MAX_INCLUSIVE);
- SETTINGS = Collections.unmodifiableSet(settings);
- }
-
- private final FeaturePlacementModifier> placementModifier;
- private final HeightmapValue heightmap;
- private IntegerValue minInclusive;
- private IntegerValue maxInclusive;
- private boolean dirty = false;
-
- public SurfaceRelativeThresholdModifierConfiguration(FeaturePlacementModifier> placementModifier, HeightmapValue heightmap, IntegerValue minInclusive, IntegerValue maxInclusive) {
- this.placementModifier = placementModifier;
- this.heightmap = heightmap;
- this.minInclusive = minInclusive;
- this.maxInclusive = maxInclusive;
- }
-
- @NotNull
- @Override
- public FeaturePlacementModifier> getOwner() {
- return placementModifier;
- }
-
- public HeightmapValue getHeightmap() {
- return heightmap;
- }
-
- public IntegerValue getMinInclusive() {
- return minInclusive;
- }
-
- public IntegerValue getMaxInclusive() {
- return maxInclusive;
- }
-
- @NotNull
- @Override
- public Set getSettings() {
- return SETTINGS;
- }
-
- @Override
- public Value, ?, ?> getValue(@NotNull Setting setting) {
- if (setting == MIN_INCLUSIVE) {
- return getMinInclusive();
- }
-
- if (setting == MAX_INCLUSIVE) {
- return getMaxInclusive();
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "SurfaceRelativeThresholdModifierConfiguration"));
- }
-
- @Override
- public void setValue(@NotNull Setting setting, Value, ?, ?> value) {
- if (setting == MIN_INCLUSIVE) {
- minInclusive = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- if (setting == MAX_INCLUSIVE) {
- maxInclusive = (IntegerValue) value;
- dirty = true;
- return;
- }
-
- throw new IllegalArgumentException(String.format("Setting '%s' is not in the configuration '%s'", setting, "SurfaceRelativeThresholdModifierConfiguration"));
- }
-
- @Override
- public boolean isDirty() {
- if (dirty) {
- return true;
- }
-
- if (minInclusive != null && minInclusive.isDirty()) {
- return true;
- }
-
- return maxInclusive != null && maxInclusive.isDirty();
- }
-
- @Override
- public void saved() {
- dirty = false;
-
- if (minInclusive != null) {
- minInclusive.saved();
- }
-
- if (maxInclusive != null) {
- maxInclusive.saved();
- }
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapType.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapType.java
deleted file mode 100644
index fba5489d..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.heightmap;
-
-import de.derfrzocker.feature.api.ValueType;
-import net.minecraft.world.level.levelgen.Heightmap;
-
-public abstract class HeightmapType implements ValueType {
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapValue.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapValue.java
deleted file mode 100644
index 687b44d0..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/heightmap/HeightmapValue.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.heightmap;
-
-import de.derfrzocker.feature.common.AbstractValue;
-import net.minecraft.world.level.levelgen.Heightmap;
-
-public abstract class HeightmapValue extends AbstractValue {
-
- @Override
- public abstract HeightmapValue clone();
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSAboveBottomOffsetIntegerValue.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSAboveBottomOffsetIntegerValue.java
deleted file mode 100644
index 80ec8a5c..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSAboveBottomOffsetIntegerValue.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.offset;
-
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.offset.AboveBottomOffsetIntegerValue;
-import net.minecraft.world.level.WorldGenLevel;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class NMSAboveBottomOffsetIntegerValue extends AboveBottomOffsetIntegerValue {
-
- public NMSAboveBottomOffsetIntegerValue(IntegerValue base) {
- super(base);
- }
-
- @Override
- public Integer getValue(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion) {
- int baseValue = getBase() == null ? 0 : getBase().getValue(worldInfo, random, position, limitedRegion);
-
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
-
- return Math.max(level.getMinBuildHeight(), level.getLevel().getChunkSource().chunkMap.generator.getMinY()) + baseValue;
- }
-
- @Override
- public AboveBottomOffsetIntegerValue clone() {
- return new NMSAboveBottomOffsetIntegerValue(getBase() == null ? null : getBase().clone());
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSBelowTopOffsetIntegerValue.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSBelowTopOffsetIntegerValue.java
deleted file mode 100644
index 2ed72b90..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/offset/NMSBelowTopOffsetIntegerValue.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.offset;
-
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.offset.BelowTopOffsetIntegerValue;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class NMSBelowTopOffsetIntegerValue extends BelowTopOffsetIntegerValue {
-
- public NMSBelowTopOffsetIntegerValue(IntegerValue base) {
- super(base);
- }
-
- @Override
- public Integer getValue(@NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion) {
- int baseValue = getBase() == null ? 0 : getBase().getValue(worldInfo, random, position, limitedRegion);
-
- WorldGenLevel level = ((CraftLimitedRegion) limitedRegion).getHandle();
- ChunkGenerator chunkGenerator = level.getLevel().getChunkSource().chunkMap.generator;
-
- return Math.min(level.getHeight(), chunkGenerator.getGenDepth()) - 1 + Math.max(level.getMinBuildHeight(), chunkGenerator.getMinY()) - baseValue;
- }
-
- @Override
- public NMSBelowTopOffsetIntegerValue clone() {
- return new NMSBelowTopOffsetIntegerValue(getBase() == null ? null : getBase().clone());
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetType.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetType.java
deleted file mode 100644
index 80b2e7ad..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetType.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.target;
-
-import de.derfrzocker.feature.api.ValueType;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-
-public abstract class TargetType implements ValueType {
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetValue.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetValue.java
deleted file mode 100644
index c924fb2c..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/feature/impl/v1_18_R2/value/target/TargetValue.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.derfrzocker.feature.impl.v1_18_R2.value.target;
-
-import de.derfrzocker.feature.common.AbstractValue;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-
-public abstract class TargetValue extends AbstractValue {
-
- @Override
- public abstract TargetValue clone();
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/ConversionUtil.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/ConversionUtil.java
deleted file mode 100644
index 83cf56ac..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/ConversionUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2;
-
-import de.derfrzocker.feature.common.value.number.FixedFloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.biased.BiasedToBottomIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.clamped.ClampedIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.clamped.ClampedNormalIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.uniform.UniformIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.weighted.WeightedListIntegerValue;
-import net.minecraft.util.random.SimpleWeightedRandomList;
-import net.minecraft.util.random.WeightedEntry;
-import net.minecraft.util.valueproviders.ClampedInt;
-import net.minecraft.util.valueproviders.ClampedNormalInt;
-import net.minecraft.util.valueproviders.IntProvider;
-import net.minecraft.util.valueproviders.IntProviderType;
-import net.minecraft.util.valueproviders.WeightedListInt;
-
-import java.lang.reflect.Field;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-public final class ConversionUtil {
-
- private ConversionUtil() {
- }
-
- public static IntegerValue convert(IntProvider intProvider) {
- try {
- if (intProvider.getType() == IntProviderType.CONSTANT) {
- return new FixedDoubleToIntegerValue(intProvider.getMinValue());
- } else if (intProvider.getType() == IntProviderType.UNIFORM) {
- return new UniformIntegerValue(new FixedDoubleToIntegerValue(intProvider.getMinValue()), new FixedDoubleToIntegerValue(intProvider.getMaxValue()));
- } else if (intProvider.getType() == IntProviderType.BIASED_TO_BOTTOM) {
- return new BiasedToBottomIntegerValue(new FixedDoubleToIntegerValue(intProvider.getMinValue()), new FixedDoubleToIntegerValue(intProvider.getMaxValue()));
- } else if (intProvider.getType() == IntProviderType.CLAMPED) {
- Field sourceField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_SOURCE);
- Field minField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_MIN_INCLUSIVE);
- Field maxField = ClampedInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_INT_MAX_INCLUSIVE);
- sourceField.setAccessible(true);
- minField.setAccessible(true);
- maxField.setAccessible(true);
-
- IntProvider source = (IntProvider) sourceField.get(intProvider);
- int min = (int) minField.get(intProvider);
- int max = (int) maxField.get(intProvider);
- return new ClampedIntegerValue(convert(source), new FixedDoubleToIntegerValue(min), new FixedDoubleToIntegerValue(max));
- } else if (intProvider.getType() == IntProviderType.WEIGHTED_LIST) {
- Field distributionField = WeightedListInt.class.getDeclaredField(NMSReflectionNames.WEIGHTED_LIST_INT_DISTRIBUTION);
- distributionField.setAccessible(true);
- SimpleWeightedRandomList distribution = (SimpleWeightedRandomList) distributionField.get(intProvider);
-
- Map values = new LinkedHashMap<>();
- for (WeightedEntry.Wrapper wrapper : distribution.unwrap()) {
- values.put(convert(wrapper.getData()), new FixedDoubleToIntegerValue(wrapper.getWeight().asInt()));
- }
-
- return new WeightedListIntegerValue(values);
- } else if (intProvider.getType() == IntProviderType.CLAMPED_NORMAL) {
- Field meanField = ClampedNormalInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_NORMAL_INT_MEAN);
- Field deviationField = ClampedNormalInt.class.getDeclaredField(NMSReflectionNames.CLAMPED_NORMAL_INT_DEVIATION);
- meanField.setAccessible(true);
- deviationField.setAccessible(true);
-
- float mean = (float) meanField.get(intProvider);
- float deviation = (float) meanField.get(intProvider);
- int min = intProvider.getMinValue();
- int max = intProvider.getMaxValue();
- return new ClampedNormalIntegerValue(new FixedFloatValue(mean), new FixedFloatValue(deviation), new FixedDoubleToIntegerValue(min), new FixedDoubleToIntegerValue(max));
- } else {
- throw new UnsupportedOperationException(String.format("No integer value equivalent for IntProvider '%s'", intProvider));
- }
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReflectionNames.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReflectionNames.java
deleted file mode 100644
index e7017ad4..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReflectionNames.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2;
-
-public final class NMSReflectionNames {
-
- public final static String BIOME_GENERATION_SETTINGS_FEATURES = "e";
- public final static String BIOME_GENERATION_SETTINGS_FEATURE_SET = "g";
- public final static String WEIGHTED_LIST_INT_DISTRIBUTION = "b";
- public final static String COUNT_PLACEMENT_COUNT = "c";
- public final static String HEIGHT_RANGE_PLACEMENT_HEIGHT = "c";
- public final static String RARITY_FILTER_CHANCE = "c";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_HEIGHTMAP = "c";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_MIN_INCLUSIVE = "d";
- public final static String SURFACE_RELATIVE_THRESHOLD_FILTER_MAX_INCLUSIVE = "e";
- public final static String SURFACE_WATER_DEPTH_FILTER_MAX_WATER_DEPTH = "c";
- public static final String CLAMPED_INT_SOURCE = "b";
- public static final String CLAMPED_INT_MIN_INCLUSIVE = "f";
- public static final String CLAMPED_INT_MAX_INCLUSIVE = "g";
- public static final String CLAMPED_NORMAL_INT_MEAN = "b";
- public static final String CLAMPED_NORMAL_INT_DEVIATION = "f";
-
- private NMSReflectionNames() {
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReplacer_v1_18_R2.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReplacer_v1_18_R2.java
deleted file mode 100644
index 96731cc8..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/NMSReplacer_v1_18_R2.java
+++ /dev/null
@@ -1,504 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2;
-
-import com.google.common.base.Suppliers;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-import com.google.gson.JsonElement;
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.api.util.Parser;
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import de.derfrzocker.feature.common.feature.placement.ActivationModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.ActivationConfiguration;
-import de.derfrzocker.feature.common.value.bool.FixedBooleanValue;
-import de.derfrzocker.feature.common.value.number.FixedFloatValue;
-import de.derfrzocker.feature.common.value.number.IntegerType;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.offset.AboveBottomOffsetIntegerType;
-import de.derfrzocker.feature.common.value.offset.BelowTopOffsetIntegerType;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.GlowstoneBlobFeatureGenerator;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.OreFeatureGenerator;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.ScatteredOreGenerator;
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.CountModifier;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.HeightRangeModifier;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.RarityModifier;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.SurfaceRelativeThresholdModifier;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.SurfaceWaterDepthModifier;
-import de.derfrzocker.feature.impl.v1_18_R2.value.heightmap.HeightmapType;
-import de.derfrzocker.feature.impl.v1_18_R2.value.offset.NMSAboveBottomOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.offset.NMSBelowTopOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetType;
-import de.derfrzocker.ore.control.api.NMSReplacer;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.OreControlRegistries;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator.GlowstoneBlobFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator.OreFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator.ScatteredOreFeatureGeneratorHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.ActivationModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.CountModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.HeightRangeModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.RarityModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.SurfaceRelativeThresholdModifierHook;
-import de.derfrzocker.ore.control.impl.v1_18_R2.placement.SurfaceWaterDepthModifierHook;
-import net.minecraft.core.Holder;
-import net.minecraft.core.HolderSet;
-import net.minecraft.core.Registry;
-import net.minecraft.core.RegistryAccess;
-import net.minecraft.data.BuiltinRegistries;
-import net.minecraft.resources.ResourceKey;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.server.dedicated.DedicatedServer;
-import net.minecraft.server.level.ServerLevel;
-import net.minecraft.world.level.biome.Biome;
-import net.minecraft.world.level.biome.BiomeGenerationSettings;
-import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.GlowstoneFeature;
-import net.minecraft.world.level.levelgen.feature.OreFeature;
-import net.minecraft.world.level.levelgen.feature.ScatteredOreFeature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import net.minecraft.world.level.levelgen.placement.PlacedFeature;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter;
-import org.bukkit.Bukkit;
-import org.bukkit.NamespacedKey;
-import org.bukkit.World;
-import org.bukkit.craftbukkit.v1_18_R2.CraftServer;
-import org.bukkit.craftbukkit.v1_18_R2.CraftWorld;
-import org.bukkit.craftbukkit.v1_18_R2.util.CraftNamespacedKey;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.lang.reflect.Field;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Supplier;
-import java.util.stream.Collectors;
-
-public class NMSReplacer_v1_18_R2 implements NMSReplacer {
-
- private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
- private final Parser configParser;
- private final OreControlManager oreControlManager;
- @NotNull
- private final OreControlRegistries registries;
- private final ConfigManager configManager;
-
- public NMSReplacer_v1_18_R2(@NotNull OreControlManager oreControlManager, Parser configParser) {
- this.oreControlManager = oreControlManager;
- this.registries = oreControlManager.getRegistries();
- this.configManager = oreControlManager.getConfigManager();
- this.configParser = configParser;
- }
-
- @Override
- public void register() {
- registerValueTypes();
- registerFeatureGenerators();
- registerPlacementModifier();
- registerFeatures();
- registerBiomes();
- }
-
- private void registerValueTypes() {
- registries.getValueTypeRegistry(IntegerType.class).register(new AboveBottomOffsetIntegerType(registries, NMSAboveBottomOffsetIntegerValue::new));
- registries.getValueTypeRegistry(IntegerType.class).register(new BelowTopOffsetIntegerType(registries, NMSBelowTopOffsetIntegerValue::new));
- }
-
- private void registerFeatureGenerators() {
- registries.getFeatureGeneratorRegistry().register(new OreFeatureGenerator(registries));
- registries.getFeatureGeneratorRegistry().register(new ScatteredOreGenerator(registries));
- registries.getFeatureGeneratorRegistry().register(new GlowstoneBlobFeatureGenerator(registries));
- }
-
- private void registerPlacementModifier() {
- registries.getPlacementModifierRegistry().register(new RarityModifier(registries));
- registries.getPlacementModifierRegistry().register(new SurfaceRelativeThresholdModifier(registries));
- registries.getPlacementModifierRegistry().register(new SurfaceWaterDepthModifier(registries));
- registries.getPlacementModifierRegistry().register(new CountModifier(registries));
- registries.getPlacementModifierRegistry().register(new HeightRangeModifier(registries));
- }
-
- private void registerFeatures() {
- Registry placedFeatureRegistry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- Registry> featureRegistry = getRegistry().registryOrThrow(Registry.FEATURE_REGISTRY);
- Registry> placementModifierTypes = getRegistry().registryOrThrow(Registry.PLACEMENT_MODIFIER_REGISTRY);
-
- for (PlacedFeature placedFeature : placedFeatureRegistry) {
- Feature> feature = placedFeature.getFeatures().findFirst().get().feature();
- ResourceLocation resourceLocation = featureRegistry.getKey(feature);
- Optional> featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.fromString(resourceLocation.toString()));
-
- if (featureGenerator.isEmpty()) {
- continue;
- }
-
- boolean hasCount = false;
- List> modifiers = new LinkedList<>();
- for (PlacementModifier modifier : placedFeature.placement()) {
- if (modifier.type() == PlacementModifierType.COUNT) {
- hasCount = true;
- }
- ResourceLocation placementModifierType = placementModifierTypes.getKey(modifier.type());
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString(placementModifierType.toString()));
- modifierOptional.ifPresent(modifiers::add);
- }
-
- if (!hasCount) {
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString("minecraft:count"));
- modifierOptional.ifPresent(modifiers::add);
- }
-
- // inject activation / deactivation logic
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(ActivationModifier.KEY);
- modifierOptional.ifPresent(modifiers::add);
-
- registries.getFeatureRegistry().register(new de.derfrzocker.feature.api.Feature(NamespacedKey.fromString(placedFeatureRegistry.getKey(placedFeature).toString()), featureGenerator.get(), modifiers));
- }
- }
-
- private void registerBiomes() {
- Registry placedFeatureRegistry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- forEachBiome((biome, resourceLocation) -> {
- de.derfrzocker.ore.control.api.Biome bio = new de.derfrzocker.ore.control.api.Biome(CraftNamespacedKey.fromMinecraft(resourceLocation));
-
- biome.getGenerationSettings().features().forEach(featureSet -> featureSet.forEach(holder -> {
- PlacedFeature feature = holder.value();
- ResourceLocation featureKey = placedFeatureRegistry.getKey(feature);
-
- if (featureKey == null) {
- // Skip if the feature is not registered, this can happen if another plugin adds a feature without registering it
- return;
- }
-
- registries.getFeatureRegistry().get(CraftNamespacedKey.fromMinecraft(featureKey)).ifPresent(value -> bio.getFeatures().add(value));
- }));
-
- registries.getBiomeRegistry().register(bio);
- });
- }
-
- @Override
- public void saveDefaultValues(File directory) {
- File world = new File(directory, "world");
- File biomes = new File(directory, "biome");
-
- saveWorldValues(world);
- saveBiomeValues(biomes);
- }
-
- @Override
- public void hookIntoBiomes() {
- forEachBiome((biome, resourceLocation) -> {
- try {
- hookIntoBiome(biome, resourceLocation);
- } catch (final Exception e) {
- throw new RuntimeException("Unexpected error while hooking in NMS for Biome: " + biome, e);
- }
- });
- }
-
- @Override
- public Set getBiomes(World world) {
- Set biomes = new LinkedHashSet<>();
- ServerLevel level = ((CraftWorld) world).getHandle();
- Registry registry = getRegistry().registryOrThrow(Registry.BIOME_REGISTRY);
-
- for (Holder biomeHolder : level.getChunkSource().chunkMap.generator.getBiomeSource().possibleBiomes()) {
- Biome biome = biomeHolder.value();
-
- ResourceLocation key = registry.getKey(biome);
-
- biomes.add(registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(key)).get());
- }
-
- return biomes;
- }
-
- private void saveWorldValues(File directory) {
- Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- for (Map.Entry, PlacedFeature> entry : registry.entrySet()) {
- ResourceLocation key = entry.getKey().location();
- File file = new File(directory, key.getNamespace() + "/" + key.getPath() + ".json");
- try {
- saveFeature(file, null, CraftNamespacedKey.fromMinecraft(key), entry.getValue());
- } catch (Exception e) {
- throw new RuntimeException(String.format("Error while saving feature '%s'", key), e);
- }
- }
- }
-
- private void saveBiomeValues(File directory) {
- forEachBiome((biome, biomeKey) -> {
- File biomeFile = new File(directory, biomeKey.getNamespace() + "/" + biomeKey.getPath());
- List> decorations = biome.getGenerationSettings().features();
- for (HolderSet list : decorations) {
- for (Holder featureSupplier : list) {
- PlacedFeature feature = featureSupplier.value();
- Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- ResourceLocation featureKey = registry.getKey(feature);
-
- if (featureKey == null) {
- // Skip if the feature is not registered, this can happen if another plugin adds a feature without registering it
- return;
- }
-
- File featureFile = new File(biomeFile, featureKey.getNamespace() + "/" + featureKey.getPath() + ".json");
- try {
- saveFeature(featureFile, registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(biomeKey)).get(), CraftNamespacedKey.fromMinecraft(featureKey), feature);
- } catch (Exception e) {
- throw new RuntimeException(String.format("Error while saving feature '%s' in biome '%s'", featureKey, biomeKey), e);
- }
- }
- }
- });
- }
-
- private void saveFeature(File file, de.derfrzocker.ore.control.api.Biome biome, NamespacedKey featureKey, PlacedFeature feature) {
- ConfiguredFeature, ?> configuredFeature = feature.getFeatures().findFirst().orElse(null);
-
- if (configuredFeature == null) {
- return;
- }
-
- if (!(configuredFeature.feature() instanceof OreFeature) && !(configuredFeature.feature() instanceof ScatteredOreFeature) && !(configuredFeature.feature() instanceof GlowstoneFeature)) {
- return;
- }
-
- file.getParentFile().mkdirs();
-
- FeatureGenerator> featureGenerator;
- FeatureGeneratorConfiguration featureConfiguration;
-
- if (configuredFeature.feature() instanceof OreFeature) {
- OreConfiguration configuration = (OreConfiguration) configuredFeature.config();
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("ore")).get();
- featureConfiguration = new OreFeatureConfiguration(featureGenerator, null, new FixedDoubleToIntegerValue(configuration.size), new FixedFloatValue(configuration.discardChanceOnAirExposure));
- } else if (configuredFeature.feature() instanceof ScatteredOreFeature) {
- OreConfiguration configuration = (OreConfiguration) configuredFeature.config();
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("scattered_ore")).get();
- featureConfiguration = new OreFeatureConfiguration(featureGenerator, null, new FixedDoubleToIntegerValue(configuration.size), new FixedFloatValue(configuration.discardChanceOnAirExposure));
- } else if (configuredFeature.feature() instanceof GlowstoneFeature) {
- featureGenerator = registries.getFeatureGeneratorRegistry().get(NamespacedKey.minecraft("glowstone_blob")).get();
- featureConfiguration = new EmptyFeatureConfiguration(featureGenerator);
- } else {
- throw new RuntimeException("HOW?");
- }
-
- boolean hasCount = false;
- List placementConfiguration = new ArrayList<>();
- Registry> placementModifierTypes = getRegistry().registryOrThrow(Registry.PLACEMENT_MODIFIER_REGISTRY);
- for (PlacementModifier placement : feature.placement()) {
- ResourceLocation placementModifierType = placementModifierTypes.getKey(placement.type());
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString(placementModifierType.toString()));
-
- if (modifierOptional.isEmpty()) {
- continue;
- }
-
- if (placement.type() == PlacementModifierType.RARITY_FILTER && placement instanceof RarityFilter) {
- placementConfiguration.add(RarityModifierHook.createDefaultConfiguration((RarityFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.SURFACE_RELATIVE_THRESHOLD_FILTER && placement instanceof SurfaceRelativeThresholdFilter) {
- placementConfiguration.add(SurfaceRelativeThresholdModifierHook.createDefaultConfiguration((SurfaceRelativeThresholdFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.SURFACE_WATER_DEPTH_FILTER && placement instanceof SurfaceWaterDepthFilter) {
- placementConfiguration.add(SurfaceWaterDepthModifierHook.createDefaultConfiguration((SurfaceWaterDepthFilter) placement, modifierOptional.get()));
- }
- if (placement.type() == PlacementModifierType.COUNT && placement instanceof CountPlacement) {
- placementConfiguration.add(CountModifierHook.createDefaultConfiguration((CountPlacement) placement, modifierOptional.get()));
- hasCount = true;
- }
- if (placement.type() == PlacementModifierType.HEIGHT_RANGE && placement instanceof HeightRangePlacement) {
- placementConfiguration.add(HeightRangeModifierHook.createDefaultConfiguration((HeightRangePlacement) placement, modifierOptional.get()));
- }
- }
-
- if (!hasCount) {
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(NamespacedKey.fromString("minecraft:count"));
-
- modifierOptional.ifPresent(modifier -> placementConfiguration.add(0, CountModifierHook.createDefaultConfiguration(CountPlacement.of(1), modifier)));
- }
-
- // inject activation / deactivation logic
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(ActivationModifier.KEY);
- modifierOptional.ifPresent(modifier -> placementConfiguration.add(0, new ActivationConfiguration(modifier, new FixedBooleanValue(true))));
-
- Config config = new Config(placementConfiguration, featureConfiguration);
-
- if (biome == null) {
- configManager.setDefaultConfig(featureKey, config);
- } else {
- configManager.setDefaultConfig(biome, featureKey, config);
- }
-
- if (file.exists()) {
- return;
- }
-
- try {
- file.createNewFile();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
-
- JsonElement element = configParser.toJson(config);
- try (FileWriter writer = new FileWriter(file)) {
- writer.write(GSON.toJson(element));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- private void forEachBiome(BiConsumer consumer) {
- Registry registry = getRegistry().registryOrThrow(Registry.BIOME_REGISTRY);
- for (Biome biome : registry) {
- consumer.accept(biome, registry.getKey(biome));
- }
- }
-
- private void hookIntoBiome(@NotNull final Biome biome, ResourceLocation minecraftKey) throws NoSuchFieldException, IllegalAccessException {
- de.derfrzocker.ore.control.api.Biome oreControlBiome = registries.getBiomeRegistry().get(CraftNamespacedKey.fromMinecraft(minecraftKey)).get();
- List> decorations = biome.getGenerationSettings().features();
- List> newDecorations = new ArrayList<>();
- for (HolderSet list : decorations) {
- List> newList = new ArrayList<>();
-
- for (Holder featureSupplier : list) {
- PlacedFeature feature = featureSupplier.value();
-
- PlacedFeature newFeature = check(oreControlBiome, minecraftKey, feature);
-
- if (newFeature != null) {
- newList.add(Holder.direct(newFeature));
- } else {
- newList.add(featureSupplier);
- }
- }
-
- newDecorations.add(decorations.indexOf(list), HolderSet.direct(newList));
- }
-
- {
- final Field field = getField(BiomeGenerationSettings.class, NMSReflectionNames.BIOME_GENERATION_SETTINGS_FEATURES);
- field.setAccessible(true);
- field.set(biome.getGenerationSettings(), newDecorations);
- }
- {
- final Field field = getField(BiomeGenerationSettings.class, NMSReflectionNames.BIOME_GENERATION_SETTINGS_FEATURE_SET);
- field.setAccessible(true);
- field.set(biome.getGenerationSettings(), Suppliers.memoize(() -> newDecorations.stream().flatMap(HolderSet::stream).map(Holder::value).collect(Collectors.toSet())));
- }
- }
-
- private void addToList(List> list, int index, PlacedFeature feature) {
- list.add(index, () -> feature);
- }
-
- @Nullable
- private PlacedFeature check(de.derfrzocker.ore.control.api.Biome biome, ResourceLocation biomeKey, PlacedFeature feature) {
- // Not the best method to do this, but hey it works
- final Registry registry = getRegistry().registryOrThrow(Registry.PLACED_FEATURE_REGISTRY);
- ResourceLocation featureKey = registry.getKey(feature);
-
- // Return if the featureKey is null, this can happen when plugins are adding placed features to the biome without registering them
- if (featureKey == null) {
- // TODO add debug message
- return null;
- }
-
- NamespacedKey key = CraftNamespacedKey.fromMinecraft(featureKey);
- feature = BuiltinRegistries.PLACED_FEATURE.get(featureKey);
-
- if (feature == null) {
- return null;
- }
-
- ConfiguredFeature, ?> configuredFeature = feature.getFeatures().findFirst().orElse(null);
-
- if (configuredFeature == null) {
- return null;
- }
-
- if (!(configuredFeature.feature() instanceof OreFeature) && !(configuredFeature.feature() instanceof ScatteredOreFeature) && !(configuredFeature.feature() instanceof GlowstoneFeature)) {
- return null;
- }
-
- boolean hasCount = false;
- List placementModifiers = new ArrayList<>();
- for (PlacementModifier placement : feature.placement()) {
- if (placement.type() == PlacementModifierType.RARITY_FILTER) {
- placementModifiers.add(new RarityModifierHook(oreControlManager, biome, key, (RarityFilter) placement));
- } else if (placement.type() == PlacementModifierType.SURFACE_RELATIVE_THRESHOLD_FILTER) {
- placementModifiers.add(new SurfaceRelativeThresholdModifierHook(oreControlManager, biome, key, (SurfaceRelativeThresholdFilter) placement));
- } else if (placement.type() == PlacementModifierType.SURFACE_WATER_DEPTH_FILTER) {
- placementModifiers.add(new SurfaceWaterDepthModifierHook(oreControlManager, biome, key, (SurfaceWaterDepthFilter) placement));
- } else if (placement.type() == PlacementModifierType.COUNT) {
- hasCount = true;
- placementModifiers.add(new CountModifierHook(oreControlManager, biome, key, (CountPlacement) placement));
- } else if (placement.type() == PlacementModifierType.HEIGHT_RANGE) {
- placementModifiers.add(new HeightRangeModifierHook(oreControlManager, biome, key, (HeightRangePlacement) placement));
- } else {
- placementModifiers.add(placement);
- }
- }
-
- if (!hasCount) {
- placementModifiers.add(0, new CountModifierHook(oreControlManager, biome, key, CountPlacement.of(1)));
- }
-
- // inject activation / deactivation logic
- Optional> modifierOptional = registries.getPlacementModifierRegistry().get(ActivationModifier.KEY);
- modifierOptional.ifPresent(modifier -> placementModifiers.add(0, new ActivationModifierHook(oreControlManager, biome, key)));
-
- if (configuredFeature.feature() instanceof OreFeature) {
- return new PlacedFeature(Holder.direct(new ConfiguredFeature(new OreFeatureGeneratorHook(oreControlManager, key, biome), configuredFeature.config())), placementModifiers);
- } else if (configuredFeature.feature() instanceof ScatteredOreFeature) {
- return new PlacedFeature(Holder.direct(new ConfiguredFeature(new ScatteredOreFeatureGeneratorHook(oreControlManager, key, biome), configuredFeature.config())), placementModifiers);
- } else if (configuredFeature.feature() instanceof GlowstoneFeature) {
- return new PlacedFeature(Holder.direct(new ConfiguredFeature(new GlowstoneBlobFeatureGeneratorHook(oreControlManager, biome, key), configuredFeature.config())), placementModifiers);
- }
-
- throw new RuntimeException("HOW?");
- }
-
- @SuppressWarnings("rawtypes")
- private Field getField(@NotNull final Class clazz, @NotNull final String fieldName) throws NoSuchFieldException {
- try {
- return clazz.getDeclaredField(fieldName);
- } catch (final NoSuchFieldException e) {
- final Class superClass = clazz.getSuperclass();
- if (superClass == null) {
- throw e;
- } else {
- return getField(superClass, fieldName);
- }
- }
- }
-
- @NotNull
- private RegistryAccess getRegistry() {
- final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer();
-
- return server.registryAccess();
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGeneratorHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGeneratorHook.java
deleted file mode 100644
index e7b2f7d9..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/GlowstoneBlobFeatureGeneratorHook.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator;
-
-import de.derfrzocker.feature.common.feature.generator.configuration.EmptyFeatureConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Random;
-
-public class GlowstoneBlobFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public GlowstoneBlobFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, Biome biome, NamespacedKey namespacedKey) {
- super(NoneFeatureConfiguration.CODEC, GLOWSTONE_BLOB, oreControlManager, "glowstone_blob", biome, namespacedKey);
- }
-
- @Override
- public NoneFeatureConfiguration createConfig(@NotNull NoneFeatureConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull EmptyFeatureConfiguration configuration) {
- return defaultConfiguration;
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/MinecraftFeatureGeneratorHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/MinecraftFeatureGeneratorHook.java
deleted file mode 100644
index 53cef014..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/MinecraftFeatureGeneratorHook.java
+++ /dev/null
@@ -1,98 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator;
-
-import com.mojang.serialization.Codec;
-import de.derfrzocker.feature.api.FeatureGenerator;
-import de.derfrzocker.feature.api.FeatureGeneratorConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.FeatureGeneratorHook;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
-import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-
-public abstract class MinecraftFeatureGeneratorHook extends Feature implements FeatureGeneratorHook {
-
- private final Map cache = new ConcurrentHashMap<>();
- private final Feature feature;
- private final ConfigManager configManager;
- private final FeatureGenerator featureGenerator;
- private final Biome biome;
- private final NamespacedKey namespacedKey;
-
- public MinecraftFeatureGeneratorHook(Codec codec, Feature feature, @NotNull OreControlManager oreControlManager, @NotNull String name, Biome biome, NamespacedKey namespacedKey) {
- super(codec);
- this.feature = feature;
- this.configManager = oreControlManager.getConfigManager();
- this.featureGenerator = (FeatureGenerator) oreControlManager.getRegistries().getFeatureGeneratorRegistry().get(NamespacedKey.minecraft(name)).get();
- this.biome = biome;
- this.namespacedKey = namespacedKey;
-
- oreControlManager.addValueChangeListener(cache::clear);
- }
-
- public abstract M createConfig(@NotNull M defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- @Override
- public FeatureGenerator getFeatureGenerator() {
- return featureGenerator;
- }
-
- @Override
- public Biome getBiome() {
- return biome;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-
- @Override
- public boolean place(FeaturePlaceContext context) {
- BlockPos origin = context.origin();
-
- FeatureGeneratorConfiguration configuration = cache.computeIfAbsent(context.level().getMinecraftWorld().getWorld().getName(), this::loadConfig);
- if (configuration == null) {
- return feature.place(context);
- }
-
- CraftLimitedRegion limitedRegion = new CraftLimitedRegion(context.level(), new ChunkPos(origin));
- M config = createConfig(context.config(), context.level().getMinecraftWorld().getWorld(), context.random(), new BlockVector(origin.getX(), origin.getY(), origin.getZ()), limitedRegion, (C) configuration);
- limitedRegion.breakLink();
-
- return place(context.topFeature(), context.level(), context.chunkGenerator(), context.random(), origin, config);
- }
-
- private FeatureGeneratorConfiguration loadConfig(String name) {
- Config config = configManager.getGenerationConfig(configManager.getOrCreateConfigInfo(name), biome, namespacedKey).orElse(null);
-
- if (config == null) {
- return null;
- }
-
- return config.getFeature();
- }
-
- private boolean place(Optional> top, WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos pos, M config) {
- return feature.place(new FeaturePlaceContext<>(top, world, generator, random, pos, config));
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/OreFeatureGeneratorHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/OreFeatureGeneratorHook.java
deleted file mode 100644
index d4726863..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/OreFeatureGeneratorHook.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator;
-
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class OreFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public OreFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, @NotNull NamespacedKey namespacedKey, @NotNull Biome biome) {
- super(OreConfiguration.CODEC, Feature.ORE, oreControlManager, "ore", biome, namespacedKey);
- }
-
- @Override
- public OreConfiguration createConfig(@NotNull OreConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates;
- if (configuration.getTargets() == null) {
- blockStates = defaultConfiguration.targetStates;
- } else {
- blockStates = new ArrayList<>();
-
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size;
- if (configuration.getSize() == null) {
- size = defaultConfiguration.size;
- } else {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure;
- if (configuration.getDiscardChanceOnAirExposure() == null) {
- discardChanceOnAirExposure = defaultConfiguration.discardChanceOnAirExposure;
- } else {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/ScatteredOreFeatureGeneratorHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/ScatteredOreFeatureGeneratorHook.java
deleted file mode 100644
index f4585416..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/feature/generator/ScatteredOreFeatureGeneratorHook.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.feature.generator;
-
-import de.derfrzocker.feature.impl.v1_18_R2.feature.generator.configuration.OreFeatureConfiguration;
-import de.derfrzocker.feature.impl.v1_18_R2.value.target.TargetValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import net.minecraft.world.level.levelgen.feature.Feature;
-import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-public class ScatteredOreFeatureGeneratorHook extends MinecraftFeatureGeneratorHook {
-
- public ScatteredOreFeatureGeneratorHook(@NotNull OreControlManager oreControlManager, @NotNull NamespacedKey namespacedKey, @NotNull Biome biome) {
- super(OreConfiguration.CODEC, Feature.SCATTERED_ORE, oreControlManager, "scattered_ore", biome, namespacedKey);
- }
-
- @Override
- public OreConfiguration createConfig(@NotNull OreConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull OreFeatureConfiguration configuration) {
- List blockStates;
- if (configuration.getTargets() == null) {
- blockStates = defaultConfiguration.targetStates;
- } else {
- blockStates = new ArrayList<>();
-
- for (TargetValue targetValue : configuration.getTargets()) {
- blockStates.add(targetValue.getValue(worldInfo, random, position, limitedRegion));
- }
- }
-
- int size;
- if (configuration.getSize() == null) {
- size = defaultConfiguration.size;
- } else {
- size = configuration.getSize().getValue(worldInfo, random, position, limitedRegion);
- }
-
- float discardChanceOnAirExposure;
- if (configuration.getDiscardChanceOnAirExposure() == null) {
- discardChanceOnAirExposure = defaultConfiguration.discardChanceOnAirExposure;
- } else {
- discardChanceOnAirExposure = configuration.getDiscardChanceOnAirExposure().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return new OreConfiguration(blockStates, size, discardChanceOnAirExposure);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/ActivationModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/ActivationModifierHook.java
deleted file mode 100644
index 7b16cf6d..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/ActivationModifierHook.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.feature.common.feature.placement.ActivationModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.ActivationConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.PlacementModifierHook;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.levelgen.placement.PlacementContext;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Stream;
-
-// TODO make more generic
-public class ActivationModifierHook extends PlacementModifier implements PlacementModifierHook {
-
- private final Map cache = new ConcurrentHashMap<>();
- private final ActivationModifier activationModifier;
- private final ConfigManager configManager;
- private final Biome biome;
- private final NamespacedKey namespacedKey;
-
- public ActivationModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey) {
- this.configManager = oreControlManager.getConfigManager();
- this.activationModifier = (ActivationModifier) oreControlManager.getRegistries().getPlacementModifierRegistry().get(ActivationModifier.KEY).get();
- this.biome = biome;
- this.namespacedKey = namespacedKey;
-
- oreControlManager.addValueChangeListener(cache::clear);
- }
-
- @Override
- public FeaturePlacementModifier getPlacementModifier() {
- return activationModifier;
- }
-
- @Override
- public Biome getBiome() {
- return biome;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return activationModifier.getKey();
- }
-
- @Override
- public Stream getPositions(PlacementContext context, Random random, BlockPos blockPos) {
- PlacementModifierConfiguration configuration = cache.computeIfAbsent(context.getLevel().getMinecraftWorld().getWorld().getName(), this::loadConfig);
- if (configuration == null) {
- return Stream.of(blockPos);
- }
-
- CraftLimitedRegion limitedRegion = new CraftLimitedRegion(context.getLevel(), new ChunkPos(blockPos));
- Stream pos = activationModifier.getPositions(context.getLevel().getMinecraftWorld().getWorld(), random, new BlockVector(blockPos.getX(), blockPos.getY(), blockPos.getZ()), limitedRegion, (ActivationConfiguration) configuration);
-
- limitedRegion.breakLink();
-
- return pos.map(blockVector -> new BlockPos(blockVector.getBlockX(), blockVector.getBlockY(), blockVector.getBlockZ()));
- }
-
- private PlacementModifierConfiguration loadConfig(String name) {
- Config config = configManager.getGenerationConfig(configManager.getOrCreateConfigInfo(name), biome, namespacedKey).orElse(null);
-
- if (config == null) {
- return null;
- }
-
- if (config.getPlacements() == null) {
- return null;
- }
-
- return config.getPlacements().get(activationModifier);
- }
-
- @Override
- public PlacementModifierType> type() {
- return null;
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/CountModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/CountModifierHook.java
deleted file mode 100644
index 6dc616d5..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/CountModifierHook.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.CountModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R2.ConversionUtil;
-import de.derfrzocker.ore.control.impl.v1_18_R2.NMSReflectionNames;
-import net.minecraft.util.valueproviders.IntProvider;
-import net.minecraft.world.level.levelgen.placement.CountPlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class CountModifierHook extends MinecraftPlacementModifierHook {
-
- public CountModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull CountPlacement defaultModifier) {
- super(oreControlManager, "count", defaultModifier, biome, namespacedKey);
- }
-
- public static CountModifierConfiguration createDefaultConfiguration(@NotNull CountPlacement defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field count = CountPlacement.class.getDeclaredField(NMSReflectionNames.COUNT_PLACEMENT_COUNT);
- count.setAccessible(true);
- IntProvider value = (IntProvider) count.get(defaultModifier);
- IntegerValue integerValue = ConversionUtil.convert(value);
- return new CountModifierConfiguration(modifier, integerValue);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public CountModifierConfiguration createDefaultConfiguration(@NotNull CountPlacement defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public CountPlacement createModifier(@NotNull CountModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull CountModifierConfiguration configuration) {
- int count;
- if (configuration.getCount() == null) {
- count = defaultConfiguration.getCount().getValue(worldInfo, random, position, limitedRegion);
- } else {
- count = configuration.getCount().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return CountPlacement.of(count);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/HeightRangeModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/HeightRangeModifierHook.java
deleted file mode 100644
index 79ea8e83..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/HeightRangeModifierHook.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.HeightRangeModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.IntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.trapezoid.TrapezoidIntegerValue;
-import de.derfrzocker.feature.common.value.number.integer.uniform.UniformIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.offset.NMSAboveBottomOffsetIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.value.offset.NMSBelowTopOffsetIntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R2.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.VerticalAnchor;
-import net.minecraft.world.level.levelgen.heightproviders.ConstantHeight;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
-import net.minecraft.world.level.levelgen.heightproviders.HeightProviderType;
-import net.minecraft.world.level.levelgen.placement.HeightRangePlacement;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class HeightRangeModifierHook extends MinecraftPlacementModifierHook {
-
- public HeightRangeModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull HeightRangePlacement defaultModifier) {
- super(oreControlManager, "height_range", defaultModifier, biome, namespacedKey);
- }
-
- public static HeightRangeModifierConfiguration createDefaultConfiguration(@NotNull HeightRangePlacement defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field height = HeightRangePlacement.class.getDeclaredField(NMSReflectionNames.HEIGHT_RANGE_PLACEMENT_HEIGHT);
- height.setAccessible(true);
- HeightProvider value = (HeightProvider) height.get(defaultModifier);
-
- IntegerValue integerValue;
- if (value.getType() == HeightProviderType.CONSTANT) {
- integerValue = getIntegerValue(value.toString());
- } else if (value.getType() == HeightProviderType.UNIFORM) {
- String uniform = value.toString();
- uniform = uniform.substring(1);
- uniform = uniform.substring(0, uniform.length() - 1);
- int charType = uniform.indexOf("-", 1);
- String[] anchors = new String[]{uniform.substring(0, charType), uniform.substring(charType + 1)};
-
- integerValue = new UniformIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]));
- } else if (value.getType() == HeightProviderType.TRAPEZOID) {
- String trapezoid = value.toString();
- if (trapezoid.startsWith("triangle")) {
- trapezoid = trapezoid.replace("triangle (", "");
- trapezoid = trapezoid.substring(0, trapezoid.length() - 1);
- int charType = trapezoid.indexOf("-", 1);
- String[] anchors = new String[]{trapezoid.substring(0, charType), trapezoid.substring(charType + 1)};
-
- integerValue = new TrapezoidIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]), new FixedDoubleToIntegerValue(0));
- } else if (trapezoid.startsWith("trapezoid")) {
- trapezoid = trapezoid.replace("trapezoid (", "");
- trapezoid = trapezoid.substring(0, trapezoid.length() - 1);
- String[] split = trapezoid.split("\\) in \\[");
-
- if (split.length != 2) {
- throw new IllegalStateException(String.format("Expected a split of size '2', but got '%s' for input '%s'", split.length, trapezoid));
- }
-
- int plateau = Integer.parseInt(split[0]);
- int charType = trapezoid.indexOf("-", 1);
- String[] anchors = new String[]{trapezoid.substring(0, charType), trapezoid.substring(charType + 1)};
- integerValue = new TrapezoidIntegerValue(getIntegerValue(anchors[0]), getIntegerValue(anchors[1]), new FixedDoubleToIntegerValue(plateau));
- } else {
- throw new UnsupportedOperationException(String.format("Unknown trapezoid value '%s'", trapezoid));
- }
-
- } else { // TODO add rest of HeightProvider types
- throw new UnsupportedOperationException(String.format("No integer value equivalent for HeightProvider '%s'", value));
- }
-
- return new HeightRangeModifierConfiguration(modifier, integerValue);
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static IntegerValue getIntegerValue(String anchor) {
- String[] values = anchor.split(" ");
- int value = Integer.parseInt(values[0]);
-
- if (values.length == 2 && values[1].equals("absolute")) {
- return new FixedDoubleToIntegerValue(value);
- }
-
- if (values.length == 3 && values[1].equals("above") && values[2].equals("bottom")) {
- return new NMSAboveBottomOffsetIntegerValue(new FixedDoubleToIntegerValue(value));
- }
-
- if (values.length == 3 && values[1].equals("below") && values[2].equals("top")) {
- return new NMSBelowTopOffsetIntegerValue(new FixedDoubleToIntegerValue(value));
- }
-
- throw new UnsupportedOperationException(String.format("Unknown vertical anchor '%s'", anchor));
- }
-
- @Override
- public HeightRangeModifierConfiguration createDefaultConfiguration(@NotNull HeightRangePlacement defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public HeightRangePlacement createModifier(@NotNull HeightRangeModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull HeightRangeModifierConfiguration configuration) {
- int height;
- if (configuration.getHeight() == null) {
- height = defaultConfiguration.getHeight().getValue(worldInfo, random, position, limitedRegion);
- } else {
- height = configuration.getHeight().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return HeightRangePlacement.of(ConstantHeight.of(VerticalAnchor.absolute(height)));
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/MinecraftPlacementModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/MinecraftPlacementModifierHook.java
deleted file mode 100644
index 729d3b3b..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/MinecraftPlacementModifierHook.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.api.PlacementModifierConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.api.PlacementModifierHook;
-import de.derfrzocker.ore.control.api.config.Config;
-import de.derfrzocker.ore.control.api.config.ConfigManager;
-import net.minecraft.core.BlockPos;
-import net.minecraft.world.level.ChunkPos;
-import net.minecraft.world.level.WorldGenLevel;
-import net.minecraft.world.level.chunk.ChunkGenerator;
-import net.minecraft.world.level.levelgen.placement.PlacedFeature;
-import net.minecraft.world.level.levelgen.placement.PlacementContext;
-import net.minecraft.world.level.levelgen.placement.PlacementModifier;
-import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
-import org.bukkit.NamespacedKey;
-import org.bukkit.craftbukkit.v1_18_R2.generator.CraftLimitedRegion;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.jetbrains.annotations.NotNull;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.stream.Stream;
-
-public abstract class MinecraftPlacementModifierHook extends PlacementModifier implements PlacementModifierHook {
-
- private final Map cache = new ConcurrentHashMap<>();
- private final FeaturePlacementModifier placementModifier;
- private final ConfigManager configManager;
- private final M defaultModifier;
- private final C defaultConfiguration;
- private final Biome biome;
- private final NamespacedKey namespacedKey;
-
- public MinecraftPlacementModifierHook(@NotNull OreControlManager oreControlManager, @NotNull String name, @NotNull M defaultModifier, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey) {
- this.configManager = oreControlManager.getConfigManager();
- this.placementModifier = (FeaturePlacementModifier) oreControlManager.getRegistries().getPlacementModifierRegistry().get(NamespacedKey.minecraft(name)).get();
- this.defaultModifier = defaultModifier;
- this.defaultConfiguration = createDefaultConfiguration(defaultModifier);
- this.biome = biome;
- this.namespacedKey = namespacedKey;
-
- oreControlManager.addValueChangeListener(cache::clear);
- }
-
- public abstract M createModifier(@NotNull C defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull C configuration);
-
- public abstract C createDefaultConfiguration(M defaultModifier);
-
- @Override
- public FeaturePlacementModifier getPlacementModifier() {
- return placementModifier;
- }
-
- @Override
- public Biome getBiome() {
- return biome;
- }
-
- @NotNull
- @Override
- public NamespacedKey getKey() {
- return namespacedKey;
- }
-
- @Override
- public Stream getPositions(PlacementContext context, Random random, BlockPos blockPos) {
- PlacementModifierConfiguration configuration = cache.computeIfAbsent(context.getLevel().getMinecraftWorld().getWorld().getName(), this::loadConfig);
-
- M modifier = defaultModifier;
- if (configuration != null) {
- CraftLimitedRegion limitedRegion = new CraftLimitedRegion(context.getLevel(), new ChunkPos(blockPos));
- modifier = createModifier(defaultConfiguration, context.getLevel().getMinecraftWorld().getWorld(), random, new BlockVector(blockPos.getX(), blockPos.getY(), blockPos.getZ()), limitedRegion, (C) configuration);
- limitedRegion.breakLink();
- }
-
- return getPositions(context.topFeature(), context.getLevel(), context.generator(), random, blockPos, modifier);
- }
-
- private PlacementModifierConfiguration loadConfig(String name) {
- Config config = configManager.getGenerationConfig(configManager.getOrCreateConfigInfo(name), biome, namespacedKey).orElse(null);
-
- if (config == null) {
- return null;
- }
-
- return config.getPlacements().get(placementModifier);
- }
-
- @Override
- public PlacementModifierType> type() {
- return null;
- }
-
- private Stream getPositions(Optional top, WorldGenLevel world, ChunkGenerator generator, Random random, BlockPos pos, M modifier) {
- return modifier.getPositions(new PlacementContext(world, generator, top), random, pos);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/RarityModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/RarityModifierHook.java
deleted file mode 100644
index 90685d24..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/RarityModifierHook.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.feature.placement.configuration.RarityModifierConfiguration;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R2.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.placement.RarityFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.bukkit.util.NumberConversions;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class RarityModifierHook extends MinecraftPlacementModifierHook {
-
- public RarityModifierHook(@NotNull OreControlManager oreControlManager, @NotNull Biome biome, @NotNull NamespacedKey namespacedKey, @NotNull RarityFilter defaultModifier) {
- super(oreControlManager, "rarity_filter", defaultModifier, biome, namespacedKey);
- }
-
- public static RarityModifierConfiguration createDefaultConfiguration(@NotNull RarityFilter defaultModifier, @NotNull FeaturePlacementModifier> modifier) {
- try {
- Field chance = RarityFilter.class.getDeclaredField(NMSReflectionNames.RARITY_FILTER_CHANCE);
- chance.setAccessible(true);
- Object value = chance.get(defaultModifier);
- return new RarityModifierConfiguration(modifier, new FixedDoubleToIntegerValue(NumberConversions.toInt(value)));
- } catch (NoSuchFieldException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
-
- @Override
- public RarityModifierConfiguration createDefaultConfiguration(@NotNull RarityFilter defaultModifier) {
- return createDefaultConfiguration(defaultModifier, getPlacementModifier());
- }
-
- @Override
- public RarityFilter createModifier(@NotNull RarityModifierConfiguration defaultConfiguration, @NotNull WorldInfo worldInfo, @NotNull Random random, @NotNull BlockVector position, @NotNull LimitedRegion limitedRegion, @NotNull RarityModifierConfiguration configuration) {
- int chance;
- if (configuration.getChance() == null) {
- chance = defaultConfiguration.getChance().getValue(worldInfo, random, position, limitedRegion);
- } else {
- chance = configuration.getChance().getValue(worldInfo, random, position, limitedRegion);
- }
-
- return RarityFilter.onAverageOnceEvery(chance);
- }
-}
diff --git a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifierHook.java b/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifierHook.java
deleted file mode 100644
index 543dcb5f..00000000
--- a/impl/v1_18_R2/src/main/java/de/derfrzocker/ore/control/impl/v1_18_R2/placement/SurfaceRelativeThresholdModifierHook.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package de.derfrzocker.ore.control.impl.v1_18_R2.placement;
-
-import de.derfrzocker.feature.api.FeaturePlacementModifier;
-import de.derfrzocker.feature.common.value.number.integer.FixedDoubleToIntegerValue;
-import de.derfrzocker.feature.impl.v1_18_R2.placement.configuration.SurfaceRelativeThresholdModifierConfiguration;
-import de.derfrzocker.ore.control.api.Biome;
-import de.derfrzocker.ore.control.api.OreControlManager;
-import de.derfrzocker.ore.control.impl.v1_18_R2.NMSReflectionNames;
-import net.minecraft.world.level.levelgen.Heightmap;
-import net.minecraft.world.level.levelgen.placement.SurfaceRelativeThresholdFilter;
-import org.bukkit.NamespacedKey;
-import org.bukkit.generator.LimitedRegion;
-import org.bukkit.generator.WorldInfo;
-import org.bukkit.util.BlockVector;
-import org.bukkit.util.NumberConversions;
-import org.jetbrains.annotations.NotNull;
-
-import java.lang.reflect.Field;
-import java.util.Random;
-
-public class SurfaceRelativeThresholdModifierHook extends MinecraftPlacementModifierHook