Compare commits

...

77 Commits

Author SHA1 Message Date
OakLoaf 140fddf9a5 Removed biome-key-format configuration option from default config.yml 2025-07-06 11:59:47 +01:00
OakLoaf 8d8034d4e2 Added biome-key-format configuration option to config.yml 2025-07-03 21:37:45 +01:00
Zoë Gidiere 6b60246694 Merge pull request #514 from PolyhedralDev/dev/1.21.7
Update to 1.21.7
2025-06-30 11:13:24 -06:00
OakLoaf 1a1f461550 Corrected version in fabric.mod.json 2025-06-30 17:57:19 +01:00
OakLoaf da20e282ce Updated Fabric to 1.21.7 2025-06-30 17:53:50 +01:00
OakLoaf 9b14b0ee96 Updated Bukkit to 1.21.7 2025-06-30 16:47:29 +01:00
Zoë Gidiere 118aeb872f Merge pull request #511 from PolyhedralDev/dev/wolves
Fixed wolf variant support for Paper platform
2025-06-23 13:17:18 -06:00
OakLoaf 5446b729f9 Finalised wolves 2025-06-19 21:44:24 +01:00
Oak d71c6bb25f Corrected checks 2025-06-19 21:22:06 +01:00
Oak d8524603c6 Implemented wolf variant support 2025-06-19 21:12:24 +01:00
OakLoaf 85234ddc39 Progress on wolves 2025-06-19 20:50:31 +01:00
OakLoaf 78162eaafe Added vanilla biome key to biome context 2025-06-19 20:49:57 +01:00
OakLoaf 7a041d8a63 Removed unused import 2025-06-19 20:49:37 +01:00
Zoë Gidiere 8cfa2e1467 bump version 2025-06-19 12:23:59 -06:00
Zoë Gidiere 5f367c0f2c Merge pull request #510 from PolyhedralDev/dev/multiverse-fix
Fixed issues causing plugin to fail to load if Multiverse is not present
2025-06-19 12:00:07 -06:00
OakLoaf f4db7fc507 Added initial wolf variant support (not functional) 2025-06-19 15:46:46 +01:00
OakLoaf ad9d16f48c Updated biome collection 2025-06-19 15:46:18 +01:00
OakLoaf 85b6dcc891 Moved all code that requires Multiverse imports into MultiverseGeneratorPluginHook 2025-06-19 14:24:04 +01:00
Zoë Gidiere 29691dfb4d Merge pull request #509 from everbuild-org/master
feat: backport latest minestom support from 7.0 branch
2025-06-18 17:49:21 -06:00
Christian Bergschneider 81eab13ce1 feat: backport latest minestom support from 7.0 branch 2025-06-19 01:42:31 +02:00
Zoë Gidiere 68d5b22ca4 bump fabric dep version 2025-06-17 19:08:14 -06:00
Zoë Gidiere 40b8c85c75 Cleanup 2025-06-17 18:50:24 -06:00
Zoë Gidiere 63367e5f03 Final changes 2025-06-17 18:41:09 -06:00
Zoë Gidiere 1d95e7a87d Merge pull request #506 from benwoo1110/feat/multiverse-hook
Implement multiverse generator plugin hook
2025-06-17 16:23:19 -06:00
Zoë Gidiere b2e21d8b70 Merge pull request #508 from PolyhedralDev/dev/1.21.6
Dev/1.21.6
2025-06-17 15:34:38 -06:00
Zoë Gidiere 4041239b03 fix build 2025-06-17 15:28:47 -06:00
Zoë Gidiere 280699bbce Update to 1.21.6 and fix a lot of bugs in fabric impl 2025-06-17 15:21:21 -06:00
Zoë Gidiere 6984dc29d0 Fix fabric 2025-06-14 00:45:32 -06:00
Zoë Gidiere bd253ea5d2 Merge branch 'master' into dev/1.21.6 2025-06-13 22:08:53 -06:00
OakLoaf d743d7d1df Updated fabric to rc1 2025-06-13 22:50:55 +01:00
OakLoaf 238a7954a7 Added paperweight to bukkit platform for runDevBundleServer task 2025-06-13 21:56:54 +01:00
OakLoaf c2319ca4ab Updated to 1.21.6-rc.1 2025-06-13 20:17:56 +01:00
Ben Woo 95172bfa7e Fix checkstyle for catch 2025-06-13 22:33:41 +08:00
Ben Woo 124dbc8836 Improve error checking for multiverse hook 2025-06-13 19:13:57 +08:00
Zoë Gidiere 8706340584 Fix wolves 2025-06-12 16:25:14 -06:00
OakLoaf 9a9f90aa0d Updated fabric platform to 1.21.6 2025-06-10 12:01:17 +01:00
OakLoaf 20a5bfdd0f Updated bukkit platform to 1.21.6 2025-06-10 11:44:10 +01:00
Ben Woo 4fee8cdb24 More example usages by iterating config pack 2025-06-10 12:06:24 +08:00
Ben Woo 70de38ffcb Fix exception variable name 2025-06-10 12:05:59 +08:00
Ben Woo 6722d22f72 Fix onarandombox repo url 2025-06-10 12:05:46 +08:00
Ben Woo c5526c86a2 Implement multiverse plugin hook 2025-06-09 22:58:41 +08:00
Zoë Gidiere 84fa72f96c Catch all runtime errors when loading packs 2025-06-07 22:14:36 -06:00
Zoë Gidiere cc5258ce73 bump version 2025-06-07 21:12:26 -06:00
Zoë Gidiere 748e027282 Merge pull request #505 from HaHaWTH/master
Identify Moonrise worker threads correctly
2025-06-07 07:18:45 +00:00
HaHaWTH bf6612edd0 Identify Moonrise worker threads correctly 2025-06-07 00:17:51 +14:00
Zoë Gidiere d90a4200fe Update gradle-build.yml 2025-06-05 19:19:43 -06:00
Zoë Gidiere af9fb211a8 bump fabric minecraft dep 2025-06-05 17:50:44 -06:00
Zoë Gidiere e4395cec83 bump version 2025-06-05 17:18:55 -06:00
Zoë Gidiere bab8923f1e update overworld version 2025-06-04 00:21:14 -06:00
Zoë Gidiere b4068e6c59 Merge branch 'dev/1.21.5' 2025-06-03 22:28:48 -06:00
Zoë Gidiere b143c72d0e Dev/1.21.5 (#495)
* Bukkit Build Fix (#494)

* Bukkit Build Fix

* remove comments

* remove papermc repo from gradle settings

* add back gradle shasum

* fix formatting, update gradle hash

* Initial Fabric 1.21.5

* Updated dependencies

* Updated SpawnerData with backwards compat

* Updated dependencies

* Updated setBlockState usage - needs verifying as flags are confusing

* Refactored Bukkit NMS packages

* Initial attempt at updating mixin-commons

* Continue fabric 1.21.5 WIP

* Some additional logging

* Update deps

* Build fixes and update allay

* Add oak to authors

---------

Co-authored-by: Mikal <Ifiht@users.noreply.github.com>
Co-authored-by: OakLoaf <oak@beaconstudios.org>
2025-06-03 22:20:23 -06:00
Zoë Gidiere 5f5e70970b Add oak to authors 2025-06-03 21:40:14 -06:00
Zoë Gidiere ec812ef5fb Build fixes and update allay 2025-06-03 21:33:56 -06:00
Zoë Gidiere 85826071cb Update deps 2025-06-03 20:25:55 -06:00
Zoë Gidiere c4f093210a Some additional logging 2025-06-03 15:15:07 -06:00
Zoë Gidiere f14d22b264 Continue fabric 1.21.5 WIP 2025-06-03 13:59:11 -06:00
OakLoaf 016961c19c Initial attempt at updating mixin-commons 2025-04-17 17:41:45 +01:00
OakLoaf 9f3e225b62 Refactored Bukkit NMS packages 2025-04-17 16:32:59 +01:00
OakLoaf c95df25d30 Updated setBlockState usage - needs verifying as flags are confusing 2025-03-27 20:22:35 +00:00
OakLoaf 0adca3c227 Updated dependencies 2025-03-27 20:21:13 +00:00
OakLoaf 782b300d1f Updated SpawnerData with backwards compat 2025-03-27 19:22:34 +00:00
OakLoaf 967a4a0b2b Updated dependencies 2025-03-27 19:22:23 +00:00
Zoë Gidiere d3df5e56c3 Initial Fabric 1.21.5 2025-03-25 16:26:43 -06:00
Mikal dabc2359b3 Bukkit Build Fix (#494)
* Bukkit Build Fix

* remove comments

* remove papermc repo from gradle settings

* add back gradle shasum

* fix formatting, update gradle hash
2025-03-25 16:25:51 -06:00
solo 1d658bd52d Remove Allay Mappings Submodules (#493)
* Download allay mappings from github instead of using git submodules

Signed-off-by: solonovamax <solonovamax@12oclockpoint.com>

* Remove allay gitignore

Signed-off-by: solonovamax <solonovamax@12oclockpoint.com>

* Use the same dependency notation as the rest of the project

---------

Signed-off-by: solonovamax <solonovamax@12oclockpoint.com>
2025-03-25 15:14:51 -06:00
Zoë Gidiere 4bef2f5a7f Merge pull request #491 from PolyhedralDev/duplexsystem-patch-1
Update Mapping.java
2025-03-06 21:45:41 +00:00
Zoë Gidiere 18cb08b622 Update Mapping.java 2025-03-06 21:45:23 +00:00
Zoë Gidiere 1b15694878 Merge pull request #490 from AllayMC/dev/allay-api-0.2.0
feat: adapt allay-api 0.2.0
2025-03-06 21:32:44 +00:00
Dmitry Luk 267994427e fix: .gitignore 2025-03-07 01:05:15 +04:00
Dmitry Luk 248eb174d8 refactor: use submodules 2025-03-07 01:02:32 +04:00
Dmitry Luk 0a93b0fac3 fix: apply project code style 2025-03-07 00:39:22 +04:00
Dmitry Luk 03124cb008 refactor: mappings loading
docs: add how to use in README.md
2025-03-06 15:22:04 +04:00
Dmitry Luk 14a07602ee fix: correct bundle mapping [
6808d0e](https://github.com/GeyserMC/mappings/commit/6808d0e16a85e5e569d9d7f89ace59c73196c1f4)
chores: sort je default states and add new
2025-03-03 16:23:54 +04:00
daoge_cmd 167a712c0e feat: adapt allay-api 0.2.0 2025-03-03 19:52:25 +08:00
Zoë Gidiere 83bc2c9022 Bump Version 2025-03-02 06:42:12 -07:00
Zoë Gidiere 06a60b3db4 Merge pull request #489 from RitaSister/patch-1
fix crash chunk generate column in generate chunk process
2025-03-02 06:41:41 -07:00
Mirai 1b4824c5db fix crash chunk generate column in generate chunk process
The change removes the subtraction of one from properties.getMinHeight(), fixing a crash on version 1.21.4.
2025-03-02 09:57:48 +02:00
112 changed files with 1874 additions and 1419 deletions
+3 -3
View File
@@ -17,16 +17,16 @@ jobs:
contents: read
steps:
- uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11
- uses: actions/checkout@v4.2.2
- name: Set up JDK 21
uses: actions/setup-java@387ac29b308b003ca37ba93a6cab5eb57c8f5f93
uses: actions/setup-java@v4.7.1
with:
java-version: '21'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
- uses: burrunan/gradle-cache-action@03c71a8ba93d670980695505f48f49daf43704a6
- uses: burrunan/gradle-cache-action@v3.0.1
name: Build Terra
with:
# Specifies arguments for Gradle execution
+3 -3
View File
@@ -1,8 +1,8 @@
preRelease(true)
versionProjects(":common:api", version("6.6.0"))
versionProjects(":common:implementation", version("6.6.0"))
versionProjects(":platforms", version("6.6.0"))
versionProjects(":common:api", version("6.6.5"))
versionProjects(":common:implementation", version("6.6.5"))
versionProjects(":platforms", version("6.6.5"))
allprojects {
+11 -5
View File
@@ -6,6 +6,12 @@ plugins {
repositories {
mavenCentral()
gradlePluginPortal()
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
}
maven("https://repo.codemc.org/repository/maven-public") {
name = "CodeMC"
}
@@ -16,11 +22,11 @@ repositories {
dependencies {
//TODO Allow pulling from Versions.kt
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.1")
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "1.7.2")
implementation("com.gradleup.shadow", "shadow-gradle-plugin", "8.3.6")
implementation("org.ow2.asm", "asm", "9.7")
implementation("org.ow2.asm", "asm-tree", "9.7")
implementation("io.papermc.paperweight.userdev", "io.papermc.paperweight.userdev.gradle.plugin", "2.0.0-beta.17")
implementation("org.ow2.asm", "asm", "9.8")
implementation("org.ow2.asm", "asm-tree", "9.8")
implementation("com.dfsek.tectonic", "common", "4.2.1")
implementation("org.yaml", "snakeyaml", "2.3")
implementation("org.yaml", "snakeyaml", "2.4")
}
+11 -2
View File
@@ -30,6 +30,12 @@ fun Project.configureDependencies() {
repositories {
mavenCentral()
gradlePluginPortal()
maven("https://maven.solo-studios.ca/releases") {
name = "Solo Studios"
}
maven("https://maven.solo-studios.ca/snapshots") {
name = "Solo Studios"
}
maven("https://maven.fabricmc.net/") {
name = "FabricMC"
}
@@ -60,11 +66,14 @@ fun Project.configureDependencies() {
maven("https://storehouse.okaeri.eu/repository/maven-public/") {
name = "Okaeri"
}
maven("https://repo.onarandombox.com/multiverse-releases") {
name = "onarandombox"
}
}
dependencies {
testImplementation("org.junit.jupiter", "junit-jupiter-api", Versions.Libraries.Internal.junit)
testImplementation("org.junit.jupiter", "junit-jupiter-engine", Versions.Libraries.Internal.junit)
testImplementation("org.junit.jupiter", "junit-jupiter", Versions.Libraries.Internal.junit)
"testRuntimeOnly"("org.junit.platform", "junit-platform-launcher")
compileOnly("org.jetbrains", "annotations", Versions.Libraries.Internal.jetBrainsAnnotations)
compileOnly("com.google.guava", "guava", Versions.Libraries.Internal.guava)
+33 -28
View File
@@ -1,6 +1,6 @@
object Versions {
object Terra {
const val overworldConfig = "v1.3.4"
const val overworldConfig = "v1.5.2"
}
object Libraries {
@@ -10,26 +10,26 @@ object Versions {
const val cloud = "2.0.0"
const val caffeine = "3.1.8"
const val caffeine = "3.2.1"
const val slf4j = "2.0.16"
const val slf4j = "2.0.17"
object Internal {
const val shadow = "8.3.3"
const val apacheText = "1.12.0"
const val apacheIO = "2.17.0"
const val guava = "33.3.1-jre"
const val asm = "9.7.1"
const val snakeYml = "2.3"
const val jetBrainsAnnotations = "26.0.1"
const val junit = "5.11.3"
const val shadow = "8.3.6"
const val apacheText = "1.13.1"
const val apacheIO = "2.19.0"
const val guava = "33.4.8-jre"
const val asm = "9.8"
const val snakeYml = "2.4"
const val jetBrainsAnnotations = "26.0.2"
const val junit = "5.13.1"
const val nbt = "6.1"
}
}
object Fabric {
const val fabricAPI = "0.118.0+${Mod.minecraft}"
const val cloud = "2.0.0-beta.9"
const val fabricAPI = "0.128.1+${Mod.minecraft}"
const val cloud = "2.0.0-beta.10"
}
//
// object Quilt {
@@ -38,14 +38,15 @@ object Versions {
// }
object Mod {
const val mixin = "0.15.3+mixin.0.8.7"
const val mixin = "0.15.5+mixin.0.8.7"
const val mixinExtras = "0.4.1"
const val minecraft = "1.21.4"
const val yarn = "$minecraft+build.8"
const val fabricLoader = "0.16.10"
const val minecraft = "1.21.7"
const val yarn = "$minecraft+build.1"
const val fabricLoader = "0.16.14"
const val architecuryLoom = "1.7.413"
const val architecturyPlugin = "3.4.159"
const val architecuryLoom = "1.10.431"
const val architecturyPlugin = "3.4.161"
}
//
@@ -55,18 +56,19 @@ object Versions {
// }
object Bukkit {
const val minecraft = "1.21.4"
const val paperBuild = "$minecraft-R0.1-20241211.212446-17"
const val minecraft = "1.21.7-R0.1"
const val paperBuild = "$minecraft-20250630.144242-1"
const val paper = paperBuild
const val paperLib = "1.0.8"
const val reflectionRemapper = "0.1.1"
const val reflectionRemapper = "0.1.2"
const val paperDevBundle = paperBuild
const val runPaper = "2.3.1"
const val paperWeight = "1.7.2"
const val paperWeight = "2.0.0-beta.17"
const val cloud = "2.0.0-beta.10"
const val multiverse = "5.0.2"
}
//
//
// object Sponge {
// const val sponge = "9.0.0-SNAPSHOT"
// const val mixin = "0.8.2"
@@ -74,15 +76,18 @@ object Versions {
// }
//
object CLI {
const val logback = "1.5.8"
const val picocli = "4.7.6"
const val logback = "1.5.18"
const val picocli = "4.7.7"
}
object Allay {
const val api = "0.1.3"
const val api = "0.4.1"
const val gson = "2.13.1"
const val mappings = "3626653"
const val mappingsGenerator = "366618e"
}
object Minestom {
const val minestom = "187931e50b"
const val minestom = "1_21_6-c3ccee696b"
}
}
+1
View File
@@ -2,6 +2,7 @@ dependencies {
api("ca.solo-studios", "strata", Versions.Libraries.strata)
compileOnlyApi("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
testImplementation("org.slf4j", "slf4j-api", Versions.Libraries.slf4j)
api("org.incendo", "cloud-core", Versions.Libraries.cloud)
api("com.dfsek.tectonic", "common", Versions.Libraries.tectonic)
@@ -8,6 +8,7 @@
package com.dfsek.terra.api.config;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.key.RegistryKey;
public interface PluginConfig {
@@ -23,6 +24,20 @@ public interface PluginConfig {
boolean isDebugLog();
String getBiomeKeyFormat();
default RegistryKey getBiomeKey(ConfigPack pack, RegistryKey biomeKey) {
String format = this.getBiomeKeyFormat()
.replace("%pack_id%", pack.getID().toLowerCase())
.replace("%biome_namespace%", biomeKey.getNamespace().toLowerCase())
.replace("%biome_id%", biomeKey.getID().toLowerCase());
if (format.contains(":")) {
return RegistryKey.parse(format);
} else {
return RegistryKey.of("terra", format);
}
}
int getBiomeSearchResolution();
int getStructureCache();
@@ -5,20 +5,20 @@ import java.util.regex.Pattern;
public final class RegistryKey implements StringIdentifiable, Namespaced {
private static final Pattern ID_PATTERN = Pattern.compile("^[a-zA-Z0-9_-]*$");
private static final Pattern ID_PATTERN = Pattern.compile("^[a-zA-Z0-9/_-]*$");
private final String namespace;
private final String id;
private RegistryKey(String namespace, String id) {
if(!ID_PATTERN.matcher(namespace).matches()) {
throw new IllegalArgumentException(
"Namespace must only contain alphanumeric characters, hyphens, and underscores. \"" + namespace +
"Namespace must only contain alphanumeric characters, hyphens, underscores and forward slashes. \"" + namespace +
"\" is not a valid namespace.");
}
if(!ID_PATTERN.matcher(id).matches()) {
throw new IllegalArgumentException(
"ID must only contain alphanumeric characters, hyphens, and underscores. \"" + id +
"ID must only contain alphanumeric characters, hyphens, underscores and forward slashes. \"" + id +
"\" is not a valid ID.");
}
@@ -31,6 +31,8 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UncheckedIOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
@@ -328,6 +330,28 @@ public abstract class AbstractPlatform implements Platform {
}
private static final String moonrise = "Moonrise";
public static int getMoonriseGenerationThreadsWithReflection() {
try {
Class<?> prioritisedThreadPoolClazz = Class.forName("ca.spottedleaf.concurrentutil.executor.thread.PrioritisedThreadPool");
Method getCoreThreadsMethod = prioritisedThreadPoolClazz.getDeclaredMethod("getCoreThreads");
getCoreThreadsMethod.setAccessible(true);
Class<?> moonriseCommonClazz = Class.forName("ca.spottedleaf.moonrise.common.util.MoonriseCommon");
Object pool = moonriseCommonClazz.getDeclaredField("WORKER_POOL").get(null);
int threads = ((Thread[]) getCoreThreadsMethod.invoke(pool)).length;
logger.info("{} found, setting {} generation threads.", moonrise, threads);
return threads;
} catch (ClassNotFoundException e) {
logger.info("{} not found.", moonrise);
} catch (NoSuchMethodException | NoSuchFieldException e) {
logger.warn("{} found, but field/method not found this probably means {0} has changed its code and " +
"Terra has not updated to reflect that.", moonrise);
} catch (IllegalAccessException | InvocationTargetException e) {
logger.error("Failed to access thread values in {}, assuming 1 generation thread.", moonrise, e);
}
return 0;
}
@Override
public void register(TypeRegistry registry) {
loaders.register(registry);
@@ -55,6 +55,10 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig {
@Default
private boolean debugLog = false;
@Value("biome-key-format")
@Default
private String biomeKeyFormat = "%pack_id%/%biome_namespace%/%biome_id%";
@Value("biome-search-resolution")
@Default
private int biomeSearch = 4;
@@ -124,6 +128,11 @@ public class PluginConfigImpl implements ConfigTemplate, PluginConfig {
return debugLog;
}
@Override
public String getBiomeKeyFormat() {
return biomeKeyFormat;
}
@Override
public int getBiomeSearchResolution() {
return biomeSearch;
@@ -55,7 +55,7 @@ public class ConfigRegistry extends OpenRegistryImpl<ConfigPack> {
for(File dir : Objects.requireNonNull(packsFolder.listFiles(File::isDirectory))) {
try {
load(dir, platform);
} catch(ConfigException e) {
} catch(RuntimeException e) {
logger.error("Error loading config pack {}", dir.getName(), e);
valid = false;
}
@@ -65,7 +65,7 @@ public class ConfigRegistry extends OpenRegistryImpl<ConfigPack> {
try {
logger.info("Loading ZIP archive: {}", zip.getName());
load(new ZipFile(zip), platform);
} catch(IOException | ConfigException e) {
} catch(IOException | RuntimeException e) {
logger.error("Error loading config pack {}", zip.getName(), e);
valid = false;
}
Binary file not shown.
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip
distributionSha256Sum=845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+4 -5
View File
@@ -86,8 +86,7 @@ done
# 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
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
@@ -115,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -206,7 +205,7 @@ fi
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,
# * DEFAULT_JVM_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.
@@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
Vendored
+2 -2
View File
@@ -70,11 +70,11 @@ goto fail
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
+3 -4
View File
@@ -4,7 +4,6 @@
Current mapping version: je 1.21.4 to be 1.21.50
- `mapping/biomes.json` obtain from GeyserMC/mappings.
- `mapping/items.json` obtain from GeyserMC/mappings.
- `mapping/blocks.json` generated by using GeyserMC/mappings-generator, and it's origin name is `generator_blocks.json`.
- `je_block_default_states.json` converted from https://zh.minecraft.wiki/w/Module:Block_state_values.
- `mapping/biomes.json` and `mapping/items.json` obtain from [GeyserMC/mappings](https://github.com/GeyserMC/mappings).
- `mapping/blocks.json` generated by using [GeyserMC/mappings-generator](https://github.com/GeyserMC/mappings-generator), and it's origin name is `generator_blocks.json`.
- `je_block_default_states.json` converted from [Block state values](https://zh.minecraft.wiki/w/Module:Block_state_values).
+32
View File
@@ -1,5 +1,37 @@
repositories {
ivy {
url = uri("https://raw.githubusercontent.com/")
patternLayout {
artifact("[organisation]/[revision]/[artifact].([ext])")
setM2compatible(true)
}
metadataSources {
artifact()
}
}
}
val geyserMappings: Configuration by configurations.register("geyserMappings") {
isCanBeConsumed = false
}
dependencies {
shadedApi(project(":common:implementation:base"))
implementation("com.google.code.gson", "gson", Versions.Allay.gson)
compileOnly("org.allaymc.allay", "api", Versions.Allay.api)
geyserMappings("GeyserMC.mappings", "items", Versions.Allay.mappings, ext = "json")
geyserMappings("GeyserMC.mappings", "biomes", Versions.Allay.mappings, ext = "json")
geyserMappings("GeyserMC.mappings-generator", "generator_blocks", Versions.Allay.mappingsGenerator, ext = "json")
}
tasks.processResources {
from(geyserMappings) {
into("mapping")
// rather jank, but whatever
rename("(?:generator_)?([^-]+)-(.*)\\.json", "$1.json")
}
}
@@ -1,36 +1,48 @@
package com.dfsek.terra.allay;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.TypeAdapterFactory;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import org.allaymc.api.block.type.BlockState;
import org.allaymc.api.block.type.BlockStateSafeGetter;
import org.allaymc.api.block.type.BlockStateSafeGetter.Getter;
import org.allaymc.api.block.type.BlockTypes;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.item.type.ItemTypeSafeGetter;
import org.allaymc.api.utils.JSONUtils;
import org.jetbrains.annotations.Nullable;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.Objects;
import java.util.TreeMap;
/**
* @author daoge_cmd
* @author IWareQ
*/
public final class Mapping {
private static final Gson GSON = new GsonBuilder()
.registerTypeAdapterFactory(new IgnoreFailureTypeAdapterFactory())
.create();
private static final Map<String, Map<String, String>> JE_BLOCK_DEFAULT_PROPERTIES = new Object2ObjectOpenHashMap<>();
private static final Map<BlockState, JeBlockState> BLOCK_STATE_BE_TO_JE = new Object2ObjectOpenHashMap<>();
private static final Map<Integer, BlockState> BLOCK_STATE_JE_HASH_TO_BE = new Int2ObjectOpenHashMap<>();
private static final Map<String, ItemType<?>> ITEM_ID_JE_TO_BE = new Object2ObjectOpenHashMap<>();
private static final Map<String, Integer> BIOME_ID_JE_TO_BE = new Object2IntOpenHashMap<>();
private static final Map<BlockState, JeBlockState> BE_BLOCK_STATE_TO_JE = new Object2ObjectOpenHashMap<>();
private static final Map<Integer, BlockState> JE_BLOCK_STATE_HASH_TO_BE = new Int2ObjectOpenHashMap<>();
private static final Map<String, ItemType<?>> JE_ITEM_ID_TO_BE = new Object2ObjectOpenHashMap<>();
private static final Map<String, Integer> JE_BIOME_ID_TO_BE = new Object2IntOpenHashMap<>();
private static final BlockState BE_AIR_STATE = BlockTypes.AIR.getDefaultState();
public static void init() {
@@ -41,11 +53,11 @@ public final class Mapping {
}
public static JeBlockState blockStateBeToJe(BlockState beBlockState) {
return BLOCK_STATE_BE_TO_JE.get(beBlockState);
return BE_BLOCK_STATE_TO_JE.get(beBlockState);
}
public static BlockState blockStateJeToBe(JeBlockState jeBlockState) {
BlockState result = BLOCK_STATE_JE_HASH_TO_BE.get(jeBlockState.getHash());
BlockState result = JE_BLOCK_STATE_HASH_TO_BE.get(jeBlockState.getHash());
if(result == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find be block state for {}", jeBlockState);
return BE_AIR_STATE;
@@ -54,7 +66,7 @@ public final class Mapping {
}
public static ItemType<?> itemIdJeToBe(String jeItemId) {
return ITEM_ID_JE_TO_BE.get(jeItemId);
return JE_ITEM_ID_TO_BE.get(jeItemId);
}
// Enchantment identifiers are same in both versions
@@ -68,15 +80,16 @@ public final class Mapping {
}
public static int biomeIdJeToBe(String jeBiomeId) {
return BIOME_ID_JE_TO_BE.get(jeBiomeId);
return JE_BIOME_ID_TO_BE.get(jeBiomeId);
}
public static Map<String, String> getJeBlockDefaultProperties(String jeBlockIdentifier) {
Map<String, String> defaultProperties = JE_BLOCK_DEFAULT_PROPERTIES.get(jeBlockIdentifier);
var defaultProperties = JE_BLOCK_DEFAULT_PROPERTIES.get(jeBlockIdentifier);
if(defaultProperties == null) {
TerraAllayPlugin.INSTANCE.getPluginLogger().warn("Failed to find default properties for {}", jeBlockIdentifier);
return Map.of();
}
return defaultProperties;
}
@@ -90,8 +103,9 @@ public final class Mapping {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("biomes mapping not found");
return false;
}
Set<Entry<String, Map<String, Integer>>> mappings = JSONUtils.from(stream, new TypeToken<Map<String, Map<String, Integer>>>(){}).entrySet();
mappings.forEach(mapping -> BIOME_ID_JE_TO_BE.put(mapping.getKey(), mapping.getValue().get("bedrock_id")));
Map<String, BiomeMapping> mappings = from(stream, new TypeToken<>() {});
mappings.forEach((javaId, mapping) -> JE_BIOME_ID_TO_BE.put(javaId, mapping.bedrockId()));
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load biomes mapping", e);
return false;
@@ -105,17 +119,18 @@ public final class Mapping {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("items mapping not found");
return false;
}
Set<Entry<String, Map<String, Object>>> mappings = JSONUtils.from(stream, new TypeToken<Map<String, Map<String, Object>>>() {}).entrySet();
mappings.forEach(mapping -> {
ItemType<?> item = ItemTypeSafeGetter
.name((String) mapping.getValue().get("bedrock_identifier"))
// NOTICE: should be cast to double
.meta(((Double) mapping.getValue().get("bedrock_data")).intValue())
Map<String, ItemMapping> mappings = from(stream, new TypeToken<>() {});
mappings.forEach((javaId, mapping) -> {
ItemType<?> itemType = ItemTypeSafeGetter
.name(mapping.bedrockId())
.meta(mapping.bedrockData())
.itemType();
ITEM_ID_JE_TO_BE.put(mapping.getKey(), item);
JE_ITEM_ID_TO_BE.put(javaId, itemType);
});
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load items mapping", e);
return false;
}
return true;
}
@@ -126,16 +141,18 @@ public final class Mapping {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("blocks mapping not found");
return false;
}
// noinspection unchecked
List<Map<String, Map<String, Object>>> mappings = (List<Map<String, Map<String, Object>>>) JSONUtils.from(stream, new TypeToken<Map<String, Object>>() {}).get("mappings");
Map<String, List<BlockMapping>> root = from(stream, new TypeToken<>() {});
List<BlockMapping> mappings = root.get("mappings");
mappings.forEach(mapping -> {
JeBlockState jeState = createJeBlockState(mapping.get("java_state"));
BlockState beState = createBeBlockState(mapping.get("bedrock_state"));
BLOCK_STATE_BE_TO_JE.put(beState, jeState);
BLOCK_STATE_JE_HASH_TO_BE.put(jeState.getHash(), beState);
JeBlockState jeState = createJeBlockState(mapping.javaState());
BlockState beState = createBeBlockState(mapping.bedrockState());
BE_BLOCK_STATE_TO_JE.put(beState, jeState);
JE_BLOCK_STATE_HASH_TO_BE.put(jeState.getHash(), beState);
});
} catch(IOException e) {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("Failed to load blocks mapping", e);
return false;
}
return true;
}
@@ -146,30 +163,30 @@ public final class Mapping {
TerraAllayPlugin.INSTANCE.getPluginLogger().error("je_block_default_states.json not found");
return false;
}
Map<String, Map<String, String>> states = JSONUtils.from(stream, new TypeToken<>() {});
for(Entry<String, Map<String, String>> entry : states.entrySet()) {
String identifier = entry.getKey();
Map<String, String> properties = entry.getValue();
JE_BLOCK_DEFAULT_PROPERTIES.put(identifier, properties);
}
Map<String, Map<String, String>> states = from(stream, new TypeToken<>() {});
JE_BLOCK_DEFAULT_PROPERTIES.putAll(states);
} catch(IOException e) {
throw new RuntimeException(e);
}
return true;
}
private static BlockState createBeBlockState(Map<String, Object> data) {
Getter getter = BlockStateSafeGetter
.name("minecraft:" + data.get("bedrock_identifier"));
if(data.containsKey("state")) {
// noinspection unchecked
convertValueType((Map<String, Object>) data.get("state")).forEach(getter::property);
private static JeBlockState createJeBlockState(BlockMapping.JavaState state) {
Map<String, String> properties = state.properties() == null ? Map.of() : state.properties();
return JeBlockState.create(state.name(), new TreeMap<>(properties));
}
private static BlockState createBeBlockState(BlockMapping.BedrockState state) {
BlockStateSafeGetter.Getter getter = BlockStateSafeGetter.name("minecraft:" + state.bedrockId());
if(state.state() != null) {
convertValueType(state.state()).forEach(getter::property);
}
return getter.blockState();
}
private static Map<String, Object> convertValueType(Map<String, Object> data) {
TreeMap<String, Object> result = new TreeMap<>();
Map<String, Object> result = new TreeMap<>();
for(Entry<String, Object> entry : data.entrySet()) {
if(entry.getValue() instanceof Number number) {
// Convert double to int because the number in json is double
@@ -178,11 +195,78 @@ public final class Mapping {
result.put(entry.getKey(), entry.getValue());
}
}
return result;
}
private static JeBlockState createJeBlockState(Map<String, Object> data) {
// noinspection unchecked
return JeBlockState.create((String) data.get("Name"), new TreeMap<>((Map<String, String>) data.getOrDefault("Properties", Map.of())));
public static <V> V from(InputStream inputStream, TypeToken<V> typeToken) {
JsonReader reader = new JsonReader(new InputStreamReader(Objects.requireNonNull(inputStream)));
return GSON.fromJson(reader, typeToken.getType());
}
public record BiomeMapping(
@SerializedName("bedrock_id")
int bedrockId
) {
}
public record ItemMapping(
@SerializedName("bedrock_identifier")
String bedrockId,
@SerializedName("bedrock_data")
int bedrockData
) {
}
public record BlockMapping(
@SerializedName("java_state")
BlockMapping.JavaState javaState,
@SerializedName("bedrock_state")
BlockMapping.BedrockState bedrockState
) {
public record JavaState(
@SerializedName("Name")
String name,
@Nullable
@SerializedName("Properties")
Map<String, String> properties
) {
}
public record BedrockState(
@SerializedName("bedrock_identifier")
String bedrockId,
@Nullable
Map<String, Object> state
) {
}
}
// see https://stackoverflow.com/questions/59655279/is-there-an-easy-way-to-make-gson-skip-a-field-if-theres-an-error-deserializing
public static class IgnoreFailureTypeAdapterFactory implements TypeAdapterFactory {
@Override
public <T> TypeAdapter<T> create(Gson gson, TypeToken<T> typeToken) {
TypeAdapter<T> delegate = gson.getDelegateAdapter(this, typeToken);
return new TypeAdapter<>() {
@Override
public void write(JsonWriter writer, T value) throws IOException {
delegate.write(writer, value);
}
@Override
public T read(JsonReader reader) throws IOException {
try {
return delegate.read(reader);
} catch(Exception e) {
reader.skipValue();
return null;
}
}
};
}
}
}
@@ -38,7 +38,7 @@ public record AllayItemStack(ItemStack allayItemStack) implements com.dfsek.terr
allayItemStack.addEnchantment(enchantment.getType(), enchantment.getLevel());
}
allayItemStack.setLore(targetItem.getLore());
allayItemStack.setDurability(targetItem.getDurability());
allayItemStack.setDamage(targetItem.getDamage());
allayItemStack.setCustomName(targetItem.getCustomName());
allayItemStack.setMeta(targetItem.getMeta());
}
@@ -1,8 +1,6 @@
package com.dfsek.terra.allay.delegate;
import org.allaymc.api.item.data.ItemId;
import org.allaymc.api.item.type.ItemType;
import org.allaymc.api.registry.Registries;
import com.dfsek.terra.api.inventory.Item;
@@ -16,7 +14,7 @@ public final class AllayItemType implements Item {
public AllayItemType(ItemType<?> allayItemType) {
this.allayItemType = allayItemType;
this.maxDurability = Registries.ITEM_DATA.get(ItemId.fromIdentifier(allayItemType.getIdentifier())).maxDamage();
this.maxDurability = allayItemType.getItemData().maxDamage();
}
@Override
File diff suppressed because it is too large Load Diff
@@ -1,197 +0,0 @@
{
"minecraft:badlands": {
"bedrock_id": 37
},
"minecraft:bamboo_jungle": {
"bedrock_id": 48
},
"minecraft:basalt_deltas": {
"bedrock_id": 181
},
"minecraft:beach": {
"bedrock_id": 16
},
"minecraft:birch_forest": {
"bedrock_id": 27
},
"minecraft:cherry_grove": {
"bedrock_id": 192
},
"minecraft:cold_ocean": {
"bedrock_id": 44
},
"minecraft:crimson_forest": {
"bedrock_id": 179
},
"minecraft:dark_forest": {
"bedrock_id": 29
},
"minecraft:deep_cold_ocean": {
"bedrock_id": 45
},
"minecraft:deep_dark": {
"bedrock_id": 190
},
"minecraft:deep_frozen_ocean": {
"bedrock_id": 47
},
"minecraft:deep_lukewarm_ocean": {
"bedrock_id": 43
},
"minecraft:deep_ocean": {
"bedrock_id": 24
},
"minecraft:desert": {
"bedrock_id": 2
},
"minecraft:dripstone_caves": {
"bedrock_id": 188
},
"minecraft:end_barrens": {
"bedrock_id": 9
},
"minecraft:end_highlands": {
"bedrock_id": 9
},
"minecraft:end_midlands": {
"bedrock_id": 9
},
"minecraft:eroded_badlands": {
"bedrock_id": 165
},
"minecraft:flower_forest": {
"bedrock_id": 132
},
"minecraft:forest": {
"bedrock_id": 4
},
"minecraft:frozen_ocean": {
"bedrock_id": 46
},
"minecraft:frozen_peaks": {
"bedrock_id": 183
},
"minecraft:frozen_river": {
"bedrock_id": 11
},
"minecraft:grove": {
"bedrock_id": 185
},
"minecraft:ice_spikes": {
"bedrock_id": 140
},
"minecraft:jagged_peaks": {
"bedrock_id": 182
},
"minecraft:jungle": {
"bedrock_id": 21
},
"minecraft:lukewarm_ocean": {
"bedrock_id": 42
},
"minecraft:lush_caves": {
"bedrock_id": 187
},
"minecraft:mangrove_swamp": {
"bedrock_id": 191
},
"minecraft:meadow": {
"bedrock_id": 186
},
"minecraft:mushroom_fields": {
"bedrock_id": 14
},
"minecraft:nether_wastes": {
"bedrock_id": 8
},
"minecraft:ocean": {
"bedrock_id": 0
},
"minecraft:old_growth_birch_forest": {
"bedrock_id": 155
},
"minecraft:old_growth_pine_taiga": {
"bedrock_id": 32
},
"minecraft:old_growth_spruce_taiga": {
"bedrock_id": 160
},
"minecraft:pale_garden": {
"bedrock_id": 62
},
"minecraft:plains": {
"bedrock_id": 1
},
"minecraft:river": {
"bedrock_id": 7
},
"minecraft:savanna": {
"bedrock_id": 35
},
"minecraft:savanna_plateau": {
"bedrock_id": 36
},
"minecraft:small_end_islands": {
"bedrock_id": 9
},
"minecraft:snowy_beach": {
"bedrock_id": 26
},
"minecraft:snowy_plains": {
"bedrock_id": 12
},
"minecraft:snowy_slopes": {
"bedrock_id": 184
},
"minecraft:snowy_taiga": {
"bedrock_id": 30
},
"minecraft:soul_sand_valley": {
"bedrock_id": 178
},
"minecraft:sparse_jungle": {
"bedrock_id": 23
},
"minecraft:stony_peaks": {
"bedrock_id": 189
},
"minecraft:stony_shore": {
"bedrock_id": 25
},
"minecraft:sunflower_plains": {
"bedrock_id": 129
},
"minecraft:swamp": {
"bedrock_id": 6
},
"minecraft:taiga": {
"bedrock_id": 5
},
"minecraft:the_end": {
"bedrock_id": 9
},
"minecraft:the_void": {
"bedrock_id": 7
},
"minecraft:warm_ocean": {
"bedrock_id": 40
},
"minecraft:warped_forest": {
"bedrock_id": 180
},
"minecraft:windswept_forest": {
"bedrock_id": 34
},
"minecraft:windswept_gravelly_hills": {
"bedrock_id": 131
},
"minecraft:windswept_hills": {
"bedrock_id": 3
},
"minecraft:windswept_savanna": {
"bedrock_id": 163
},
"minecraft:wooded_badlands": {
"bedrock_id": 38
}
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+10 -1
View File
@@ -1,10 +1,14 @@
plugins {
id("io.papermc.paperweight.userdev")
id("xyz.jpenilla.run-paper") version Versions.Bukkit.runPaper
}
dependencies {
// Required for :platforms:bukkit:runDevBundleServer task
paperweight.paperDevBundle(Versions.Bukkit.paperDevBundle)
shaded(project(":platforms:bukkit:common"))
shaded(project(":platforms:bukkit:nms:v1_21_3", configuration = "reobf"))
shaded(project(":platforms:bukkit:nms:v1_21_7"))
shaded("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
}
@@ -26,6 +30,11 @@ tasks {
minecraftVersion(Versions.Bukkit.minecraft)
dependsOn(shadowJar)
pluginJars(shadowJar.get().archiveFile)
downloadPlugins {
modrinth("viaversion", "5.3.2")
modrinth("viabackwards", "5.3.2")
}
}
}
+2
View File
@@ -7,6 +7,8 @@ dependencies {
compileOnly("io.papermc.paper", "paper-api", Versions.Bukkit.paper)
compileOnly("org.mvplugins.multiverse.core", "multiverse-core", Versions.Bukkit.multiverse)
shadedApi("io.papermc", "paperlib", Versions.Bukkit.paperLib)
shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava)
@@ -23,7 +23,10 @@ import com.dfsek.tectonic.api.exception.LoadException;
import com.dfsek.terra.bukkit.nms.Initializer;
import io.papermc.paper.registry.RegistryAccess;
import io.papermc.paper.registry.RegistryKey;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.entity.EntityType;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
@@ -31,7 +34,6 @@ import org.slf4j.LoggerFactory;
import java.io.File;
import java.util.List;
import java.util.Locale;
import com.dfsek.terra.AbstractPlatform;
import com.dfsek.terra.api.addon.BaseAddon;
@@ -57,7 +59,7 @@ public class PlatformImpl extends AbstractPlatform {
private int generationThreads;
public PlatformImpl(TerraBukkitPlugin plugin) {
generationThreads = getGenerationThreadsWithReflection("ca.spottedleaf.moonrise.common.util.MoonriseCommon", "WORKER_THREADS", "Moonrise");
generationThreads = getMoonriseGenerationThreadsWithReflection();
if (generationThreads == 0) {
generationThreads = 1;
}
@@ -132,7 +134,8 @@ public class PlatformImpl extends AbstractPlatform {
}
private BukkitPlatformBiome parseBiome(String id, DepthTracker depthTracker) throws LoadException {
if(!id.startsWith("minecraft:")) throw new LoadException("Invalid biome identifier " + id, depthTracker);
return new BukkitPlatformBiome(org.bukkit.block.Biome.valueOf(id.toUpperCase(Locale.ROOT).substring(10)));
NamespacedKey key = NamespacedKey.fromString(id);
if(key == null || !key.namespace().equals("minecraft")) throw new LoadException("Invalid biome identifier " + id, depthTracker);
return new BukkitPlatformBiome(RegistryAccess.registryAccess().getRegistry(RegistryKey.BIOME).getOrThrow(key));
}
}
@@ -87,7 +87,7 @@ public class TerraBukkitPlugin extends JavaPlugin {
return;
}
Bukkit.getPluginManager().registerEvents(new CommonListener(), this); // Register master event listener
Bukkit.getPluginManager().registerEvents(new CommonListener(platform), this); // Register master event listener
PaperUtil.checkPaper(this);
}
@@ -0,0 +1,53 @@
package com.dfsek.terra.bukkit.hooks;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.key.Keyed;
import org.mvplugins.multiverse.core.MultiverseCoreApi;
import org.mvplugins.multiverse.core.world.generators.GeneratorPlugin;
import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull;
import org.mvplugins.multiverse.external.jetbrains.annotations.Nullable;
import java.util.Collection;
public final class MultiverseGeneratorPluginHook implements GeneratorPlugin {
private final Platform platform;
public MultiverseGeneratorPluginHook(Platform platform) {
this.platform = platform;
}
@Override
public @NotNull Collection<String> suggestIds(@Nullable String s) {
return platform.getConfigRegistry().entries().stream()
.map(Keyed::getID)
.toList();
}
@Override
public @Nullable Collection<String> getExampleUsages() {
return platform.getConfigRegistry()
.entries()
.stream()
.map(Keyed::getID)
.map("/mv create example_world NORMAL -g Terra:%s"::formatted)
.limit(5) // reasonable amount
.toList();
}
@Override
public @Nullable String getInfoLink() {
return "https://terra.polydev.org/";
}
@Override
public @NotNull String getPluginName() {
return "Terra";
}
public static void register(Platform platform) {
MultiverseCoreApi.get().getGeneratorProvider()
.registerGeneratorPlugin(new MultiverseGeneratorPluginHook(platform));
}
}
@@ -17,13 +17,100 @@
package com.dfsek.terra.bukkit.listeners;
import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper;
import com.dfsek.terra.bukkit.hooks.MultiverseGeneratorPluginHook;
import com.dfsek.terra.bukkit.world.BukkitBiomeInfo;
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
import org.bukkit.NamespacedKey;
import org.bukkit.World;
import org.bukkit.entity.Wolf;
import org.bukkit.entity.Wolf.Variant;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.server.PluginEnableEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
/**
* Listener for events on all implementations.
*/
public class CommonListener implements Listener {
public CommonListener() {
private static final Logger logger = LoggerFactory.getLogger(CommonListener.class);
private static final List<SpawnReason> WOLF_VARIANT_SPAWN_REASONS = List.of(
SpawnReason.SPAWNER, SpawnReason.TRIAL_SPAWNER, SpawnReason.SPAWNER_EGG, SpawnReason.DEFAULT
);
private final Platform platform;
public CommonListener(Platform platform) {
this.platform = platform;
}
@EventHandler
public void onPluginEnable(PluginEnableEvent event) {
if(event.getPlugin().getName().equals("Multiverse-Core")) {
try {
Class.forName("org.mvplugins.multiverse.core.MultiverseCoreApi");
MultiverseGeneratorPluginHook.register(platform);
} catch(ClassNotFoundException e) {
logger.debug("Multiverse v5 is not installed.");
} catch(IllegalStateException e) {
logger.error("Failed to register Terra generator plugin to multiverse.", e);
}
}
}
@EventHandler
public void onWolfSpawn(CreatureSpawnEvent event) {
if (!(event.getEntity() instanceof Wolf wolf)) {
return;
}
// Doesn't apply if variant has already been applied
if (wolf.getVariant() != Variant.PALE) {
return;
}
if (!WOLF_VARIANT_SPAWN_REASONS.contains(event.getSpawnReason())) {
return;
}
World world = wolf.getWorld();
if (!(world.getGenerator() instanceof BukkitChunkGeneratorWrapper wrapper)) {
return;
}
ConfigPack pack = platform.getConfigRegistry().get(wrapper.getPack().getRegistryKey()).orElse(null);
if (pack == null) {
return;
}
NamespacedKey biomeKey = wolf.getWorld().getBiome(wolf.getLocation()).getKey();
pack.getBiomeProvider().stream()
.filter(biome -> {
NamespacedKey key = ((BukkitPlatformBiome) biome.getPlatformBiome()).getContext()
.get(BukkitBiomeInfo.class)
.biomeKey();
return key.equals(biomeKey);
})
.findFirst()
.ifPresent(biome -> {
NamespacedKey vanillaBiomeKey = ((BukkitPlatformBiome) biome.getPlatformBiome()).getHandle().getKey();
switch(vanillaBiomeKey.toString()) {
case "minecraft:snowy_taiga" -> wolf.setVariant(Variant.ASHEN);
case "minecraft:old_growth_pine_taiga" -> wolf.setVariant(Variant.BLACK);
case "minecraft:old_growth_spruce_taiga" -> wolf.setVariant(Variant.CHESTNUT);
case "minecraft:grove" -> wolf.setVariant(Variant.SNOWY);
case "minecraft:forest" -> wolf.setVariant(Variant.WOODS);
}
});
}
}
@@ -54,8 +54,8 @@ public interface Initializer {
private static Initializer constructInitializer() {
try {
String packageVersion = NMS;
if (NMS.equals("v1_21_4")) {
packageVersion = "v1_21_3";
if (NMS.equals("v1_21_5") || NMS.equals("v1_21_6")) {
packageVersion = "v1_21_7";
}
Class<?> initializerClass = Class.forName(TERRA_PACKAGE + "." + packageVersion + ".NMSInitializer");
@@ -0,0 +1,8 @@
package com.dfsek.terra.bukkit.world;
import com.dfsek.terra.api.properties.Properties;
import org.bukkit.NamespacedKey;
public record BukkitBiomeInfo(NamespacedKey biomeKey) implements Properties {}
@@ -2,7 +2,7 @@ name: "Terra"
main: "com.dfsek.terra.bukkit.TerraBukkitPlugin"
version: "@VERSION@"
load: "STARTUP"
authors: [ "dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade" ]
authors: [ "dfsek", "duplexsystem", "Astrash", "solonovamax", "Sancires", "Aureus", "RogueShade", "OakLoaf" ]
website: "@WIKI@"
api-version: "1.21.1"
description: "@DESCRIPTION@"
@@ -1,13 +0,0 @@
apply(plugin = "io.papermc.paperweight.userdev")
dependencies {
api(project(":platforms:bukkit:common"))
paperDevBundle(Versions.Bukkit.paperDevBundle)
implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
}
tasks {
assemble {
dependsOn("reobfJar")
}
}
@@ -0,0 +1,9 @@
plugins {
id("io.papermc.paperweight.userdev")
}
dependencies {
api(project(":platforms:bukkit:common"))
paperweight.paperDevBundle(Versions.Bukkit.paperDevBundle)
implementation("xyz.jpenilla", "reflection-remapper", Versions.Bukkit.reflectionRemapper)
}
@@ -1,6 +1,9 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.PlatformImpl;
import com.dfsek.terra.bukkit.nms.v1_21_7.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.world.BukkitBiomeInfo;
import net.minecraft.core.Holder;
import net.minecraft.core.Holder.Reference;
@@ -26,7 +29,6 @@ import java.util.Set;
import java.util.stream.Collectors;
import com.dfsek.terra.bukkit.world.BukkitPlatformBiome;
import com.dfsek.terra.registry.master.ConfigRegistry;
public class AwfulBukkitHacks {
@@ -34,7 +36,7 @@ public class AwfulBukkitHacks {
private static final Map<ResourceLocation, List<ResourceLocation>> terraBiomeMap = new HashMap<>();
public static void registerBiomes(ConfigRegistry configRegistry) {
public static void registerBiomes(PlatformImpl platform) {
try {
LOGGER.info("Hacking biome registry...");
MappedRegistry<Biome> biomeRegistry = (MappedRegistry<Biome>) RegistryFetcher.biomeRegistry();
@@ -43,7 +45,7 @@ public class AwfulBukkitHacks {
Reflection.MAPPED_REGISTRY.setFrozen(biomeRegistry, false);
// Register the terra biomes to the registry
configRegistry.forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
platform.getRawConfigRegistry().forEach(pack -> pack.getRegistry(com.dfsek.terra.api.world.biome.Biome.class).forEach((key, biome) -> {
try {
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
@@ -52,16 +54,15 @@ public class AwfulBukkitHacks {
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties);
Biome nmsBiome = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(), vanillaBiomeProperties);
ResourceLocation delegateMinecraftKey = ResourceLocation.tryParse(platform.getTerraConfig().getBiomeKey(pack, key).toString());
NamespacedKey delegateBukkitKey = NamespacedKey.fromString(delegateMinecraftKey.toString());
ResourceKey<Biome> delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey);
ResourceKey<Biome> delegateKey = ResourceKey.create(
Registries.BIOME,
ResourceLocation.fromNamespaceAndPath("terra", NMSBiomeInjector.createBiomeID(pack, key))
);
Reference<Biome> holder = biomeRegistry.register(delegateKey, platform, RegistrationInfo.BUILT_IN);
Reflection.REFERENCE.invokeBindValue(holder, platform); // IMPORTANT: bind holder.
Reference<Biome> holder = biomeRegistry.register(delegateKey, nmsBiome, RegistrationInfo.BUILT_IN);
Reflection.REFERENCE.invokeBindValue(holder, nmsBiome); // IMPORTANT: bind holder.
platformBiome.getContext().put(new BukkitBiomeInfo(delegateBukkitKey));
platformBiome.getContext().put(new NMSBiomeInfo(delegateKey));
terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
@@ -1,11 +1,11 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import com.dfsek.terra.api.event.events.config.ConfigurationLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.bukkit.BukkitAddon;
import com.dfsek.terra.bukkit.PlatformImpl;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.nms.v1_21_7.config.VanillaBiomeProperties;
public class NMSAddon extends BukkitAddon {
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.resources.ResourceKey;
import net.minecraft.world.level.biome.Biome;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
@@ -12,7 +12,7 @@ import java.util.Objects;
import java.util.Optional;
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.bukkit.nms.v1_21_3.config.VanillaBiomeProperties;
import com.dfsek.terra.bukkit.nms.v1_21_7.config.VanillaBiomeProperties;
public class NMSBiomeInjector {
@@ -33,9 +33,8 @@ public class NMSBiomeInjector {
.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
.waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor()))
.skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
.grassColorModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getSpecialEffects().getGrassColorModifier()));
// .grassColorOverride(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColor(), vanilla.getSpecialEffects().getGrassColorOverride().orElseGet(() -> Reflection.BIOME.invokeGrassColorFromTexture(vanilla))))
// .foliageColorOverride(Objects.requireNonNullElse(vanillaBiomeProperties.getFoliageColor(), vanilla.getFoliageColor()));
.grassColorModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getSpecialEffects().getGrassColorModifier()))
.backgroundMusicVolume(Objects.requireNonNullElse(vanillaBiomeProperties.getMusicVolume(), vanilla.getBackgroundMusicVolume()));
if(vanillaBiomeProperties.getGrassColor() == null) {
vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride);
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.Holder;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import com.mojang.serialization.MapCodec;
import net.minecraft.core.BlockPos;
@@ -116,10 +116,10 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
if(noise > threshold) {
chunk.setBlockState(new BlockPos(x, y, z), ((CraftBlockData) ((BukkitBlockState) delegate
.getPalette(x + xi, y, z + zi, world, biomeProvider)
.get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), false);
.get(depth, x + xi, y, z + zi, world.getSeed())).getHandle()).getState(), 0);
depth++;
} else if(noise < airThreshold) {
chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), false);
chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.defaultBlockState(), 0);
} else {
depth = 0;
}
@@ -155,7 +155,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator {
BlockState[] array = new BlockState[world.getHeight()];
WorldProperties properties = new NMSWorldProperties(seed, world);
BiomeProvider biomeProvider = pack.getBiomeProvider();
for(int y = properties.getMaxHeight() - 1; y >= properties.getMinHeight(); y--) {
for(int y = properties.getMaxHeight(); y >= properties.getMinHeight(); y--) {
array[y - properties.getMinHeight()] = ((CraftBlockData) delegate.getBlock(properties, x, y, z, biomeProvider)
.getHandle()).getState();
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import com.dfsek.terra.bukkit.BukkitAddon;
@@ -11,7 +11,7 @@ import com.dfsek.terra.bukkit.nms.Initializer;
public class NMSInitializer implements Initializer {
@Override
public void initialize(PlatformImpl platform) {
AwfulBukkitHacks.registerBiomes(platform.getRawConfigRegistry());
AwfulBukkitHacks.registerBiomes(platform);
Bukkit.getPluginManager().registerEvents(new NMSInjectListener(), platform.getPlugin());
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.server.level.ServerLevel;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.world.level.LevelHeightAccessor;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.core.Holder;
import net.minecraft.core.Holder.Reference;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3;
package com.dfsek.terra.bukkit.nms.v1_21_7;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.Registries;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -7,7 +7,7 @@ import net.minecraft.world.entity.EntityType;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
public class SpawnEntryTemplate implements ObjectTemplate<SpawnerData> {
public class SpawnEntryConfig implements ObjectTemplate<SpawnEntryConfig> {
@Value("type")
@Default
private EntityType<?> type = null;
@@ -24,8 +24,16 @@ public class SpawnEntryTemplate implements ObjectTemplate<SpawnerData> {
@Default
private Integer maxGroupSize = null;
public Integer getWeight() {
return weight;
}
public SpawnerData getSpawnerData() {
return new SpawnerData(type, minGroupSize, maxGroupSize);
}
@Override
public SpawnerData get() {
return new SpawnerData(type, weight, minGroupSize, maxGroupSize);
public SpawnEntryConfig get() {
return this;
}
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
@@ -6,7 +6,6 @@ import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.biome.MobSpawnSettings;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -33,8 +32,8 @@ public class SpawnSettingsTemplate implements ObjectTemplate<MobSpawnSettings> {
MobSpawnSettings.Builder builder = new MobSpawnSettings.Builder();
for(SpawnTypeConfig spawn : spawns) {
MobCategory group = spawn.getGroup();
for(SpawnerData entry : spawn.getEntries()) {
builder.addSpawn(group, entry);
for(SpawnEntryConfig entry : spawn.getEntries()) {
builder.addSpawn(group, entry.getWeight(), entry.getSpawnerData());
}
}
for(SpawnCostConfig cost : costs) {
@@ -1,11 +1,10 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import java.util.List;
import net.minecraft.world.entity.MobCategory;
import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData;
public class SpawnTypeConfig implements ObjectTemplate<SpawnTypeConfig> {
@@ -15,13 +14,13 @@ public class SpawnTypeConfig implements ObjectTemplate<SpawnTypeConfig> {
@Value("entries")
@Default
private List<SpawnerData> entries = null;
private List<SpawnEntryConfig> entries = null;
public MobCategory getGroup() {
return group;
}
public List<SpawnerData> getEntries() {
public List<SpawnEntryConfig> getEntries() {
return entries;
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
@@ -38,6 +38,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Default
private Integer foliageColor = null;
@Value("colors.dry-foliage")
@Default
private Integer dryFoliageColor = null;
@Value("colors.sky")
@Default
private Integer skyColor = null;
@@ -82,6 +86,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Default
private Music music = null;
@Value("sound.music-volume")
@Default
private Float musicVolume = null;
@Value("spawning")
@Default
private MobSpawnSettings spawnSettings = null;
@@ -98,6 +106,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
return foliageColor;
}
public Integer getDryFoliageColor() {
return dryFoliageColor;
}
public Integer getGrassColor() {
return grassColor;
}
@@ -154,6 +166,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
return music;
}
public Float getMusicVolume() {
return musicVolume;
}
public MobSpawnSettings getSpawnSettings() {
return spawnSettings;
}
@@ -1,4 +1,4 @@
package com.dfsek.terra.bukkit.nms.v1_21_3.config;
package com.dfsek.terra.bukkit.nms.v1_21_7.config;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
+3 -1
View File
@@ -26,7 +26,9 @@ dependencies {
modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}")
modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud)
modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud) {
exclude("me.lucko", "fabric-permissions-api")
}
include("org.incendo", "cloud-fabric", Versions.Fabric.cloud)
modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI)
@@ -11,7 +11,8 @@
"solonovamax",
"Sancires",
"Aureus",
"RogueShade"
"RogueShade",
"OakLoaf"
],
"contact": {
"homepage": "@WIKI@",
@@ -34,7 +35,7 @@
"depends": {
"fabricloader": ">=0.16.10",
"java": ">=21",
"minecraft": ">=1.21.4",
"minecraft": "1.21.7",
"fabric": "*"
}
}
@@ -52,7 +52,7 @@ public final class MinestomPlatform extends AbstractPlatform {
if(world.generator() instanceof MinestomChunkGeneratorWrapper wrapper) {
getConfigRegistry().get(wrapper.getPack().getRegistryKey()).ifPresent(pack -> {
wrapper.setPack(pack);
LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUniqueId());
LOGGER.info("Replaced pack in chunk generator for instance {}", world.getUuid());
});
}
});
@@ -7,9 +7,9 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader;
import com.dfsek.terra.api.world.biome.PlatformBiome;
import net.kyori.adventure.key.Key;
import net.minestom.server.MinecraftServer;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.world.biome.Biome;
import org.jetbrains.annotations.NotNull;
@@ -23,7 +23,7 @@ public class MinestomBiomeLoader implements TypeLoader<PlatformBiome> {
public PlatformBiome load(@NotNull AnnotatedType annotatedType, @NotNull Object o, @NotNull ConfigLoader configLoader,
DepthTracker depthTracker) throws LoadException {
String id = (String) o;
NamespaceID biomeID = NamespaceID.from(id);
Key biomeID = Key.key(id);
Biome biome = biomeRegistry.get(biomeID);
if(biome == null) throw new LoadException("Biome %s does not exist in registry".formatted(id), depthTracker);
return new MinestomBiome(biome);
@@ -4,11 +4,17 @@ import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.minestom.api.BlockEntityFactory;
import net.minestom.server.coordinate.BlockVec;
import net.minestom.server.instance.Instance;
public class DefaultBlockEntityFactory implements BlockEntityFactory {
private final Instance instance;
public DefaultBlockEntityFactory(Instance instance) {
this.instance = instance;
}
@Override
public BlockEntity createBlockEntity(BlockVec position) {
return null;
return new MinestomBlockEntity(instance, position);
}
}
@@ -0,0 +1,57 @@
package com.dfsek.terra.minestom.block;
import com.dfsek.terra.api.util.vector.Vector3;
import net.minestom.server.coordinate.BlockVec;
import net.minestom.server.instance.Instance;
import net.minestom.server.instance.block.Block;
import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.state.BlockState;
public class MinestomBlockEntity implements BlockEntity {
private final Instance instance;
private final BlockVec position;
private final Vector3 positionVec;
public MinestomBlockEntity(Instance instance, BlockVec position) {
this.instance = instance;
this.position = position;
this.positionVec = Vector3.of(position.blockX(), position.blockY(), position.blockZ());
}
@Override
public boolean update(boolean applyPhysics) {
return false;
}
@Override
public Vector3 getPosition() {
return positionVec;
}
@Override
public int getX() {
return position.blockX();
}
@Override
public int getY() {
return position.blockY();
}
@Override
public int getZ() {
return position.blockZ();
}
@Override
public BlockState getBlockState() {
return new MinestomBlockState(instance.getBlock(position));
}
@Override
public Block getHandle() {
return instance.getBlock(position);
}
}
@@ -1,15 +1,14 @@
package com.dfsek.terra.minestom.block;
import net.minestom.server.instance.block.Block;
import java.util.Objects;
import java.util.stream.Collectors;
import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.block.state.properties.Property;
import net.minestom.server.instance.block.Block;
import java.util.HashMap;
import java.util.Objects;
import java.util.stream.Collectors;
public class MinestomBlockState implements BlockState {
private final Block block;
@@ -23,24 +22,10 @@ public class MinestomBlockState implements BlockState {
}
public MinestomBlockState(String data) {
if(!data.contains("[")) {
block = Block.fromNamespaceId(data);
return;
block = Block.fromState(data);
if (block == null) {
throw new IllegalArgumentException("Invalid block state: " + data);
}
String[] split = data.split("\\[");
String namespaceId = split[0];
String properties = split[1].substring(0, split[1].length() - 1);
Block block = Block.fromNamespaceId(namespaceId);
HashMap<String, String> propertiesMap = new HashMap<>();
for(String property : properties.split(",")) {
String[] kv = property.split("=");
propertiesMap.put(kv[0].strip(), kv[1].strip());
}
assert block != null;
this.block = block.withProperties(propertiesMap);
}
@Override
@@ -70,7 +55,7 @@ public class MinestomBlockState implements BlockState {
@Override
public String getAsString(boolean properties) {
String name = block.namespace().asString();
String name = block.key().asString();
if(!properties || block.properties().isEmpty()) {
return name;
}
@@ -8,7 +8,7 @@ public class MinestomEntityType implements com.dfsek.terra.api.entity.EntityType
private final EntityType delegate;
public MinestomEntityType(String id) {
delegate = EntityType.fromNamespaceId(id);
delegate = EntityType.fromKey(id);
}
@Override
@@ -5,47 +5,47 @@ import com.dfsek.terra.api.inventory.item.Enchantment;
import net.minestom.server.MinecraftServer;
import net.minestom.server.item.Material;
import net.minestom.server.utils.NamespaceID;
import java.util.Objects;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.RegistryKey;
public class MinestomEnchantment implements Enchantment {
private final net.minestom.server.item.enchant.Enchantment delegate;
private final String id;
private final net.minestom.server.item.enchant.Enchantment registryItem;
private final RegistryKey<net.minestom.server.item.enchant.Enchantment> id;
private static final DynamicRegistry<net.minestom.server.item.enchant.Enchantment> enchantmentRegistry =
MinecraftServer.getEnchantmentRegistry();
public MinestomEnchantment(net.minestom.server.item.enchant.Enchantment delegate) {
this.delegate = delegate;
id = Objects.requireNonNull(delegate.registry()).raw();
public MinestomEnchantment(RegistryKey<net.minestom.server.item.enchant.Enchantment> id) {
this.id = id;
this.registryItem = enchantmentRegistry.get(id);
}
public MinestomEnchantment(String id) {
this.delegate = MinecraftServer.getEnchantmentRegistry().get(NamespaceID.from(id));
this.id = id;
this(RegistryKey.unsafeOf(id));
}
@Override
public boolean canEnchantItem(ItemStack itemStack) {
return delegate.supportedItems().contains((Material) itemStack.getType().getHandle());
return registryItem.supportedItems().contains((Material) itemStack.getType().getHandle());
}
@Override
public boolean conflictsWith(Enchantment other) {
return delegate.exclusiveSet().contains(NamespaceID.from(((MinestomEnchantment) other).id));
return registryItem.exclusiveSet().contains(((MinestomEnchantment) other).id);
}
@Override
public String getID() {
return id;
return id.name();
}
@Override
public int getMaxLevel() {
return delegate.maxLevel();
return registryItem.maxLevel();
}
@Override
public net.minestom.server.item.enchant.Enchantment getHandle() {
return delegate;
return registryItem;
}
}
@@ -23,6 +23,6 @@ public class MinestomItemHandle implements ItemHandle {
@Override
public Set<Enchantment> getEnchantments() {
return MinecraftServer.getEnchantmentRegistry().values().stream().map(MinestomEnchantment::new).collect(Collectors.toSet());
return MinecraftServer.getEnchantmentRegistry().keys().stream().map(MinestomEnchantment::new).collect(Collectors.toSet());
}
}
@@ -6,11 +6,11 @@ import com.dfsek.terra.api.inventory.item.Enchantment;
import com.dfsek.terra.api.inventory.item.ItemMeta;
import net.minestom.server.MinecraftServer;
import net.minestom.server.item.ItemComponent;
import net.minestom.server.component.DataComponents;
import net.minestom.server.item.ItemStack;
import net.minestom.server.item.component.EnchantmentList;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.DynamicRegistry.Key;
import net.minestom.server.registry.RegistryKey;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
@@ -47,11 +47,10 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac
@Override
public ItemMeta getItemMeta() {
HashMap<Enchantment, Integer> enchantments = new HashMap<>();
EnchantmentList enchantmentList = base.get(ItemComponent.ENCHANTMENTS);
EnchantmentList enchantmentList = base.get(DataComponents.ENCHANTMENTS);
if(enchantmentList != null) {
enchantmentList.enchantments().forEach((enchantmentKey, integer) -> {
enchantments.put(
new MinestomEnchantment(Objects.requireNonNull(MinecraftServer.getEnchantmentRegistry().get(enchantmentKey))), integer);
enchantments.put(new MinestomEnchantment(enchantmentKey), integer);
});
}
return new MinestomItemMeta(enchantments);
@@ -59,7 +58,7 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac
@Override
public void setItemMeta(ItemMeta meta) {
HashMap<Key<net.minestom.server.item.enchant.Enchantment>, Integer> enchantments = new HashMap<>();
HashMap<RegistryKey<net.minestom.server.item.enchant.Enchantment>, Integer> enchantments = new HashMap<>();
DynamicRegistry<net.minestom.server.item.enchant.Enchantment> registry = MinecraftServer.getEnchantmentRegistry();
meta.getEnchantments().forEach((key, value) -> {
MinestomEnchantment enchantment = (MinestomEnchantment) key;
@@ -67,6 +66,6 @@ public class MinestomItemStack implements com.dfsek.terra.api.inventory.ItemStac
});
EnchantmentList list = new EnchantmentList(enchantments);
base = base.with(ItemComponent.ENCHANTMENTS, list);
base = base.with(DataComponents.ENCHANTMENTS, list);
}
}
@@ -14,7 +14,7 @@ public class MinestomMaterial implements Item {
}
public MinestomMaterial(String id) {
this.delegate = Material.fromNamespaceId(id);
this.delegate = Material.fromKey(id);
}
@Override
@@ -22,9 +22,12 @@ public class TerraMinestomWorldBuilder {
private ConfigPack pack;
private long seed = new Random().nextLong();
private EntityFactory entityFactory = new DefaultEntityFactory();
private BlockEntityFactory blockEntityFactory = new DefaultBlockEntityFactory();
private BlockEntityFactory blockEntityFactory;
private TerraMinestomWorldBuilder(Instance instance) { this.instance = instance; }
private TerraMinestomWorldBuilder(Instance instance) {
this.instance = instance;
this.blockEntityFactory = new DefaultBlockEntityFactory(instance);
}
public static TerraMinestomWorldBuilder from(Instance instance) {
return new TerraMinestomWorldBuilder(instance);
@@ -44,7 +44,7 @@ import com.dfsek.terra.mod.config.MusicSoundTemplate;
import com.dfsek.terra.mod.config.ProtoPlatformBiome;
import com.dfsek.terra.mod.config.SoundEventTemplate;
import com.dfsek.terra.mod.config.SpawnCostConfig;
import com.dfsek.terra.mod.config.SpawnEntryTemplate;
import com.dfsek.terra.mod.config.SpawnEntryConfig;
import com.dfsek.terra.mod.config.SpawnSettingsTemplate;
import com.dfsek.terra.mod.config.SpawnTypeConfig;
import com.dfsek.terra.mod.config.VillagerTypeTemplate;
@@ -90,7 +90,7 @@ public abstract class ModPlatform extends AbstractPlatform {
.registerLoader(MusicSound.class, MusicSoundTemplate::new)
.registerLoader(EntityType.class, EntityTypeTemplate::new)
.registerLoader(SpawnCostConfig.class, SpawnCostConfig::new)
.registerLoader(SpawnEntry.class, SpawnEntryTemplate::new)
.registerLoader(SpawnEntry.class, SpawnEntryConfig::new)
.registerLoader(SpawnTypeConfig.class, SpawnTypeConfig::new)
.registerLoader(SpawnSettings.class, SpawnSettingsTemplate::new)
.registerLoader(VillagerType.class, VillagerTypeTemplate::new);
@@ -7,7 +7,7 @@ import net.minecraft.entity.EntityType;
import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
public class SpawnEntryTemplate implements ObjectTemplate<SpawnEntry> {
public class SpawnEntryConfig implements ObjectTemplate<SpawnEntry> {
@Value("type")
@Default
private EntityType<?> type = null;
@@ -24,8 +24,12 @@ public class SpawnEntryTemplate implements ObjectTemplate<SpawnEntry> {
@Default
private Integer maxGroupSize = null;
public Integer getWeight() {
return weight;
}
@Override
public SpawnEntry get() {
return new SpawnEntry(type, weight, minGroupSize, maxGroupSize);
return new SpawnEntry(type, minGroupSize, maxGroupSize);
}
}
@@ -5,7 +5,6 @@ import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.world.biome.SpawnSettings;
import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
import java.util.List;
@@ -28,8 +27,8 @@ public class SpawnSettingsTemplate implements ObjectTemplate<SpawnSettings> {
SpawnSettings.Builder builder = new SpawnSettings.Builder();
for(SpawnTypeConfig spawn : spawns) {
SpawnGroup group = spawn.getGroup();
for(SpawnEntry entry : spawn.getEntry()) {
builder.spawn(group, entry);
for(SpawnEntryConfig entry : spawn.getEntry()) {
builder.spawn(group, entry.getWeight(), entry.get());
}
}
for(SpawnCostConfig cost : costs) {
@@ -4,7 +4,6 @@ import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.entity.SpawnGroup;
import net.minecraft.world.biome.SpawnSettings.SpawnEntry;
import java.util.List;
@@ -16,13 +15,13 @@ public class SpawnTypeConfig implements ObjectTemplate<SpawnTypeConfig> {
@Value("entries")
@Default
private List<SpawnEntry> entry = null;
private List<SpawnEntryConfig> entry = null;
public SpawnGroup getGroup() {
return group;
}
public List<SpawnEntry> getEntry() {
public List<SpawnEntryConfig> getEntry() {
return entry;
}
@@ -3,6 +3,7 @@ package com.dfsek.terra.mod.config;
import com.dfsek.tectonic.api.config.template.ConfigTemplate;
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import net.minecraft.registry.RegistryKey;
import net.minecraft.sound.BiomeAdditionsSound;
import net.minecraft.sound.BiomeMoodSound;
import net.minecraft.sound.MusicSound;
@@ -37,6 +38,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Default
private Integer foliageColor = null;
@Value("colors.dry-foliage")
@Default
private Integer dryFoliageColor = null;
@Value("colors.sky")
@Default
private Integer skyColor = null;
@@ -81,13 +86,18 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Default
private MusicSound music = null;
@Value("sound.music-volume")
@Default
private Float musicVolume = null;
@Value("spawning")
@Default
private SpawnSettings spawnSettings = null;
@Value("villager-type")
@Default
private VillagerType villagerType = null;
private
RegistryKey<VillagerType> villagerType = null;
public Integer getGrassColor() {
return grassColor;
@@ -109,6 +119,10 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
return foliageColor;
}
public Integer getDryFoliageColor() {
return dryFoliageColor;
}
public Integer getSkyColor() {
return skyColor;
}
@@ -153,11 +167,15 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
return music;
}
public Float getMusicVolume() {
return musicVolume;
}
public SpawnSettings getSpawnSettings() {
return spawnSettings;
}
public VillagerType getVillagerType() {
public RegistryKey<VillagerType> getVillagerType() {
return villagerType;
}
}
@@ -4,17 +4,19 @@ import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryKey;
import net.minecraft.registry.RegistryKeys;
import net.minecraft.util.Identifier;
import net.minecraft.village.VillagerType;
public class VillagerTypeTemplate implements ObjectTemplate<VillagerType> {
public class VillagerTypeTemplate implements ObjectTemplate<RegistryKey<VillagerType>> {
@Value("id")
@Default
private Identifier id = null;
private String id = null;
@Override
public VillagerType get() {
return Registries.VILLAGER_TYPE.getEntry(id).orElseThrow().value();
public RegistryKey<VillagerType> get() {
return RegistryKey.of(RegistryKeys.VILLAGER_TYPE, Identifier.ofVanilla(id));
}
}
@@ -140,10 +140,10 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun
if(noise > threshold) {
chunk.setBlockState(new BlockPos(x, y, z), (BlockState) delegate
.getPalette(x + xi, y, z + zi, world, biomeProvider)
.get(depth, x + xi, y, z + zi, world.getSeed()), false);
.get(depth, x + xi, y, z + zi, world.getSeed()), 0);
depth++;
} else if(noise < airThreshold) {
chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), false);
chunk.setBlockState(new BlockPos(x, y, z), Blocks.AIR.getDefaultState(), 0);
} else {
depth = 0;
}
@@ -12,7 +12,7 @@ import java.util.Map;
@Mixin(VillagerType.class)
public interface VillagerTypeAccessor {
@Accessor("BIOME_TO_TYPE")
static Map<RegistryKey<Biome>, VillagerType> getBiomeTypeToIdMap() {
static Map<RegistryKey<Biome>, RegistryKey<VillagerType>> getBiomeTypeToIdMap() {
throw new AssertionError("Untransformed Accessor!");
}
}
@@ -1,28 +0,0 @@
package com.dfsek.terra.mod.mixin.fix;
import net.minecraft.entity.passive.BeeEntity.MoveToFlowerGoal;
import net.minecraft.entity.passive.BeeEntity.MoveToHiveGoal;
import net.minecraft.util.math.random.CheckedRandom;
import net.minecraft.util.math.random.Random;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import com.dfsek.terra.mod.CommonPlatform;
/**
* Bees spawning uses world.random without synchronization. This causes issues when spawning bees during world generation.
*/
@Mixin({
MoveToHiveGoal.class,
MoveToFlowerGoal.class
})
public class BeeMoveGoalsUnsynchronizedRandomAccessFix {
@Redirect(method = "<init>",
at = @At(value = "FIELD", target = "Lnet/minecraft/world/World;random:Lnet/minecraft/util/math/random/Random;"))
public Random redirectRandomAccess(World instance) {
return new CheckedRandom(CommonPlatform.get().getServer().getTicks()); // replace with new random seeded by tick time.
}
}
@@ -55,7 +55,7 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity {
public EntityType terra$getSpawnedType() {
return (EntityType) Registries.ENTITY_TYPE.getEntry(
Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))).orElseThrow();
Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id").orElseThrow())).orElseThrow();
}
public void terra$setSpawnedType(@NotNull EntityType creatureType) {
@@ -47,11 +47,11 @@ public abstract class WorldChunkMixin {
@Shadow
@Nullable
public abstract net.minecraft.block.BlockState setBlockState(BlockPos pos, net.minecraft.block.BlockState state, boolean moved);
public abstract net.minecraft.block.BlockState setBlockState(BlockPos pos, net.minecraft.block.BlockState state, int flags);
public void terra$setBlock(int x, int y, int z, BlockState data, boolean physics) {
BlockPos blockPos = new BlockPos(x, y, z);
setBlockState(blockPos, (net.minecraft.block.BlockState) data, false);
setBlockState(blockPos, (net.minecraft.block.BlockState) data, 0);
if(physics) {
net.minecraft.block.BlockState state = ((net.minecraft.block.BlockState) data);
if(state.isLiquid()) {
@@ -65,7 +65,7 @@ public abstract class WorldChunkMixin {
public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) {
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), (net.minecraft.block.BlockState) blockState,
false);
0);
}
@Intrinsic
@@ -40,7 +40,7 @@ public abstract class ProtoChunkMixin {
public void terra$setBlock(int x, int y, int z, @NotNull BlockState blockState) {
((net.minecraft.world.chunk.Chunk) (Object) this).setBlockState(new BlockPos(x, y, z), (net.minecraft.block.BlockState) blockState,
false);
0);
}
public @NotNull BlockState terra$getBlock(int x, int y, int z) {
@@ -35,9 +35,25 @@ public class BiomeUtil {
.skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
.grassColorModifier(
Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(), vanilla.getEffects().getGrassColorModifier()))
.grassColor(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColor(),
vanilla.getEffects().getGrassColor().orElseGet(() -> ((BiomeInvoker) ((Object) vanilla)).invokeGetDefaultGrassColor())))
.foliageColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFoliageColor(), vanilla.getFoliageColor()));
.musicVolume(Objects.requireNonNullElse(vanillaBiomeProperties.getMusicVolume(), vanilla.getMusicVolume()));
if(vanillaBiomeProperties.getGrassColor() == null) {
vanilla.getEffects().getGrassColor().ifPresent(effects::grassColor);
} else {
effects.grassColor(vanillaBiomeProperties.getGrassColor());
}
if(vanillaBiomeProperties.getFoliageColor() == null) {
vanilla.getEffects().getFoliageColor().ifPresent(effects::foliageColor);
} else {
effects.foliageColor(vanillaBiomeProperties.getFoliageColor());
}
if(vanillaBiomeProperties.getDryFoliageColor() == null) {
vanilla.getEffects().getDryFoliageColor().ifPresent(effects::dryFoliageColor);
} else {
effects.dryFoliageColor(vanillaBiomeProperties.getDryFoliageColor());
}
if(vanillaBiomeProperties.getParticleConfig() == null) {
vanilla.getEffects().getParticleConfig().ifPresent(effects::particleConfig);
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:snowy_taiga"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:old_growth_pine_taiga"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:old_growth_spruce_taiga"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:taiga"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"#minecraft:is_jungle"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:grove"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"#minecraft:is_savanna"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"#minecraft:is_badlands"
]
}
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"minecraft:forest"
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_ashen_angry",
"tame": "minecraft:entity/wolf/wolf_ashen_tame",
"wild": "minecraft:entity/wolf/wolf_ashen"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/ashen"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_black_angry",
"tame": "minecraft:entity/wolf/wolf_black_tame",
"wild": "minecraft:entity/wolf/wolf_black"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/black"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_chestnut_angry",
"tame": "minecraft:entity/wolf/wolf_chestnut_tame",
"wild": "minecraft:entity/wolf/wolf_chestnut"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/chestnut"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_angry",
"tame": "minecraft:entity/wolf/wolf_tame",
"wild": "minecraft:entity/wolf/wolf"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/pale"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_rusty_angry",
"tame": "minecraft:entity/wolf/wolf_rusty_tame",
"wild": "minecraft:entity/wolf/wolf_rusty"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/rusty"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_snowy_angry",
"tame": "minecraft:entity/wolf/wolf_snowy_tame",
"wild": "minecraft:entity/wolf/wolf_snowy"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/snowy"
},
"priority": 1
}
]
}
@@ -0,0 +1,16 @@
{
"assets": {
"angry": "minecraft:entity/wolf/wolf_spotted_angry",
"tame": "minecraft:entity/wolf/wolf_spotted_tame",
"wild": "minecraft:entity/wolf/wolf_spotted"
},
"spawn_conditions": [
{
"condition": {
"type": "minecraft:biome",
"biomes": "#c:has_wolf_variant/spotted"
},
"priority": 1
}
]
}

Some files were not shown because too many files have changed in this diff Show More