From bd8c792fa4cc1a508f8dc9b3c404cab9fed3ca47 Mon Sep 17 00:00:00 2001 From: pop4959 Date: Mon, 26 Feb 2024 03:47:00 -0800 Subject: [PATCH] Support custom biomes in random teleport excluded biome list (#5703) --- .../com/earth2me/essentials/Essentials.java | 12 ++++++ .../com/earth2me/essentials/IEssentials.java | 3 ++ .../earth2me/essentials/RandomTeleport.java | 41 ++++++++++++++----- .../net/ess3/provider/BiomeKeyProvider.java | 8 ++++ providers/PaperProvider/build.gradle | 4 +- .../providers/PaperBiomeKeyProvider.java | 19 +++++++++ 6 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java create mode 100644 providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java diff --git a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java index 3a54a58bc..81a4ab8f3 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/Essentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/Essentials.java @@ -59,6 +59,7 @@ import net.ess3.nms.refl.providers.ReflServerStateProvider; import net.ess3.nms.refl.providers.ReflSpawnEggProvider; import net.ess3.nms.refl.providers.ReflSpawnerBlockProvider; import net.ess3.nms.refl.providers.ReflSyncCommandsProvider; +import net.ess3.provider.BiomeKeyProvider; import net.ess3.provider.ContainerProvider; import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; @@ -95,6 +96,7 @@ import net.ess3.provider.providers.ModernItemUnbreakableProvider; import net.ess3.provider.providers.ModernPersistentDataProvider; import net.ess3.provider.providers.ModernPlayerLocaleProvider; import net.ess3.provider.providers.ModernSignDataProvider; +import net.ess3.provider.providers.PaperBiomeKeyProvider; import net.ess3.provider.providers.PaperContainerProvider; import net.ess3.provider.providers.PaperKnownCommandsProvider; import net.ess3.provider.providers.PaperMaterialTagProvider; @@ -197,6 +199,7 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { private transient PlayerLocaleProvider playerLocaleProvider; private transient SignDataProvider signDataProvider; private transient DamageEventProvider damageEventProvider; + private transient BiomeKeyProvider biomeKeyProvider; private transient Kits kits; private transient RandomTeleport randomTeleport; private transient UpdateChecker updateChecker; @@ -485,6 +488,10 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { damageEventProvider = new LegacyDamageEventProvider(); } + if (PaperLib.isPaper() && VersionUtil.getServerBukkitVersion().isHigherThanOrEqualTo(VersionUtil.v1_19_4_R01)) { + biomeKeyProvider = new PaperBiomeKeyProvider(); + } + execTimer.mark("Init(Providers)"); reload(); @@ -1426,6 +1433,11 @@ public class Essentials extends JavaPlugin implements net.ess3.api.IEssentials { return damageEventProvider; } + @Override + public BiomeKeyProvider getBiomeKeyProvider() { + return biomeKeyProvider; + } + @Override public SignDataProvider getSignDataProvider() { return signDataProvider; diff --git a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java index 9aea053e8..3b41f1c30 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java +++ b/Essentials/src/main/java/com/earth2me/essentials/IEssentials.java @@ -9,6 +9,7 @@ import com.earth2me.essentials.perm.PermissionsHandler; import com.earth2me.essentials.updatecheck.UpdateChecker; import com.earth2me.essentials.userstorage.IUserMap; import net.ess3.nms.refl.providers.ReflOnlineModeProvider; +import net.ess3.provider.BiomeKeyProvider; import net.ess3.provider.ContainerProvider; import net.ess3.provider.DamageEventProvider; import net.ess3.provider.FormattedCommandAliasProvider; @@ -186,5 +187,7 @@ public interface IEssentials extends Plugin { DamageEventProvider getDamageEventProvider(); + BiomeKeyProvider getBiomeKeyProvider(); + PluginCommand getPluginCommand(String cmd); } diff --git a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java index f020a2cca..b1b683ab6 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java +++ b/Essentials/src/main/java/com/earth2me/essentials/RandomTeleport.java @@ -6,13 +6,12 @@ import com.earth2me.essentials.utils.LocationUtil; import com.earth2me.essentials.utils.VersionUtil; import io.papermc.lib.PaperLib; import net.ess3.api.InvalidWorldException; +import net.ess3.provider.BiomeKeyProvider; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.block.Biome; import java.io.File; import java.util.HashSet; -import java.util.List; import java.util.Queue; import java.util.Random; import java.util.Set; @@ -76,14 +75,10 @@ public class RandomTeleport implements IConf { config.save(); } - public Set getExcludedBiomes() { - final List biomeNames = config.getList("excluded-biomes", String.class); - final Set excludedBiomes = new HashSet<>(); - for (final String biomeName : biomeNames) { - try { - excludedBiomes.add(Biome.valueOf(biomeName.toUpperCase())); - } catch (final IllegalArgumentException ignored) { - } + public Set getExcludedBiomes() { + final Set excludedBiomes = new HashSet<>(); + for (final String key : config.getList("excluded-biomes", String.class)) { + excludedBiomes.add(key.toLowerCase()); } return excludedBiomes; } @@ -204,7 +199,31 @@ public class RandomTeleport implements IConf { } private boolean isValidRandomLocation(final Location location) { - return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !this.getExcludedBiomes().contains(location.getBlock().getBiome()); + return location.getBlockY() > ess.getWorldInfoProvider().getMinHeight(location.getWorld()) && !isExcludedBiome(location); + } + + // Exclude biome if enum or namespaced key matches + private boolean isExcludedBiome(final Location location) { + final Set excluded = getExcludedBiomes(); + final String enumKey = location.getBlock().getBiome().name().toLowerCase(); + // Try with good old bukkit enum + if (excluded.contains(enumKey)) { + return true; + } + if (VersionUtil.getServerBukkitVersion().isLowerThan(VersionUtil.v1_14_4_R01)) { + // No way to get the biome key on versions below this + return false; + } + final String biomeKey; + final BiomeKeyProvider biomeKeyProvider = ess.getBiomeKeyProvider(); + if (biomeKeyProvider != null) { + // Works with custom biome keys + biomeKey = biomeKeyProvider.getBiomeKey(location.getBlock()).toString(); + } else { + // Custom biome keys resolve as "minecraft:custom" which is unfortunate + biomeKey = location.getBlock().getBiome().getKey().toString(); + } + return excluded.contains(biomeKey); } public File getFile() { diff --git a/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java new file mode 100644 index 000000000..94ee756fc --- /dev/null +++ b/providers/BaseProviders/src/main/java/net/ess3/provider/BiomeKeyProvider.java @@ -0,0 +1,8 @@ +package net.ess3.provider; + +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; + +public interface BiomeKeyProvider extends Provider { + NamespacedKey getBiomeKey(Block block); +} diff --git a/providers/PaperProvider/build.gradle b/providers/PaperProvider/build.gradle index ecff3ba47..b66ffd77c 100644 --- a/providers/PaperProvider/build.gradle +++ b/providers/PaperProvider/build.gradle @@ -11,8 +11,8 @@ dependencies { implementation(project(':providers:BaseProviders')) { exclude(module: 'spigot-api') } - compileOnly 'io.papermc.paper:paper-api:1.18.2-R0.1-SNAPSHOT' - compileOnly 'io.papermc.paper:paper-mojangapi:1.18.2-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT' + compileOnly 'io.papermc.paper:paper-mojangapi:1.20.4-R0.1-SNAPSHOT' } essentials { diff --git a/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java new file mode 100644 index 000000000..34c26ea48 --- /dev/null +++ b/providers/PaperProvider/src/main/java/net/ess3/provider/providers/PaperBiomeKeyProvider.java @@ -0,0 +1,19 @@ +package net.ess3.provider.providers; + +import net.ess3.provider.BiomeKeyProvider; +import org.bukkit.Bukkit; +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; + +@SuppressWarnings("deprecation") +public class PaperBiomeKeyProvider implements BiomeKeyProvider { + @Override + public NamespacedKey getBiomeKey(final Block block) { + return Bukkit.getUnsafe().getBiomeKey(block.getWorld(), block.getX(), block.getY(), block.getZ()); + } + + @Override + public String getDescription() { + return "Paper Biome Key Provider"; + } +}