Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Abstract out paper lib #2580

Merged
merged 3 commits into from
Dec 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,13 @@
<version>4.2.2</version>
<scope>test</scope>
</dependency>
<!-- Paper API -->
<dependency>
<groupId>io.papermc.paper</groupId>
<artifactId>paper-api</artifactId>
<version>${paper.version}</version>
<scope>provided</scope>
</dependency>
<!-- Spigot API -->
<dependency>
<groupId>org.spigotmc</groupId>
Expand Down Expand Up @@ -357,13 +364,6 @@
<artifactId>org.eclipse.jdt.annotation</artifactId>
<version>2.2.600</version>
</dependency>
<!-- PaperLib -->
<dependency>
<groupId>io.papermc</groupId>
<artifactId>paperlib</artifactId>
<version>1.0.6</version>
<scope>compile</scope>
</dependency>
<!-- LangUtils -->
<dependency>
<groupId>com.github.apachezy</groupId>
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/world/bentobox/bentobox/api/hooks/NPCHook.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,6 @@
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

import de.oliver.fancynpcs.api.Npc;
import lol.pyr.znpcsplus.api.npc.NpcEntry;
import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import de.oliver.fancynpcs.api.actions.NpcAction;
import de.oliver.fancynpcs.api.utils.NpcEquipmentSlot;
import de.oliver.fancynpcs.api.utils.SkinFetcher;
import lol.pyr.znpcsplus.api.npc.NpcEntry;
import net.kyori.adventure.text.format.NamedTextColor;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.hooks.NPCHook;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@
import org.bukkit.util.Vector;
import org.eclipse.jdt.annotation.NonNull;

import io.papermc.lib.PaperLib;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.flags.FlagListener;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.lists.Flags;
import world.bentobox.bentobox.util.Util;

/**
* Listener for the lock flag
Expand Down Expand Up @@ -164,7 +164,7 @@ private void eject(Player player) {
// We'll try to teleport him to the spawn...
Location l = player.getWorld().getSpawnLocation();
if (l != null) {
PaperLib.teleportAsync(player, l);
Util.teleportAsync(player, l);
}

// Switch him back to the default gamemode. He may die, sorry :(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import io.papermc.lib.PaperLib;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.events.IslandBaseEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent;
Expand Down Expand Up @@ -1080,7 +1079,7 @@ private CompletableFuture<Boolean> homeTeleportAsync(@NonNull World world, @NonN
.ifFail(() -> goingHome.remove(user.getUniqueId())).buildFuture().thenAccept(result::complete);
return;
}
PaperLib.teleportAsync(Objects.requireNonNull(player), home).thenAccept(b -> {
Util.teleportAsync(Objects.requireNonNull(player), home).thenAccept(b -> {
// Only run the commands if the player is successfully teleported
if (Boolean.TRUE.equals(b)) {
teleported(world, user, name, newIsland, island);
Expand Down Expand Up @@ -1192,7 +1191,6 @@ public void spawnTeleport(@NonNull World world, @NonNull Player player) {
*
* @param player player
*/
@SuppressWarnings("deprecation")
private void readyPlayer(@NonNull Player player) {
// Stop any gliding
player.setGliding(false);
Expand Down Expand Up @@ -1469,7 +1467,7 @@ public void removePlayersFromIsland(Island island) {
} else {
// Move player to spawn
getSpawn(w).map(i -> i.getSpawnPoint(w.getEnvironment())).filter(Objects::nonNull)
.ifPresentOrElse(sp -> PaperLib.teleportAsync(p, sp),
.ifPresentOrElse(sp -> Util.teleportAsync(p, sp),
() -> plugin.logWarning("Spawn exists but its location is null!"));

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@
import world.bentobox.bentobox.api.events.island.IslandCreateEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent;
import world.bentobox.bentobox.api.events.island.IslandEvent.Reason;
import world.bentobox.bentobox.api.events.island.IslandResetEvent;
import world.bentobox.bentobox.api.logs.LogEntry;
import world.bentobox.bentobox.api.logs.LogEntry.LogType;
import world.bentobox.bentobox.api.events.island.IslandResetEvent;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.database.objects.Island;
import world.bentobox.bentobox.managers.BlueprintsManager;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

import io.papermc.lib.PaperLib;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.addons.GameModeAddon;
import world.bentobox.bentobox.api.hooks.Hook;
Expand All @@ -48,6 +47,7 @@
import world.bentobox.bentobox.hooks.SlimefunHook;
import world.bentobox.bentobox.hooks.ZNPCsPlusHook;
import world.bentobox.bentobox.util.MyBiomeGrid;
import world.bentobox.bentobox.util.Util;

/**
* Regenerates by using a seed world. The seed world is created using the same generator as the game
Expand Down Expand Up @@ -148,7 +148,7 @@ private CompletableFuture<Void> regenerateChunk(@Nullable IslandDeletion di, @No
CompletableFuture<Chunk> seedWorldFuture = getSeedWorldChunk(world, chunkX, chunkZ);

// Set up a future to get the chunk requests using Paper's Lib. If Paper is used, this should be done async
CompletableFuture<Chunk> chunkFuture = PaperLib.getChunkAtAsync(world, chunkX, chunkZ);
CompletableFuture<Chunk> chunkFuture = Util.getChunkAtAsync(world, chunkX, chunkZ);

// If there is no island, do not clean chunk
CompletableFuture<Void> cleanFuture = di != null ? cleanChunk(chunkFuture, di) : CompletableFuture.completedFuture(null);
Expand All @@ -172,7 +172,7 @@ private CompletableFuture<Void> regenerateChunk(@Nullable IslandDeletion di, @No
private CompletableFuture<Chunk> getSeedWorldChunk(World world, int chunkX, int chunkZ) {
World seed = Bukkit.getWorld(world.getName() + "/bentobox");
if (seed == null) return CompletableFuture.completedFuture(null);
return PaperLib.getChunkAtAsync(seed, chunkX, chunkZ);
return Util.getChunkAtAsync(seed, chunkX, chunkZ);
}

/**
Expand Down Expand Up @@ -247,6 +247,7 @@ private void copyChunkDataToChunk(Chunk toChunk, Chunk fromChunk, BoundingBox li
Arrays.stream(fromChunk.getTileEntities()).forEach(bs -> processTileEntity(bs.getBlock(), bs.getLocation().toVector().toLocation(toChunk.getWorld()).getBlock()));
}

@SuppressWarnings("deprecation")
private void processEntity(Entity entity, Location location) {
Entity bpe = location.getWorld().spawnEntity(location, entity.getType());
bpe.setCustomName(entity.getCustomName());
Expand Down Expand Up @@ -374,7 +375,7 @@ private boolean isEnded(int chunkX) {
@SuppressWarnings("deprecation")
private CompletableFuture<Void> regenerateChunk(GameModeAddon gm, IslandDeletion di, @Nonnull World world,
int chunkX, int chunkZ) {
CompletableFuture<Chunk> chunkFuture = PaperLib.getChunkAtAsync(world, chunkX, chunkZ);
CompletableFuture<Chunk> chunkFuture = Util.getChunkAtAsync(world, chunkX, chunkZ);
CompletableFuture<Void> invFuture = chunkFuture.thenAccept(chunk ->
Arrays.stream(chunk.getTileEntities()).filter(InventoryHolder.class::isInstance)
.filter(te -> di.inBounds(te.getLocation().getBlockX(), te.getLocation().getBlockZ()))
Expand Down
131 changes: 50 additions & 81 deletions src/main/java/world/bentobox/bentobox/util/Util.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package world.bentobox.bentobox.util;

import java.io.IOException;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand All @@ -26,7 +27,6 @@
import org.bukkit.World;
import org.bukkit.World.Environment;
import org.bukkit.attribute.Attribute;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Allay;
import org.bukkit.entity.Animals;
Expand All @@ -51,8 +51,6 @@
import com.google.common.base.Enums;
import com.google.common.base.Optional;

import io.papermc.lib.PaperLib;
import io.papermc.lib.features.blockstatesnapshot.BlockStateSnapshotResult;
import world.bentobox.bentobox.BentoBox;
import world.bentobox.bentobox.api.user.User;
import world.bentobox.bentobox.nms.PasteHandler;
Expand Down Expand Up @@ -382,7 +380,7 @@ public static boolean isTamableEntity(Entity entity) {
*/
@NonNull
public static CompletableFuture<Boolean> teleportAsync(@Nonnull Entity entity, @Nonnull Location location) {
return PaperLib.teleportAsync(entity, location);
return teleportAsync(entity, location, TeleportCause.UNKNOWN);
}

/**
Expand All @@ -392,12 +390,26 @@ public static CompletableFuture<Boolean> teleportAsync(@Nonnull Entity entity, @
* @param cause The cause for the teleportation
* @return Future that completes with the result of the teleport
*/
@SuppressWarnings("unchecked")
@NonNull
public static CompletableFuture<Boolean> teleportAsync(@Nonnull Entity entity, @Nonnull Location location,
TeleportCause cause) {
return PaperLib.teleportAsync(entity, location, cause);
try {
// Use reflection to check if the method exists
Method method = Entity.class.getMethod("teleportAsync", Location.class, TeleportCause.class);
if (method != null) {
// Invoke the method using reflection on the entity instance
return (CompletableFuture<Boolean>) method.invoke(entity, location, cause);
}
} catch (NoSuchMethodException e) {
// Method does not exist, fallback to Spigot behavior
} catch (Exception e) {
plugin.logStacktrace(e); // Report other exceptions
}
// Fallback for Spigot servers
entity.teleport(location, cause);
return CompletableFuture.completedFuture(true);
}

/**
* Gets the chunk at the target location, loading it asynchronously if needed.
* @param loc Location to get chunk for
Expand Down Expand Up @@ -440,9 +452,24 @@ public static CompletableFuture<Chunk> getChunkAtAsync(@Nonnull World world, int
* @param gen Should the chunk generate or not. Only respected on some MC versions, 1.13 for CB, 1.12 for Paper
* @return Future that completes with the chunk, or null if the chunk did not exists and generation was not requested.
*/
@SuppressWarnings("unchecked")
@NonNull
public static CompletableFuture<Chunk> getChunkAtAsync(@Nonnull World world, int x, int z, boolean gen) {
return PaperLib.getChunkAtAsync(world, x, z, gen);
try {
// Use reflection to check if the method exists
Method method = World.class.getMethod("getChunkAtAsync", int.class, int.class, boolean.class);
if (method != null) {
// Invoke the method using reflection
return (CompletableFuture<Chunk>) method.invoke(world, x, z, gen);
}
} catch (NoSuchMethodException e) {
// Method does not exist, fallback to Spigot behavior
} catch (Exception e) {
e.printStackTrace(); // Handle other exceptions (optional)
}
// Fallback for Spigot servers
return CompletableFuture.completedFuture(world.getChunkAt(x, z, gen));

}

/**
Expand All @@ -462,56 +489,7 @@ public static boolean isChunkGenerated(@NonNull Location loc) {
* @return If the chunk is generated or not
*/
public static boolean isChunkGenerated(@Nonnull World world, int x, int z) {
return PaperLib.isChunkGenerated(world, x, z);
}

/**
* Get's a BlockState, optionally not using a snapshot
* @param block The block to get a State of
* @param useSnapshot Whether or not to use a snapshot when supported
* @return The BlockState
*/
@NonNull
public static BlockStateSnapshotResult getBlockState(@Nonnull Block block, boolean useSnapshot) {
return PaperLib.getBlockState(block, useSnapshot);
}

/**
* Detects if the current MC version is at least the following version.
* <p>
* Assumes 0 patch version.
*
* @param minor Min Minor Version
* @return Meets the version requested
*/
public static boolean isVersion(int minor) {
return PaperLib.isVersion(minor);
}

/**
* Detects if the current MC version is at least the following version.
* @param minor Min Minor Version
* @param patch Min Patch Version
* @return Meets the version requested
*/
public static boolean isVersion(int minor, int patch) {
return PaperLib.isVersion(minor, patch);
}

/**
* Gets the current Minecraft Minor version. IE: 1.13.1 returns 13
* @return The Minor Version
*/
public static int getMinecraftVersion() {
return PaperLib.getMinecraftVersion();
}

/**
* Gets the current Minecraft Patch version. IE: 1.13.1 returns 1
* @return The Patch Version
*/
public static int getMinecraftPatchVersion() {
return PaperLib.getMinecraftPatchVersion();
return world.isChunkGenerated(x, z);
}

/**
Expand Down Expand Up @@ -562,42 +540,26 @@ public static boolean isVersionCompatible(String version, String requiredVersion
return !(!isRequiredSnapshot && isVersionSnapshot);
}

/**
* Check if the server has access to the Spigot API
* @return True for Spigot <em>and</em> Paper environments
*/
public static boolean isSpigot() {
return PaperLib.isSpigot();
}

/**
* Check if the server has access to the Paper API
* @return True for Paper environments
*/
public static boolean isPaper() {
return !isJUnitTest() && PaperLib.isPaper();
}

/**
* I don't like doing this, but otherwise we need to set a flag in every test
*/
private static boolean isJUnitTest() {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTrace) {
if (element.getClassName().startsWith("org.junit.")) {
return true;
}
try {
Class.forName("com.destroystokyo.paper.PaperConfig");
return true; // Paper-specific class exists
} catch (ClassNotFoundException e) {
return false; // Not a Paper server
}
return false;
}


/**
* This method translates color codes in given string and strips whitespace after them.
* This code parses both: hex and old color codes.
* @param textToColor Text which color codes must be parsed.
* @return String text with parsed colors and stripped whitespaces after them.
*/
@SuppressWarnings("deprecation")
@NonNull
public static String translateColorCodes(@NonNull String textToColor) {
// Use matcher to find hex patterns in given text.
Expand Down Expand Up @@ -760,8 +722,14 @@ public static void runCommands(User user, String ownerName, @NonNull List<String
* @param player - player
*/
public static void resetHealth(Player player) {
double maxHealth = player.getAttribute(Attribute.MAX_HEALTH).getBaseValue();
player.setHealth(maxHealth);
try {
// Paper
double maxHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getBaseValue();
player.setHealth(maxHealth);
} catch (Exception e) {
// Spigot
player.setHealth(20D);
}
}

/**
Expand Down Expand Up @@ -862,6 +830,7 @@ public static int broadcast(String localeKey, String... variables) {
* @param input Input that need to be sanitized.
* @return A sanitized input without illegal characters in names.
*/
@SuppressWarnings("deprecation")
public static String sanitizeInput(String input)
{
return ChatColor.stripColor(
Expand Down
Loading
Loading