playerDataAPI.loadPlayer(playerUUID)
.thenAccept(bountyPlayer -> {
if (bountyPlayer != null) {
sender.sendMessage("Loaded: " + bountyPlayer.getName());
} else {
sender.sendMessage("Player not found in database.");
}
})
.exceptionally(ex -> {
sender.sendMessage("Error loading player: " + ex.getMessage());
return null;
});
CompletableFuture<Void> savePlayer(UUID uuid);
playerDataAPI.savePlayer(playerUUID)
.thenRun(() -> {
sender.sendMessage("Player data saved!");
});
boolean isPlayerLoaded(UUID uuid);
if (playerDataAPI.isPlayerLoaded(playerUUID)) {
// Use synchronous getPlayer()
IBountyPlayer player = playerDataAPI.getPlayer(playerUUID);
} else {
// Load asynchronously
playerDataAPI.loadPlayer(playerUUID).thenAccept(player -> {
// Handle loaded player
});
}
CompletableFuture<Void> reloadAllData();
playerDataAPI.reloadAllData()
.thenRun(() -> {
sender.sendMessage("All player data reloaded!");
});
public interface IBountyPlayer {
/**
* Get the player's UUID
*/
UUID getUUID();
/**
* Get the player's name
*/
String getName();
/**
* Get the player's bounty data
*/
IBountyData getBountyData();
/**
* Check if the player is currently online
*/
boolean isOnline();
}
public interface IBountyData {
/**
* Get the player's UUID
*/
UUID getPlayerUUID();
/**
* Get current bounty amount
*/
double getBountyAmount();
/**
* Get formatted bounty string (e.g., "$1,000.00")
*/
String getFormattedBounty();
/**
* Get total number of bounties this player has set
*/
int getTotalBountiesSet();
/**
* Get total number of bounties this player has claimed
*/
int getTotalBountiesClaimed();
/**
* Get timestamp of last update
*/
long getLastUpdated();
}
public class PlayerStatsCommand implements CommandExecutor {
private final PlayerDataAPI playerDataAPI;
public PlayerStatsCommand(PlayerDataAPI playerDataAPI) {
this.playerDataAPI = playerDataAPI;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
if (args.length == 0) {
sender.sendMessage("Usage: /bountystats <player>");
return true;
}
String playerName = args[0];
Player onlinePlayer = Bukkit.getPlayer(playerName);
if (onlinePlayer != null) {
// Player is online - data should be cached
displayStats(sender, playerDataAPI.getPlayer(onlinePlayer.getUniqueId()));
} else {
// Player is offline - need to load from database
OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(playerName);
if (offlinePlayer.hasPlayedBefore()) {
playerDataAPI.loadPlayer(offlinePlayer.getUniqueId())
.thenAccept(data -> displayStats(sender, data))
.exceptionally(ex -> {
sender.sendMessage("Error: " + ex.getMessage());
return null;
});
} else {
sender.sendMessage("Player has never joined the server.");
}
}
return true;
}
private void displayStats(CommandSender sender, IBountyPlayer player) {
if (player == null) {
sender.sendMessage("No data found for this player.");
return;
}
IBountyData data = player.getBountyData();
sender.sendMessage("=== Stats for " + player.getName() + " ===");
sender.sendMessage("Current Bounty: " + data.getFormattedBounty());
sender.sendMessage("Bounties Set: " + data.getTotalBountiesSet());
sender.sendMessage("Bounties Claimed: " + data.getTotalBountiesClaimed());
sender.sendMessage("Online: " + (player.isOnline() ? "Yes" : "No"));
}
}