From b0b2cce87f086560a914a86cf1d3ea094ca10e4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Mon, 17 Jan 2022 19:05:30 +0100 Subject: [PATCH 01/10] Update Gradle and Shadow plugin to support JDK 17 --- build.gradle | 15 +++++++-------- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 1fc95b088..0dc2d2848 100644 --- a/build.gradle +++ b/build.gradle @@ -2,11 +2,11 @@ import org.apache.tools.ant.filters.ReplaceTokens buildscript { repositories { - jcenter() + gradlePluginPortal() } dependencies { - classpath 'com.github.jengelman.gradle.plugins:shadow:5.1.0' + classpath 'gradle.plugin.com.github.johnrengelman:shadow:7.1.2' } } @@ -52,7 +52,7 @@ allprojects { } processResources { - from(sourceSets.main.resources.srcDirs) { + filesMatching("plugin.yml") { filter ReplaceTokens, tokens: [version: version] } } @@ -70,16 +70,15 @@ dependencies { shadow 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' shadow 'com.github.MilkBowl:VaultAPI:1.7' shadow 'net.wesjd:anvilgui:1.5.3-SNAPSHOT' - compile name: 'BiomeMapping-1.3' - compile "io.papermc:paperlib:1.0.5" + implementation name: 'BiomeMapping-1.3' + implementation "io.papermc:paperlib:1.0.5" shadow 'com.comphenix.protocol:ProtocolLib:4.4.0' - compile project('Support-WorldEdit-6') - compile project('Support-WorldEdit-7') + implementation project('Support-WorldEdit-6') + implementation project('Support-WorldEdit-7') } shadowJar { classifier = '' - configurations = [project.configurations.compile] relocate 'io.papermc.lib', 'com.gmail.val59000mc.paperlib' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 558870dad..2e6e5897b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists From 4ce8c4e0441a4ebed73a3edd660b2d15ebc6b547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Mon, 17 Jan 2022 19:22:43 +0100 Subject: [PATCH 02/10] Update dependencies and repos to fix broken build ProtocolLib 4.4.0 depends on a broken artifact (BukkitExecutors), which is now part of ProtocolLib itself as of version 4.6.0. See dmulloy2/ProtocolLib@7ac4ac6 AnvilGui needs to be shaded into the JAR. --- build.gradle | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 0dc2d2848..76b657d56 100644 --- a/build.gradle +++ b/build.gradle @@ -32,11 +32,11 @@ allprojects { } maven { // WorldEdit - url = 'http://maven.sk89q.com/repo/' + url = 'https://maven.enginehub.org/repo/' } maven { // ProtocolLib - url "http://repo.dmulloy2.net/nexus/repository/public/" + url "https://repo.dmulloy2.net/repository/public/" } // PaperLib maven { @@ -69,10 +69,10 @@ dependencies { //shadow 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT' shadow 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' shadow 'com.github.MilkBowl:VaultAPI:1.7' - shadow 'net.wesjd:anvilgui:1.5.3-SNAPSHOT' + implementation 'net.wesjd:anvilgui:1.5.3-SNAPSHOT' implementation name: 'BiomeMapping-1.3' implementation "io.papermc:paperlib:1.0.5" - shadow 'com.comphenix.protocol:ProtocolLib:4.4.0' + shadow 'com.comphenix.protocol:ProtocolLib:4.7.0' implementation project('Support-WorldEdit-6') implementation project('Support-WorldEdit-7') } @@ -80,6 +80,7 @@ dependencies { shadowJar { classifier = '' relocate 'io.papermc.lib', 'com.gmail.val59000mc.paperlib' + relocate 'net.wesjd.anvilgui', 'com.gmail.val59000mc.anvilgui' } build.dependsOn(shadowJar) \ No newline at end of file From 9a7237e951e651e67f2cc1f6ec70aa5ecaa7c628 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Mon, 17 Jan 2022 19:15:21 +0100 Subject: [PATCH 03/10] Fix version string being interpreted as a number --- src/main/resources/plugin.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ab4ebd920..c30b2ee58 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,6 +1,6 @@ name: UhcCore main: com.gmail.val59000mc.UhcCore -version: @version@ +version: "@version@" description: Automates UHC games on a dedicated server author: val59000mc, Mezy softdepend: [WorldEdit,Vault,ProtocolLib] From 78989c51a6b2f020b536749e7ffc95972fc1847f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Mon, 17 Jan 2022 19:15:36 +0100 Subject: [PATCH 04/10] Stop using NMS to change MOTD MinecraftServer#setMotd was obfuscated in Spigot for 1.18, and maintaining an NMS solution using VersionUtils seems like more trouble than it's worth when we can just use PingListener to change the MOTD. --- .../gmail/val59000mc/game/GameManager.java | 48 ------------------- .../com/gmail/val59000mc/utils/NMSUtils.java | 9 ---- 2 files changed, 57 deletions(-) diff --git a/src/main/java/com/gmail/val59000mc/game/GameManager.java b/src/main/java/com/gmail/val59000mc/game/GameManager.java index 9a0afd7da..8c2daec44 100644 --- a/src/main/java/com/gmail/val59000mc/game/GameManager.java +++ b/src/main/java/com/gmail/val59000mc/game/GameManager.java @@ -31,7 +31,6 @@ import java.io.File; import java.io.IOException; -import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -175,53 +174,6 @@ public void setGameState(GameState gameState){ // Call UhcGameStateChangedEvent Bukkit.getPluginManager().callEvent(new UhcGameStateChangedEvent(oldGameState, gameState)); - - // Update MOTD - switch(gameState){ - case ENDED: - setMotd(Lang.DISPLAY_MOTD_ENDED); - break; - case LOADING: - setMotd(Lang.DISPLAY_MOTD_LOADING); - break; - case DEATHMATCH: - setMotd(Lang.DISPLAY_MOTD_PLAYING); - break; - case PLAYING: - setMotd(Lang.DISPLAY_MOTD_PLAYING); - break; - case STARTING: - setMotd(Lang.DISPLAY_MOTD_STARTING); - break; - case WAITING: - setMotd(Lang.DISPLAY_MOTD_WAITING); - break; - default: - setMotd(Lang.DISPLAY_MOTD_ENDED); - break; - } - } - - private void setMotd(String motd){ - if (config.get(MainConfig.DISABLE_MOTD)){ - return; // No motd support - } - - if (motd == null){ - return; // Failed to load lang.yml so motd is null. - } - - try { - Class craftServerClass = NMSUtils.getNMSClass("CraftServer"); - Object craftServer = craftServerClass.cast(Bukkit.getServer()); - Object dedicatedPlayerList = NMSUtils.getHandle(craftServer); - Object dedicatedServer = NMSUtils.getServer(dedicatedPlayerList); - - Method setMotd = NMSUtils.getMethod(dedicatedServer.getClass(), "setMotd"); - setMotd.invoke(dedicatedServer, motd); - }catch (ReflectiveOperationException | NullPointerException ex){ - ex.printStackTrace(); - } } public void loadNewGame() { diff --git a/src/main/java/com/gmail/val59000mc/utils/NMSUtils.java b/src/main/java/com/gmail/val59000mc/utils/NMSUtils.java index 4224d7f7f..b65f9fcc8 100644 --- a/src/main/java/com/gmail/val59000mc/utils/NMSUtils.java +++ b/src/main/java/com/gmail/val59000mc/utils/NMSUtils.java @@ -34,15 +34,6 @@ public static Object getHandle(Object craftObject){ } } - @Nullable - public static Object getServer(Object o){ - try{ - return getMethod(o.getClass(), "getServer").invoke(o); - }catch (ReflectiveOperationException | IllegalArgumentException ex){ - return null; - } - } - public static Method getMethod(Class c, String name) throws ReflectiveOperationException{ return getMethod(c, name, -1); } From c443367012e328ae28fd3765e31340c268e4efb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Fri, 4 Mar 2022 20:29:07 +0100 Subject: [PATCH 05/10] Avoid usage of BiomeMapping in 1.18+ Replacing ocean biomes no longer works with the new terrain generation system, so it's better to log a warning. This also avoids a plugin crash in 1.18.2, for which there is no BiomeMapping release yet (and it's unclear if there will ever be one). --- .../gmail/val59000mc/maploader/MapLoader.java | 22 +--------------- .../gmail/val59000mc/utils/VersionUtils.java | 25 ++++++++++++++++++- .../val59000mc/utils/VersionUtils_1_18.java | 13 ++++++++++ 3 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java diff --git a/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java b/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java index 86bb06d2a..d9be123c0 100644 --- a/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java +++ b/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java @@ -11,8 +11,6 @@ import com.gmail.val59000mc.utils.FileUtils; import com.gmail.val59000mc.configuration.YamlFile; import com.gmail.val59000mc.utils.VersionUtils; -import com.pieterdebot.biomemapping.Biome; -import com.pieterdebot.biomemapping.BiomeMappingAPI; import io.papermc.lib.PaperLib; import org.apache.commons.lang.Validate; import org.bukkit.*; @@ -67,7 +65,7 @@ public double getBorderSize(){ public void loadWorlds(boolean debug) { if (config.get(MainConfig.REPLACE_OCEAN_BIOMES)){ - replaceOceanBiomes(); + VersionUtils.getVersionUtils().replaceOceanBiomes(); } deleteOldPlayersFiles(); @@ -352,24 +350,6 @@ private void deleteOldPlayersFiles() { } } } - - private void replaceOceanBiomes(){ - BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); - - Biome replacementBiome = Biome.PLAINS; - - for (Biome biome : Biome.values()){ - if (biome.isOcean() && biomeMapping.biomeSupported(biome)){ - try { - biomeMapping.replaceBiomes(biome, replacementBiome); - }catch (Exception ex){ - ex.printStackTrace(); - } - - replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; - } - } - } private void recursiveCopy(File fSource, File fDest) { try { diff --git a/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java b/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java index a8d15dc41..d7ded70b1 100644 --- a/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java +++ b/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java @@ -5,6 +5,9 @@ import com.gmail.val59000mc.players.UhcPlayer; import com.google.gson.JsonArray; import com.google.gson.JsonObject; +import com.pieterdebot.biomemapping.Biome; +import com.pieterdebot.biomemapping.BiomeMappingAPI; + import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.World; @@ -45,8 +48,10 @@ public static VersionUtils getVersionUtils(){ versionUtils = new VersionUtils_1_13(); }else if (version == 14){ versionUtils = new VersionUtils_1_14(); - }else { + }else if (version < 18){ versionUtils = new VersionUtils_1_15(); + }else { + versionUtils = new VersionUtils_1_18(); } } return versionUtils; @@ -123,4 +128,22 @@ public static VersionUtils getVersionUtils(){ public abstract void killPlayer(Player player); + public void replaceOceanBiomes() { + BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); + + Biome replacementBiome = Biome.PLAINS; + + for (Biome biome : Biome.values()) { + if (biome.isOcean() && biomeMapping.biomeSupported(biome)) { + try { + biomeMapping.replaceBiomes(biome, replacementBiome); + }catch (Exception ex) { + ex.printStackTrace(); + } + + replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; + } + } + } + } \ No newline at end of file diff --git a/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java b/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java new file mode 100644 index 000000000..f1b696e9e --- /dev/null +++ b/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java @@ -0,0 +1,13 @@ +package com.gmail.val59000mc.utils; + +import com.gmail.val59000mc.UhcCore; + +public class VersionUtils_1_18 extends VersionUtils_1_15 { + + @Override + public void replaceOceanBiomes() { + UhcCore.getPlugin().getLogger().warning( + "The 'replace-ocean-biomes' setting is currently not supported in Minecraft 1.18+"); + } + +} From 72c8fababe0e8f19b4120658ccc168a4bbab8540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Wed, 9 Mar 2022 22:44:38 +0100 Subject: [PATCH 06/10] Add VersionAdapter to support 'replace-ocean-biomes' on 1.18+ The benefit of VersionAdapter over VersionUtils is that each adapter implementation is built against its corresponding Paper/Spigot version, meaning it's easier to catch errors and less reflection has to be used. However, VersionUtils is tightly coupled with the rest of the codebase which makes it hard to migrate some methods without substantial refactoring. That'll be something to look at in the future. --- .gitignore | 5 +- adapters/1_18_R1/build.gradle | 20 ++++++ .../adapters/impl/v1_18_R1/RegistryUtils.java | 39 +++++++++++ .../impl/v1_18_R1/VersionAdapterImpl.java | 25 +++++++ adapters/1_18_R2/build.gradle | 20 ++++++ .../adapters/impl/v1_18_R2/RegistryUtils.java | 51 ++++++++++++++ .../impl/v1_18_R2/VersionAdapterImpl.java | 35 ++++++++++ adapters/build.gradle | 5 ++ .../val59000mc/adapters/VersionAdapter.java | 69 +++++++++++++++++++ .../impl/DefaultVersionAdapterImpl.java | 41 +++++++++++ build.gradle | 12 ++-- settings.gradle | 13 ++++ .../java/com/gmail/val59000mc/UhcCore.java | 17 +++++ .../gmail/val59000mc/maploader/MapLoader.java | 7 +- .../gmail/val59000mc/utils/VersionUtils.java | 25 +------ .../val59000mc/utils/VersionUtils_1_18.java | 13 ---- 16 files changed, 351 insertions(+), 46 deletions(-) create mode 100644 adapters/1_18_R1/build.gradle create mode 100644 adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java create mode 100644 adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java create mode 100644 adapters/1_18_R2/build.gradle create mode 100644 adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java create mode 100644 adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java create mode 100644 adapters/build.gradle create mode 100644 adapters/src/main/java/com/gmail/val59000mc/adapters/VersionAdapter.java create mode 100644 adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java delete mode 100644 src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java diff --git a/.gitignore b/.gitignore index 1864cd390..08f8fe221 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Directories # build/ -/bin/ +bin/ target/ # OS Files # @@ -70,8 +70,7 @@ todolist.txt .idea/* #Gradle -/.gradle/ -.gradle/* +.gradle/ !gradle-wrapper.jar # WorldEdit Builds diff --git a/adapters/1_18_R1/build.gradle b/adapters/1_18_R1/build.gradle new file mode 100644 index 000000000..3440e41b4 --- /dev/null +++ b/adapters/1_18_R1/build.gradle @@ -0,0 +1,20 @@ +plugins { + id "io.papermc.paperweight.userdev" version "1.3.5" +} + +dependencies { + api project(":adapters") + paperweightDevelopmentBundle "io.papermc.paper:dev-bundle:1.18.1-R0.1-SNAPSHOT" +} + +// Reobfuscate JAR with paperweight on build +tasks.assemble.dependsOn(tasks.reobfJar) + +// Minecraft 1.18 requires Java 17 +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +// The reobf configuration points to the wrong artifact location by default, +// this is a workaround to allow consuming the reobfuscated JAR. +configurations.reobf { + outgoing.artifact(tasks.jar.archiveFile) +} diff --git a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java new file mode 100644 index 000000000..3e47ac0bf --- /dev/null +++ b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java @@ -0,0 +1,39 @@ +package com.gmail.val59000mc.adapters.impl.v1_18_R1; + +import java.util.function.Consumer; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R1.CraftServer; + +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.WritableRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.dedicated.DedicatedServer; + +/** + * Utility class for dealing with the NMS registry. + */ +public abstract class RegistryUtils { + + private static final RegistryAccess registryAccess = getRegistryAccess(); + + private static RegistryAccess getRegistryAccess() { + final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); + return server.registryAccess(); + } + + /** + * Obtains write access to a given registry and runs an operation on it. + * + * @param the type of registry + * @param registryKey the key for the registry + * @param writeOperation the operation to run with write access + */ + public static void obtainWriteAccess(ResourceKey> registryKey, Consumer> writeOperation) { + final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); + writeOperation.accept(registry); + } + +} diff --git a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java new file mode 100644 index 000000000..04a4c2c6f --- /dev/null +++ b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java @@ -0,0 +1,25 @@ +package com.gmail.val59000mc.adapters.impl.v1_18_R1; + +import java.util.OptionalInt; + +import com.gmail.val59000mc.adapters.VersionAdapter; +import com.mojang.serialization.Lifecycle; + +import net.minecraft.core.Registry; +import net.minecraft.world.level.levelgen.Noises; +import net.minecraft.world.level.levelgen.synth.NormalNoise.NoiseParameters; + +public class VersionAdapterImpl extends VersionAdapter { + + @Override + public void removeOceans() { + // Setting the continentalness noise to a constant 0 will stop ocean generation. + // It may also reduce the quality of the terrain generation, but without + // noise routers (introduced in 1.18.2), this seems like the best solution. + final NoiseParameters continentalnessWithoutOceans = new NoiseParameters(0, 0); + RegistryUtils.obtainWriteAccess(Registry.NOISE_REGISTRY, noiseRegistry -> { + noiseRegistry.registerOrOverride(OptionalInt.empty(), Noises.CONTINENTALNESS, continentalnessWithoutOceans, Lifecycle.stable()); + }); + } + +} diff --git a/adapters/1_18_R2/build.gradle b/adapters/1_18_R2/build.gradle new file mode 100644 index 000000000..240a36e9c --- /dev/null +++ b/adapters/1_18_R2/build.gradle @@ -0,0 +1,20 @@ +plugins { + id "io.papermc.paperweight.userdev" version "1.3.5" +} + +dependencies { + api project(":adapters") + paperweightDevelopmentBundle "io.papermc.paper:dev-bundle:1.18.2-R0.1-SNAPSHOT" +} + +// Reobfuscate JAR with paperweight on build +tasks.assemble.dependsOn(tasks.reobfJar) + +// Minecraft 1.18 requires Java 17 +java.toolchain.languageVersion = JavaLanguageVersion.of(17) + +// The reobf configuration points to the wrong artifact location by default, +// this is a workaround to allow consuming the reobfuscated JAR. +configurations.reobf { + outgoing.artifact(tasks.jar.archiveFile) +} diff --git a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java new file mode 100644 index 000000000..f2b36236a --- /dev/null +++ b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java @@ -0,0 +1,51 @@ +package com.gmail.val59000mc.adapters.impl.v1_18_R2; + +import java.lang.reflect.Field; +import java.util.function.Consumer; + +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.v1_18_R2.CraftServer; + +import net.minecraft.core.MappedRegistry; +import net.minecraft.core.Registry; +import net.minecraft.core.RegistryAccess; +import net.minecraft.core.WritableRegistry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.dedicated.DedicatedServer; + +/** + * Utility class for dealing with the NMS registry. + */ +public abstract class RegistryUtils { + + private static final RegistryAccess registryAccess = getRegistryAccess(); + + private static RegistryAccess getRegistryAccess() { + final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); + return server.registryAccess(); + } + + /** + * Obtains write access to a given registry and runs an operation on it. + * + * @param the type of registry + * @param registryKey the key for the registry + * @param writeOperation the operation to run with write access + */ + public static void obtainWriteAccess(ResourceKey> registryKey, Consumer> writeOperation) { + final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); + try { + // Starting from 1.18.2, registries are frozen after initialization, + // which happens before any plugins are loaded. This is a workaround + // to allow writing to the registry by temporarily unfreezing it again. + final Field frozen = MappedRegistry.class.getDeclaredField("bL"); + frozen.setAccessible(true); + frozen.set(registry, false); + writeOperation.accept(registry); + frozen.set(registry, true); + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException("Unable to get registry write access", e); + } + } + +} diff --git a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java new file mode 100644 index 000000000..91768313a --- /dev/null +++ b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java @@ -0,0 +1,35 @@ +package com.gmail.val59000mc.adapters.impl.v1_18_R2; + +import java.util.OptionalInt; + +import com.gmail.val59000mc.adapters.VersionAdapter; +import com.mojang.serialization.Lifecycle; + +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.levelgen.DensityFunction; +import net.minecraft.world.level.levelgen.DensityFunctions; +import net.minecraft.world.level.levelgen.DensityFunctions.MarkerOrMarked; +import net.minecraft.world.level.levelgen.NoiseRouterData; + +public class VersionAdapterImpl extends VersionAdapter { + + /** + * See {@link NoiseRouterData#CONTINENTS}. + */ + private final ResourceKey continentsKey = ResourceKey.create(Registry.DENSITY_FUNCTION_REGISTRY, new ResourceLocation("overworld/continents")); + + @Override + public void removeOceans() { + RegistryUtils.obtainWriteAccess(Registry.DENSITY_FUNCTION_REGISTRY, dfRegistry -> { + // The continents noise function is wrapped in a flatCache, see NoiseRouterData#bootstrap(). + final MarkerOrMarked continents = (MarkerOrMarked) dfRegistry.getOrThrow(continentsKey); + // We keep the flatCache for performance, but take the absolute value of the noise function. + // This stops ocean generation, but keeps the qualities of the original noise. + final DensityFunction continentsWithoutOceans = DensityFunctions.flatCache(continents.wrapped().abs()); + dfRegistry.registerOrOverride(OptionalInt.empty(), continentsKey, continentsWithoutOceans, Lifecycle.stable()); + }); + } + +} diff --git a/adapters/build.gradle b/adapters/build.gradle new file mode 100644 index 000000000..563e1af35 --- /dev/null +++ b/adapters/build.gradle @@ -0,0 +1,5 @@ +dependencies { + implementation "io.papermc:paperlib:1.0.7" + implementation ":BiomeMapping-1.3" + compileOnly "org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT" +} diff --git a/adapters/src/main/java/com/gmail/val59000mc/adapters/VersionAdapter.java b/adapters/src/main/java/com/gmail/val59000mc/adapters/VersionAdapter.java new file mode 100644 index 000000000..869cc7716 --- /dev/null +++ b/adapters/src/main/java/com/gmail/val59000mc/adapters/VersionAdapter.java @@ -0,0 +1,69 @@ +package com.gmail.val59000mc.adapters; + +import com.gmail.val59000mc.adapters.impl.DefaultVersionAdapterImpl; + +import org.bukkit.Bukkit; + +/** + * Utility class exposing an abstraction layer for functionality where a + * custom implementation needs to be used depending on the runtime server version. + */ +public abstract class VersionAdapter { + + /** + * Loads and instantiates a {@link VersionAdapter} for the running server version. + * + * @return the adapter instance + * @throws InstantiationException if the adapter couldn't be instantiated + */ + public static VersionAdapter instantiate() throws InstantiationException { + try { + final Class loadedClass = loadAdapterImplClass(); + return loadedClass.getConstructor().newInstance(); + } catch (ClassNotFoundException ignored) { + return new DefaultVersionAdapterImpl(); + } catch (Exception e) { + throw new InstantiationException(e); + } + } + + public static class InstantiationException extends Exception { + public InstantiationException(Throwable cause) { + super("Unable to instantiate version adapter", cause); + } + } + + /** + * Gets the NMS package name of the running server, such as {@code v1_18_R2}. + * + * @return the NMS package name + */ + private static String getNmsPackageName() { + final String nmsPackageName = Bukkit.getServer().getClass().getPackage().getName(); + return nmsPackageName.substring(nmsPackageName.lastIndexOf('.') + 1); + } + + /** + * Loads and returns the adapter implementation class for the running server version. + * + * @return the adapter implementation class + * @throws ClassNotFoundException if the class cannot be loaded + */ + @SuppressWarnings("unchecked") + private static Class loadAdapterImplClass() throws ClassNotFoundException { + final String implPackageName = DefaultVersionAdapterImpl.class.getPackage().getName(); + final String nmsImplPackageName = implPackageName + '.' + getNmsPackageName(); + final String implClassName = VersionAdapter.class.getSimpleName() + "Impl"; + return (Class) Class.forName(nmsImplPackageName + '.' + implClassName); + } + + /** + * Removes oceans from the world generation. + *

+ * This method should be called before the world is generated. + * + * @throws UnsupportedOperationException if not supported by this adapter + */ + public abstract void removeOceans(); + +} diff --git a/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java b/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java new file mode 100644 index 000000000..f0154fa3a --- /dev/null +++ b/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java @@ -0,0 +1,41 @@ +package com.gmail.val59000mc.adapters.impl; + +import com.gmail.val59000mc.adapters.VersionAdapter; +import com.pieterdebot.biomemapping.Biome; +import com.pieterdebot.biomemapping.BiomeMappingAPI; + +import io.papermc.lib.PaperLib; + +/** + * A default {@link VersionAdapter} implementation, used as a fallback. + */ +public class DefaultVersionAdapterImpl extends VersionAdapter { + + @Override + public void removeOceans() { + final int version = PaperLib.getMinecraftVersion(); + if (8 <= version && version <= 17) { + removeOceansUsingBiomeMapping(); + } else { + throw new UnsupportedOperationException(); + } + } + + private void removeOceansUsingBiomeMapping() { + final BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); + Biome replacementBiome = Biome.PLAINS; + + for (Biome biome : Biome.values()) { + if (biome.isOcean() && biomeMapping.biomeSupported(biome)) { + try { + biomeMapping.replaceBiomes(biome, replacementBiome); + } catch (Exception ex) { + ex.printStackTrace(); + } + + replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; + } + } + } + +} diff --git a/build.gradle b/build.gradle index 76b657d56..4752d32e7 100644 --- a/build.gradle +++ b/build.gradle @@ -11,14 +11,14 @@ buildscript { } allprojects { - apply plugin: 'java' + apply plugin: 'java-library' apply plugin: 'com.github.johnrengelman.shadow' group = pluginGroup version = pluginVersion - sourceCompatibility = 1.8 - targetCompatibility = 1.8 + // Target Java 8 by default for legacy support + java.toolchain.languageVersion = JavaLanguageVersion.of(8) repositories { mavenCentral() @@ -47,7 +47,7 @@ allprojects { url 'https://repo.codemc.io/repository/maven-snapshots/' } flatDir { - dirs 'libs' + dirs "$rootDir/libs" } } @@ -70,11 +70,13 @@ dependencies { shadow 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' shadow 'com.github.MilkBowl:VaultAPI:1.7' implementation 'net.wesjd:anvilgui:1.5.3-SNAPSHOT' - implementation name: 'BiomeMapping-1.3' implementation "io.papermc:paperlib:1.0.5" shadow 'com.comphenix.protocol:ProtocolLib:4.7.0' implementation project('Support-WorldEdit-6') implementation project('Support-WorldEdit-7') + implementation project(":adapters") + runtimeOnly project(path: ":adapters:1_18_R1", configuration: "reobf") + runtimeOnly project(path: ":adapters:1_18_R2", configuration: "reobf") } shadowJar { diff --git a/settings.gradle b/settings.gradle index ed7a5fc36..35bebac3b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,17 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + name "PaperMC" + url "https://papermc.io/repo/repository/maven-public/" + } + } +} + rootProject.name = 'UhcCore' include 'Support-WorldEdit-6' include 'Support-WorldEdit-7' +include ":adapters" +include ":adapters:1_18_R1" +include ":adapters:1_18_R2" diff --git a/src/main/java/com/gmail/val59000mc/UhcCore.java b/src/main/java/com/gmail/val59000mc/UhcCore.java index e7287dd53..a6d401978 100644 --- a/src/main/java/com/gmail/val59000mc/UhcCore.java +++ b/src/main/java/com/gmail/val59000mc/UhcCore.java @@ -1,7 +1,11 @@ package com.gmail.val59000mc; +import java.util.logging.Level; + +import com.gmail.val59000mc.adapters.VersionAdapter; import com.gmail.val59000mc.game.GameManager; import com.gmail.val59000mc.utils.FileUtils; + import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; @@ -11,6 +15,7 @@ public class UhcCore extends JavaPlugin{ private static final int MAX_VERSION = 19; private static UhcCore pl; + private static VersionAdapter versionAdapter; private static int version; private GameManager gameManager; private Updater updater; @@ -21,6 +26,14 @@ public void onEnable(){ loadServerVersion(); + try { + versionAdapter = VersionAdapter.instantiate(); + getLogger().info("Successfully loaded version adapter: " + versionAdapter.getClass().getName()); + } catch (VersionAdapter.InstantiationException e) { + getLogger().log(Level.SEVERE, "Unable to start plugin", e); + return; + } + gameManager = new GameManager(); Bukkit.getScheduler().runTaskLater(this, () -> gameManager.loadNewGame(), 1); @@ -57,6 +70,10 @@ public static UhcCore getPlugin(){ return pl; } + public static VersionAdapter getVersionAdapter() { + return versionAdapter; + } + @Override public void onDisable(){ gameManager.getScenarioManager().disableAllScenarios(); diff --git a/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java b/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java index d9be123c0..2ee2f9196 100644 --- a/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java +++ b/src/main/java/com/gmail/val59000mc/maploader/MapLoader.java @@ -65,7 +65,12 @@ public double getBorderSize(){ public void loadWorlds(boolean debug) { if (config.get(MainConfig.REPLACE_OCEAN_BIOMES)){ - VersionUtils.getVersionUtils().replaceOceanBiomes(); + try { + UhcCore.getVersionAdapter().removeOceans(); + } catch (UnsupportedOperationException ignored) { + UhcCore.getPlugin().getLogger().warning( + "The 'replace-ocean-biomes' setting is not supported on this Minecraft version"); + } } deleteOldPlayersFiles(); diff --git a/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java b/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java index d7ded70b1..a8d15dc41 100644 --- a/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java +++ b/src/main/java/com/gmail/val59000mc/utils/VersionUtils.java @@ -5,9 +5,6 @@ import com.gmail.val59000mc.players.UhcPlayer; import com.google.gson.JsonArray; import com.google.gson.JsonObject; -import com.pieterdebot.biomemapping.Biome; -import com.pieterdebot.biomemapping.BiomeMappingAPI; - import org.bukkit.Color; import org.bukkit.Material; import org.bukkit.World; @@ -48,10 +45,8 @@ public static VersionUtils getVersionUtils(){ versionUtils = new VersionUtils_1_13(); }else if (version == 14){ versionUtils = new VersionUtils_1_14(); - }else if (version < 18){ - versionUtils = new VersionUtils_1_15(); }else { - versionUtils = new VersionUtils_1_18(); + versionUtils = new VersionUtils_1_15(); } } return versionUtils; @@ -128,22 +123,4 @@ public static VersionUtils getVersionUtils(){ public abstract void killPlayer(Player player); - public void replaceOceanBiomes() { - BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); - - Biome replacementBiome = Biome.PLAINS; - - for (Biome biome : Biome.values()) { - if (biome.isOcean() && biomeMapping.biomeSupported(biome)) { - try { - biomeMapping.replaceBiomes(biome, replacementBiome); - }catch (Exception ex) { - ex.printStackTrace(); - } - - replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; - } - } - } - } \ No newline at end of file diff --git a/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java b/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java deleted file mode 100644 index f1b696e9e..000000000 --- a/src/main/java/com/gmail/val59000mc/utils/VersionUtils_1_18.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gmail.val59000mc.utils; - -import com.gmail.val59000mc.UhcCore; - -public class VersionUtils_1_18 extends VersionUtils_1_15 { - - @Override - public void replaceOceanBiomes() { - UhcCore.getPlugin().getLogger().warning( - "The 'replace-ocean-biomes' setting is currently not supported in Minecraft 1.18+"); - } - -} From ecb104a596251b1139bc8e60cd4d6e57980f7df4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Wed, 9 Mar 2022 22:55:11 +0100 Subject: [PATCH 07/10] Add run-paper Gradle plugin This makes it easier to test the plugin on different server versions. --- .gitignore | 5 ++++- build.gradle | 13 ++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 08f8fe221..087f714b8 100644 --- a/.gitignore +++ b/.gitignore @@ -75,4 +75,7 @@ todolist.txt # WorldEdit Builds Support-WorldEdit-7/build/tmp* -Support-WorldEdit-6/build/tmp* \ No newline at end of file +Support-WorldEdit-6/build/tmp* + +# run-paper +/run/ diff --git a/build.gradle b/build.gradle index 4752d32e7..2d24170ea 100644 --- a/build.gradle +++ b/build.gradle @@ -10,6 +10,10 @@ buildscript { } } +plugins { + id "xyz.jpenilla.run-paper" version "1.0.6" +} + allprojects { apply plugin: 'java-library' apply plugin: 'com.github.johnrengelman.shadow' @@ -85,4 +89,11 @@ shadowJar { relocate 'net.wesjd.anvilgui', 'com.gmail.val59000mc.anvilgui' } -build.dependsOn(shadowJar) \ No newline at end of file +build.dependsOn(shadowJar) + +runServer { + minecraftVersion "1.18.2" + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(17) + } +} From 2f54917cf54e60ba1ec86363442262f246d7b911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Wed, 9 Mar 2022 23:05:34 +0100 Subject: [PATCH 08/10] Improve Shadow plugin configuration Previously it was applied to all projects, which is unnecessary and slows the build down. BiomeMapping is now shaded to avoid conflicts with other plugins. --- Support-WorldEdit-6/build.gradle | 6 +++--- Support-WorldEdit-7/build.gradle | 4 ++-- build.gradle | 21 ++++++--------------- 3 files changed, 11 insertions(+), 20 deletions(-) diff --git a/Support-WorldEdit-6/build.gradle b/Support-WorldEdit-6/build.gradle index 596b7e545..25e659bc8 100644 --- a/Support-WorldEdit-6/build.gradle +++ b/Support-WorldEdit-6/build.gradle @@ -1,5 +1,5 @@ dependencies { - shadow 'org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT' - shadow 'com.sk89q.worldedit:worldedit-bukkit:6.1.5' - shadow 'com.sk89q.worldedit:worldedit-core:6.1.4-SNAPSHOT' + compileOnly 'org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT' + compileOnly 'com.sk89q.worldedit:worldedit-bukkit:6.1.5' + compileOnly 'com.sk89q.worldedit:worldedit-core:6.1.4-SNAPSHOT' } diff --git a/Support-WorldEdit-7/build.gradle b/Support-WorldEdit-7/build.gradle index df637e72f..9f9d5b3ae 100644 --- a/Support-WorldEdit-7/build.gradle +++ b/Support-WorldEdit-7/build.gradle @@ -1,4 +1,4 @@ dependencies { - shadow 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' - shadow 'com.sk89q.worldedit:worldedit-bukkit:7.1.0-SNAPSHOT' + compileOnly 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' + compileOnly 'com.sk89q.worldedit:worldedit-bukkit:7.1.0-SNAPSHOT' } diff --git a/build.gradle b/build.gradle index 2d24170ea..2dde3ef13 100644 --- a/build.gradle +++ b/build.gradle @@ -1,22 +1,12 @@ import org.apache.tools.ant.filters.ReplaceTokens -buildscript { - repositories { - gradlePluginPortal() - } - - dependencies { - classpath 'gradle.plugin.com.github.johnrengelman:shadow:7.1.2' - } -} - plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" id "xyz.jpenilla.run-paper" version "1.0.6" } allprojects { apply plugin: 'java-library' - apply plugin: 'com.github.johnrengelman.shadow' group = pluginGroup version = pluginVersion @@ -63,7 +53,7 @@ allprojects { } dependencies { - shadow 'com.google.code.findbugs:jsr305:3.0.2' + compileOnly 'com.google.code.findbugs:jsr305:3.0.2' //shadow 'org.spigotmc:spigot-api:1.8.8-R0.1-SNAPSHOT' //shadow 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' //shadow 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' @@ -71,11 +61,11 @@ dependencies { //shadow 'org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT' //shadow 'org.spigotmc:spigot-api:1.16.5-R0.1-SNAPSHOT' //shadow 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT' - shadow 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' - shadow 'com.github.MilkBowl:VaultAPI:1.7' + compileOnly 'org.spigotmc:spigot-api:1.18-R0.1-SNAPSHOT' + compileOnly 'com.github.MilkBowl:VaultAPI:1.7' implementation 'net.wesjd:anvilgui:1.5.3-SNAPSHOT' implementation "io.papermc:paperlib:1.0.5" - shadow 'com.comphenix.protocol:ProtocolLib:4.7.0' + compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0' implementation project('Support-WorldEdit-6') implementation project('Support-WorldEdit-7') implementation project(":adapters") @@ -87,6 +77,7 @@ shadowJar { classifier = '' relocate 'io.papermc.lib', 'com.gmail.val59000mc.paperlib' relocate 'net.wesjd.anvilgui', 'com.gmail.val59000mc.anvilgui' + relocate 'com.pieterdebot.biomemapping', 'com.gmail.val59000mc.biomemapping' } build.dependsOn(shadowJar) From 1d71237d896077ef3055edea91ab53cc2d7d927c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Thu, 10 Mar 2022 01:50:35 +0100 Subject: [PATCH 09/10] Fix indentation issues --- .../adapters/impl/v1_18_R1/RegistryUtils.java | 34 ++++++------ .../impl/v1_18_R1/VersionAdapterImpl.java | 2 +- .../adapters/impl/v1_18_R2/RegistryUtils.java | 52 +++++++++---------- .../impl/v1_18_R2/VersionAdapterImpl.java | 2 +- .../impl/DefaultVersionAdapterImpl.java | 48 ++++++++--------- 5 files changed, 69 insertions(+), 69 deletions(-) diff --git a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java index 3e47ac0bf..f22167fa3 100644 --- a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java +++ b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/RegistryUtils.java @@ -17,23 +17,23 @@ */ public abstract class RegistryUtils { - private static final RegistryAccess registryAccess = getRegistryAccess(); - - private static RegistryAccess getRegistryAccess() { - final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); - return server.registryAccess(); - } - - /** - * Obtains write access to a given registry and runs an operation on it. - * - * @param the type of registry - * @param registryKey the key for the registry - * @param writeOperation the operation to run with write access - */ + private static final RegistryAccess registryAccess = getRegistryAccess(); + + private static RegistryAccess getRegistryAccess() { + final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); + return server.registryAccess(); + } + + /** + * Obtains write access to a given registry and runs an operation on it. + * + * @param the type of registry + * @param registryKey the key for the registry + * @param writeOperation the operation to run with write access + */ public static void obtainWriteAccess(ResourceKey> registryKey, Consumer> writeOperation) { - final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); - writeOperation.accept(registry); - } + final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); + writeOperation.accept(registry); + } } diff --git a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java index 04a4c2c6f..7739deaf7 100644 --- a/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java +++ b/adapters/1_18_R1/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R1/VersionAdapterImpl.java @@ -21,5 +21,5 @@ public void removeOceans() { noiseRegistry.registerOrOverride(OptionalInt.empty(), Noises.CONTINENTALNESS, continentalnessWithoutOceans, Lifecycle.stable()); }); } - + } diff --git a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java index f2b36236a..00389773b 100644 --- a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java +++ b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/RegistryUtils.java @@ -18,34 +18,34 @@ */ public abstract class RegistryUtils { - private static final RegistryAccess registryAccess = getRegistryAccess(); - - private static RegistryAccess getRegistryAccess() { - final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); - return server.registryAccess(); - } - - /** - * Obtains write access to a given registry and runs an operation on it. - * - * @param the type of registry - * @param registryKey the key for the registry - * @param writeOperation the operation to run with write access - */ + private static final RegistryAccess registryAccess = getRegistryAccess(); + + private static RegistryAccess getRegistryAccess() { + final DedicatedServer server = ((CraftServer) Bukkit.getServer()).getServer(); + return server.registryAccess(); + } + + /** + * Obtains write access to a given registry and runs an operation on it. + * + * @param the type of registry + * @param registryKey the key for the registry + * @param writeOperation the operation to run with write access + */ public static void obtainWriteAccess(ResourceKey> registryKey, Consumer> writeOperation) { - final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); - try { - // Starting from 1.18.2, registries are frozen after initialization, - // which happens before any plugins are loaded. This is a workaround - // to allow writing to the registry by temporarily unfreezing it again. - final Field frozen = MappedRegistry.class.getDeclaredField("bL"); - frozen.setAccessible(true); - frozen.set(registry, false); + final MappedRegistry registry = (MappedRegistry) registryAccess.ownedRegistryOrThrow(registryKey); + try { + // Starting from 1.18.2, registries are frozen after initialization, + // which happens before any plugins are loaded. This is a workaround + // to allow writing to the registry by temporarily unfreezing it again. + final Field frozen = MappedRegistry.class.getDeclaredField("bL"); + frozen.setAccessible(true); + frozen.set(registry, false); writeOperation.accept(registry); frozen.set(registry, true); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - throw new RuntimeException("Unable to get registry write access", e); - } - } + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { + throw new RuntimeException("Unable to get registry write access", e); + } + } } diff --git a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java index 91768313a..1f3e286b4 100644 --- a/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java +++ b/adapters/1_18_R2/src/main/java/com/gmail/val59000mc/adapters/impl/v1_18_R2/VersionAdapterImpl.java @@ -31,5 +31,5 @@ public void removeOceans() { dfRegistry.registerOrOverride(OptionalInt.empty(), continentsKey, continentsWithoutOceans, Lifecycle.stable()); }); } - + } diff --git a/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java b/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java index f0154fa3a..fddfaf47a 100644 --- a/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java +++ b/adapters/src/main/java/com/gmail/val59000mc/adapters/impl/DefaultVersionAdapterImpl.java @@ -11,31 +11,31 @@ */ public class DefaultVersionAdapterImpl extends VersionAdapter { - @Override + @Override public void removeOceans() { - final int version = PaperLib.getMinecraftVersion(); - if (8 <= version && version <= 17) { - removeOceansUsingBiomeMapping(); - } else { - throw new UnsupportedOperationException(); - } + final int version = PaperLib.getMinecraftVersion(); + if (8 <= version && version <= 17) { + removeOceansUsingBiomeMapping(); + } else { + throw new UnsupportedOperationException(); + } + } + + private void removeOceansUsingBiomeMapping() { + final BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); + Biome replacementBiome = Biome.PLAINS; + + for (Biome biome : Biome.values()) { + if (biome.isOcean() && biomeMapping.biomeSupported(biome)) { + try { + biomeMapping.replaceBiomes(biome, replacementBiome); + } catch (Exception ex) { + ex.printStackTrace(); + } + + replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; + } + } } - private void removeOceansUsingBiomeMapping() { - final BiomeMappingAPI biomeMapping = new BiomeMappingAPI(); - Biome replacementBiome = Biome.PLAINS; - - for (Biome biome : Biome.values()) { - if (biome.isOcean() && biomeMapping.biomeSupported(biome)) { - try { - biomeMapping.replaceBiomes(biome, replacementBiome); - } catch (Exception ex) { - ex.printStackTrace(); - } - - replacementBiome = replacementBiome == Biome.PLAINS ? Biome.FOREST : Biome.PLAINS; - } - } - } - } From 110178a6432c4b12c755500ac910bfb7f35c13f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Odin=20Dahlstr=C3=B6m?= Date: Tue, 15 Mar 2022 22:48:33 +0100 Subject: [PATCH 10/10] Remove paperweight workaround The issue was that task the configuration avoidance API has to be used explicitly in the Groovy DSL, see PaperMC/paperweight#143. --- adapters/1_18_R1/build.gradle | 10 +++------- adapters/1_18_R2/build.gradle | 10 +++------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/adapters/1_18_R1/build.gradle b/adapters/1_18_R1/build.gradle index 3440e41b4..2ac99ae20 100644 --- a/adapters/1_18_R1/build.gradle +++ b/adapters/1_18_R1/build.gradle @@ -8,13 +8,9 @@ dependencies { } // Reobfuscate JAR with paperweight on build -tasks.assemble.dependsOn(tasks.reobfJar) +tasks.named("assemble") { + dependsOn tasks.named("reobfJar") +} // Minecraft 1.18 requires Java 17 java.toolchain.languageVersion = JavaLanguageVersion.of(17) - -// The reobf configuration points to the wrong artifact location by default, -// this is a workaround to allow consuming the reobfuscated JAR. -configurations.reobf { - outgoing.artifact(tasks.jar.archiveFile) -} diff --git a/adapters/1_18_R2/build.gradle b/adapters/1_18_R2/build.gradle index 240a36e9c..8b0270fe8 100644 --- a/adapters/1_18_R2/build.gradle +++ b/adapters/1_18_R2/build.gradle @@ -8,13 +8,9 @@ dependencies { } // Reobfuscate JAR with paperweight on build -tasks.assemble.dependsOn(tasks.reobfJar) +tasks.named("assemble") { + dependsOn tasks.named("reobfJar") +} // Minecraft 1.18 requires Java 17 java.toolchain.languageVersion = JavaLanguageVersion.of(17) - -// The reobf configuration points to the wrong artifact location by default, -// this is a workaround to allow consuming the reobfuscated JAR. -configurations.reobf { - outgoing.artifact(tasks.jar.archiveFile) -}