Skip to content

Commit

Permalink
Merge pull request #2580 from BentoBoxWorld/Abstract_out_paper_lib
Browse files Browse the repository at this point in the history
Abstract out paper lib
  • Loading branch information
tastybento authored Dec 29, 2024
2 parents f718b9b + 4a55ea7 commit da8ad2f
Show file tree
Hide file tree
Showing 18 changed files with 103 additions and 123 deletions.
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

0 comments on commit da8ad2f

Please sign in to comment.