diff --git a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java index aa2fd93e86..9d33d05736 100644 --- a/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java +++ b/paper/src/main/java/com/denizenscript/denizen/paper/utilities/PaperAPIToolsImpl.java @@ -9,6 +9,8 @@ import com.denizenscript.denizen.utilities.PaperAPITools; import com.denizenscript.denizencore.DenizenCore; import com.denizenscript.denizencore.utilities.CoreUtilities; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; import com.destroystokyo.paper.profile.PlayerProfile; import com.destroystokyo.paper.profile.ProfileProperty; import io.papermc.paper.entity.TeleportFlag; @@ -276,12 +278,20 @@ public ProfileProperty getProfileProperty(PlayerProfile profile, String name) { @Override public T spawnEntity(Location location, Class type, Consumer configure, CreatureSpawnEvent.SpawnReason reason) { - if (NMSHandler.getVersion().isAtLeast(NMSVersion.v1_18)) { - return location.getWorld().spawn(location, type, configure, reason); - } - else { - return super.spawnEntity(location, type, configure, reason); + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + // Takes the deprecated bukkit consumer on older versions + if (WORLD_SPAWN_BUKKIT_CONSUMER == null) { + WORLD_SPAWN_BUKKIT_CONSUMER = ReflectionHelper.getMethodHandle(RegionAccessor.class, "spawn", Location.class, Class.class, Consumer.class, CreatureSpawnEvent.SpawnReason.class); + } + try { + return (T) WORLD_SPAWN_BUKKIT_CONSUMER.invoke(location.getWorld(), location, type, configure, reason); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } } + return location.getWorld().spawn(location, type, configure, reason); } @Override diff --git a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java index 2c8cea4c22..668d086684 100644 --- a/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java +++ b/plugin/src/main/java/com/denizenscript/denizen/utilities/PaperAPITools.java @@ -1,11 +1,15 @@ package com.denizenscript.denizen.utilities; import com.denizenscript.denizen.nms.NMSHandler; +import com.denizenscript.denizen.nms.NMSVersion; import com.denizenscript.denizen.scripts.commands.entity.TeleportCommand; +import com.denizenscript.denizencore.utilities.ReflectionHelper; +import com.denizenscript.denizencore.utilities.debugging.Debug; import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Nameable; +import org.bukkit.RegionAccessor; import org.bukkit.block.Sign; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; @@ -19,6 +23,7 @@ import org.bukkit.scoreboard.Team; import org.bukkit.util.Consumer; +import java.lang.invoke.MethodHandle; import java.util.List; public class PaperAPITools { @@ -138,7 +143,23 @@ public void setSkinBlob(Player player, String blob) { NMSHandler.instance.getProfileEditor().setPlayerSkinBlob(player, blob); } + public static MethodHandle WORLD_SPAWN_BUKKIT_CONSUMER = null; + + // TODO once 1.20 is the minimum supported version, use the modern java.util.Consumer public T spawnEntity(Location location, Class type, Consumer configure, CreatureSpawnEvent.SpawnReason reason) { + if (NMSHandler.getVersion().isAtMost(NMSVersion.v1_19)) { + // Takes the deprecated bukkit consumer on older versions + if (WORLD_SPAWN_BUKKIT_CONSUMER == null) { + WORLD_SPAWN_BUKKIT_CONSUMER = ReflectionHelper.getMethodHandle(RegionAccessor.class, "spawn", Location.class, Class.class, Consumer.class); + } + try { + return (T) WORLD_SPAWN_BUKKIT_CONSUMER.invoke(location.getWorld(), location, type, configure); + } + catch (Throwable e) { + Debug.echoError(e); + return null; + } + } return location.getWorld().spawn(location, type, configure); }