Upload progress (See description)

(This is an upload for myself so I can continue coding from different machines because I commute betwen home and university.)

Contents:
    - Rewrite PlayerData. It is done but need to rewrite the usages of this class.
    - Rewrite Island class. This is still in progress.
    - First steps to add multiple database support

Disclaimer:  This upload contains syntax errors, you can't compile it, see the first lines why
This commit is contained in:
ceze88 2022-10-27 12:01:25 +02:00
parent cd57ce89e9
commit f1cafbbb6d
55 changed files with 1543 additions and 293 deletions

View File

@ -6,7 +6,7 @@
<groupId>com.songoda</groupId>
<artifactId>skyblock</artifactId>
<version>2.5.0</version>
<version>3.0.0-Dev</version>
<packaging>jar</packaging>
<properties>

View File

@ -6,6 +6,10 @@ import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.ServerProject;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.core.configuration.Config;
import com.songoda.core.database.DataMigrationManager;
import com.songoda.core.database.DatabaseConnector;
import com.songoda.core.database.MySQLConnector;
import com.songoda.core.database.SQLiteConnector;
import com.songoda.core.gui.GuiManager;
import com.songoda.core.hooks.HologramManager;
import com.songoda.core.hooks.LogManager;
@ -19,6 +23,15 @@ import com.songoda.skyblock.command.commands.SkyBlockCommand;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.confirmation.ConfirmationTask;
import com.songoda.skyblock.cooldown.CooldownManager;
import com.songoda.skyblock.database.DataManager;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.database.DatabaseType;
import com.songoda.skyblock.database.sources.FlatFileDataProvider;
import com.songoda.skyblock.database.sources.MariaDBDataProvider;
import com.songoda.skyblock.database.sources.MongoDBDataProvider;
import com.songoda.skyblock.database.sources.MySQLDataProvider;
import com.songoda.skyblock.database.sources.PostgreSQLDataProvider;
import com.songoda.skyblock.database.sources.SQLiteDataProvider;
import com.songoda.skyblock.economy.EconomyManager;
import com.songoda.skyblock.generator.GeneratorManager;
import com.songoda.skyblock.invite.InviteManager;
@ -123,6 +136,14 @@ public class SkyBlock extends SongodaPlugin {
private FileConfiguration stackables;
private FileConfiguration upgrades;
private DataManager dataManager;
private DatabaseConnector databaseConnector;
private DataMigrationManager dataMigrationManager;
private DataProvider dataProvider;
private DatabaseType databaseType;
@Override
public void onPluginLoad() {
INSTANCE = this;
@ -165,6 +186,42 @@ public class SkyBlock extends SongodaPlugin {
return;
}
//Database stuff
databaseType = DatabaseType.FLATFILE;
switch (databaseType) {
case MYSQL:
this.databaseConnector = new MySQLConnector(this, "localhost", 3306, "songoda", "Admin", "pass", false, 10);
dataProvider = new MySQLDataProvider(databaseConnector, this);
break;
case SQLITE:
databaseConnector = new SQLiteConnector(this);
dataProvider = new SQLiteDataProvider(databaseConnector, this);
break;
//TODO: Implement more database types
case MARIADB:
dataProvider = new MariaDBDataProvider();
break;
case MONGODB:
dataProvider = new MongoDBDataProvider();
break;
case POSTGRESQL:
dataProvider = new PostgreSQLDataProvider();
break;
default:
dataProvider = new FlatFileDataProvider();
break;
}
dataProvider.init(this);
dataManager = new DataManager(dataProvider, databaseType, this);
//TODO Run migrations for all database types
//this.dataMigrationManager = new DataMigrationManager();
//this.dataMigrationManager.runMigrations();
//Database stuff end
//Init stuff after database is ready to provide data
permissionManager = new PermissionManager(this);
localizationManager = new LocalizationManager();
worldManager.loadWorlds();
@ -185,6 +242,7 @@ public class SkyBlock extends SongodaPlugin {
structureManager = new StructureManager(this);
soundManager = new SoundManager(this);
if (this.config.getBoolean("Island.Generator.Enable")) {
generatorManager = new GeneratorManager(this);
}
@ -294,7 +352,7 @@ public class SkyBlock extends SongodaPlugin {
if (this.banManager != null)
this.banManager.onDisable();
if (this.playerDataManager != null)
this.playerDataManager.onDisable();
this.playerDataManager.save();
if (this.cooldownManager != null)
this.cooldownManager.onDisable();
if (this.hologramTask != null)
@ -345,6 +403,10 @@ public class SkyBlock extends SongodaPlugin {
}
}
public static String getTable(String table) {
return "fabledskyblock_"+table;
}
public String formatText(String string) {
return ChatColor.translateAlternateColorCodes('&', string);
}
@ -353,6 +415,18 @@ public class SkyBlock extends SongodaPlugin {
return fileManager;
}
public DatabaseConnector getDatabaseConnector() {
return databaseConnector;
}
public DataManager getDataManager() {
return dataManager;
}
public DatabaseType getdatabaseType() {
return databaseType;
}
public WorldManager getWorldManager() {
return worldManager;
}

View File

@ -23,11 +23,8 @@ import java.util.UUID;
public class Island {
private com.songoda.skyblock.island.Island handle;
private OfflinePlayer player;
public Island(com.songoda.skyblock.island.Island handle, OfflinePlayer player) {
public Island(com.songoda.skyblock.island.Island handle) {
this.handle = handle;
this.player = player;
}
/**
@ -465,7 +462,7 @@ public class Island {
*/
public void load() {
if (this.handle == null) {
SkyBlockAPI.getImplementation().getIslandManager().loadIsland(player);
SkyBlockAPI.getImplementation().getIslandManager().loadIsland();
this.handle = SkyBlockAPI.getImplementation().getIslandManager().getIsland(player);
}
}

View File

@ -15,7 +15,7 @@ public class CreateCommand extends SubCommand {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
playerDataManager.getPlayerData(player).setViewer(null);
}

View File

@ -30,7 +30,7 @@ public class GeneratorCommand extends SubCommand {
messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.Generator.Disabled.Message"));
soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F);
} else {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
playerDataManager.getPlayerData(player).setViewer(null);
}

View File

@ -30,7 +30,7 @@ public class UpgradeCommand extends SubCommand {
messageManager.sendMessage(player, configLoad.getString("Command.Island.Admin.Upgrade.Disabled.Message"));
soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F);
} else {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
playerDataManager.getPlayerData(player)
.setViewer(new Upgrade.Viewer(Upgrade.Viewer.Type.Upgrades, null));
Upgrade.getInstance().open(player);

View File

@ -22,8 +22,6 @@ import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.UUID;
@ -91,7 +89,8 @@ public class AcceptCommand extends SubCommand {
playerData.setPlaytime(0);
playerData.setOwner(invite.getOwnerUUID());
playerData.setMemberSince(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
playerData.setMemberSince(System.currentTimeMillis());
//playerData.setMemberSince(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
playerData.save();
island.setRole(IslandRole.Member, player.getUniqueId());
@ -127,7 +126,7 @@ public class AcceptCommand extends SubCommand {
for (Player loopPlayer : Bukkit.getOnlinePlayers()) {
if (!loopPlayer.getUniqueId().equals(player.getUniqueId())) {
if (playerDataManager.hasPlayerData(loopPlayer)) {
if (playerDataManager.isPlayerDataLoaded(loopPlayer)) {
playerData = playerDataManager.getPlayerData(loopPlayer);
if (playerData.getOwner() != null

View File

@ -63,7 +63,7 @@ public class ChatCommand extends SubCommand {
soundManager.playSound(player, CompatibleSound.BLOCK_NOTE_BLOCK_PLING.getSound(), 1.0F, 1.0F);
}
} else {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
if (playerData.getOwner() != null) {
island = plugin.getIslandManager().getIsland(player);
}

View File

@ -43,7 +43,7 @@ public class ConfirmCommand extends SubCommand {
ScoreboardManager scoreboardManager = plugin.getScoreboardManager();
Economy economy = plugin.getEconomyManager().getEconomy();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
Config config = fileManager.getConfig(new File(plugin.getDataFolder(), "language.yml"));

View File

@ -27,7 +27,7 @@ public class InformationCommand extends SubCommand {
IslandManager islandManager = plugin.getIslandManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Config config = plugin.getFileManager().getConfig(new File(plugin.getDataFolder(), "language.yml"));
FileConfiguration configLoad = config.getFileConfiguration();

View File

@ -152,7 +152,8 @@ public class KickCommand extends SubCommand {
playerData = playerDataManager.getPlayerData(targetPlayer);
playerData.setPlaytime(0);
playerData.setMemberSince(null);
//playerData.setMemberSince(null);
playerData.clearMemberSince();
playerData.setOwner(null);
playerData.setChat(false);
playerData.save();

View File

@ -26,7 +26,7 @@ public class LeaderboardCommand extends SubCommand {
Config config = fileManager.getConfig(new File(plugin.getDataFolder(), "language.yml"));
FileConfiguration configLoad = config.getFileConfiguration();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
if (args.length == 0) {
if (this.plugin.getConfiguration()
.getBoolean("Island.Visitor.Vote")) {

View File

@ -67,7 +67,8 @@ public class LeaveCommand extends SubCommand {
playerData.setPlaytime(0);
playerData.setOwner(null);
playerData.setMemberSince(null);
//playerData.setMemberSince(null);
playerData.clearMemberSince();
playerData.setChat(false);
playerData.save();

View File

@ -20,7 +20,7 @@ public class VisitCommand extends SubCommand {
SoundManager soundManager = plugin.getSoundManager();
if (args.length == 0) {
if (!plugin.getPlayerDataManager().hasPlayerData(player))
if (!plugin.getPlayerDataManager().isPlayerDataLoaded(player))
plugin.getPlayerDataManager().createPlayerData(player);
PlayerData playerData = plugin.getPlayerDataManager().getPlayerData(player);

View File

@ -83,7 +83,7 @@ public class VoteCommand extends SubCommand {
messageManager.sendMessage(player,
configLoad.getString("Command.Island.Vote.Island.Member.Message"));
soundManager.playSound(player, CompatibleSound.BLOCK_ANVIL_LAND.getSound(), 1.0F, 1.0F);
} else if (playerDataManager.hasPlayerData(player)) {
} else if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getIsland() != null && playerData.getIsland().equals(island.getOwnerUUID())) {

View File

@ -0,0 +1,71 @@
package com.songoda.skyblock.database;
import com.songoda.skyblock.SkyBlock;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class DataConverter {
/**
* Convert the old flatfile data to the new database system
* Replace ownerUUID with islandUUID. New system uses islandUUID instead of ownerUUID
*/
public static void updateData() {
//Load all player data
File islandsDirectory = new File(SkyBlock.getInstance().getDataFolder(), "player-data");
if (islandsDirectory.exists() && islandsDirectory.isDirectory()) {
List<String> players = new ArrayList<>();
for (File file : Objects.requireNonNull(islandsDirectory.listFiles())) {
if (file.getName().endsWith(".yml")) {
players.add(file.getName().split("\\.")[0]);
}
}
for (String player : players) {
File file = new File(islandsDirectory, player + ".yml");
if (file.exists()) {
FileConfiguration playerData = YamlConfiguration.loadConfiguration(file);
String island = playerData.getString("Island.Owner");
if (island != null) {
File islandFile = new File(SkyBlock.getInstance().getDataFolder(), "islands/" + island + ".yml");
FileConfiguration islandData = YamlConfiguration.loadConfiguration(islandFile);
islandData.set("Owner", player);
String islandUUID = islandData.getString("UUID");
//Delete UUID, File name will be the UUID
islandData.set("UUID", null);
//Save changes
try {
islandData.save(new File(SkyBlock.getInstance().getDataFolder(), "island-data/" + islandUUID + ".yml"));
} catch (Exception e) {
e.printStackTrace();
}
//Rename file
file.renameTo(new File(islandsDirectory, islandUUID + ".yml"));
playerData.set("Island.UUID", islandUUID);
playerData.set("Island.Owner", null);
playerData.set("Island.Biome", null);
//Moved to island data
playerData.set("Bank", null);
try {
playerData.save(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
//Make it async, kick all players and prevent joining until it's done
public static void convertTadabase(DatabaseType current, DatabaseType target) {
//TODO
}
}

View File

@ -0,0 +1,56 @@
package com.songoda.skyblock.database;
import com.eatthepath.uuid.FastUUID;
import com.songoda.core.database.DataManagerAbstract;
import com.songoda.core.database.DatabaseConnector;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.island.IslandManager;
import com.songoda.skyblock.playerdata.PlayerData;
import com.songoda.skyblock.playerdata.PlayerDataManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
public class DataManager {
private final PlayerDataManager playerDataManager;
private final IslandManager islandManager;
private final DataProvider dataProvider;
private final DatabaseType databaseType;
public DataManager(DataProvider provider, DatabaseType type, Plugin plugin) {
this.dataProvider = provider;
this.islandManager = new IslandManager((SkyBlock) plugin);
this.playerDataManager = new PlayerDataManager((SkyBlock) plugin);
this.databaseType = type;
}
public void loadOnline() {
for (Player player : Bukkit.getOnlinePlayers()) {
dataProvider.loadPlayerData(player);
dataProvider.loadIsland(playerDataManager.getPlayerData(player).getIsland());
}
}
public void save() {
islandManager.onDisable();
playerDataManager.save();
}
public DataProvider getDataProvider() {
return dataProvider;
}
public DatabaseType getDatabaseType() {
return databaseType;
}
}

View File

@ -0,0 +1,262 @@
package com.songoda.skyblock.database;
import com.bekvon.bukkit.residence.commands.check;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.exceptions.NoIslandDataException;
import com.songoda.skyblock.database.exceptions.NoPlayerDataException;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.UUID;
public interface DataProvider {
void init(SkyBlock plugin);
/**
* Check if a player has data in the database
* @param player The player to check
*/
default boolean hasPlayerData(Player player) {
return hasPlayerData(player.getUniqueId());
}
/**
* Check if a player has data in the database
* @param player The player to check
*/
default boolean hasPlayerData(OfflinePlayer player) {
return hasPlayerData(player.getUniqueId());
}
/**
* Check if a player has data in the database
* @param playerUUID The player's UUID to check
*/
boolean hasPlayerData(UUID playerUUID);
/**
* Load a player's data from the database into memory
* @param player The player to load
* @throws NoPlayerDataException when the player has no data in the database
*/
default PlayerData loadPlayerData(Player player) {
return loadPlayerData(player.getUniqueId());
}
/**
* Load a player's data from the database into memory
* @param offlinePlayer The player to load
* @throws NoPlayerDataException when the player has no data in the database
*/
default PlayerData loadPlayerData(OfflinePlayer offlinePlayer) {
return loadPlayerData(offlinePlayer.getUniqueId());
}
/**
* Load a player's data from the database into memory
* @param playerUUID The player's UUID
* @throws NoPlayerDataException when the player has no data in the database
*/
PlayerData loadPlayerData(UUID playerUUID);
/**
* Check if a player's data is loaded in memory
* @param player Player to check
* @return true if loaded false otherwise
*/
default boolean isPlayerDataLoaded(Player player) {
return isPlayerDataLoaded(player.getUniqueId());
}
/**
* Check if a player's data is loaded in memory
* @param player Player to check
* @return true if loaded false otherwise
*/
default boolean isPlayerDataLoaded(OfflinePlayer player) {
return isPlayerDataLoaded(player.getUniqueId());
}
/**
* Check if a player's data is loaded in memory
* @param playerUUID Player's UUID to check
* @return true if loaded false otherwise
*/
boolean isPlayerDataLoaded(UUID playerUUID);
/**
* Get a player's data from memory
* @param player Player to get its data
*/
default PlayerData getPlayerData(Player player) {
return getPlayerData(player.getUniqueId());
}
/**
* Get a player's data from memory
* @param player Player to get its data
*/
default PlayerData getPlayerData(OfflinePlayer player) {
return getPlayerData(player.getUniqueId());
}
/**
* Get a player's data from memory
* @param playerUUID Player's UUID to get its data
*/
PlayerData getPlayerData(UUID playerUUID);
/**
* unload a player's data from memory without saving
* @param player The player to unload its data from memory
*/
default void unloadPlayerData(Player player) {
unloadPlayerData(player.getUniqueId());
}
/**
* unload a player's data from memory without saving
* @param player The player to unload its data from memory
*/
default void unloadPlayerData(OfflinePlayer player) {
unloadPlayerData(player.getUniqueId());
}
/**
* unload a player's data from memory without saving
* @param playerUUID The player's UUID to unload its data from memory
*/
void unloadPlayerData(UUID playerUUID);
/**
* Creates the player's data in the database
* @param player The player to create its data
*/
default void createPlayerData(Player player) {
createPlayerData(player.getUniqueId());
}
/**
* Creates the player's data in the database
* @param player The player to create its data
*/
default void createPlayerData(OfflinePlayer player) {
createPlayerData(player.getUniqueId());
}
/**
* Creates the player's data in the database
* @param playerUUID The player to create its data
*/
void createPlayerData(UUID playerUUID);
/**
* Save a player's data to the database from memory
* @param playerData The player's data to save
*/
void savePlayerData(PlayerData playerData);
/**
* Save a player's data to the database from memory
* If the player's data is not cached in memory, it won't save anything
* @param player The player to save its data to the database
*/
default void savePlayerData(Player player) {
savePlayerData(player.getUniqueId());
}
/**
* Save a player's data to the database from memory
* If the player's data is not cached in memory, it won't save anything
* @param offlinePlayer The player to save its data to the database
*/
default void savePlayerData(OfflinePlayer offlinePlayer) {
savePlayerData(offlinePlayer.getUniqueId());
}
/**
* Save a player's data to the database from memory
* If the player's data is not cached in memory, it won't save anything
* @param playerUUID The player's UUID to save its data to the database
*/
default void savePlayerData(UUID playerUUID) {
if (isPlayerDataLoaded(playerUUID)) {
savePlayerData(loadPlayerData(playerUUID));
}
}
/**
* @return all loaded player data
*/
Set<PlayerData> getLoadedPlayers();
/**
* Check if an island has data in the database
* @param islandUUID The island's UUID to check
*/
boolean hasIslandData(UUID islandUUID);
/**
* Load an island from the database
* @param islandUUID The island to load by UUID
* @throws NoIslandDataException if the island does not exist in the database
*/
Island loadIsland(UUID islandUUID);
/**
* Checks if the island is cached in memory
* @param islandUUID The island's UUID to check
*/
boolean isIslandDataLoaded(UUID islandUUID);
/**
* Get an island from memory
* @param islandUUID The island's UUID to get
* @return The island if it is loaded in memory, null otherwise
*/
Island getIsland(UUID islandUUID);
/**
* Unload an island from memory without saving
* @param island The island to unload
*/
default void unloadIslandData(Island island) {
unloadIslandData(island.getIslandUUID());
}
/**
* Unload an island from memory without saving
* @param islandUUID The island's UUID to unload
*/
void unloadIslandData(UUID islandUUID);
/**
* Creates the island's data in the database if it does not exist
* @param islandUUID The island's UUID to create
*/
void createIslandData(UUID islandUUID);
/**
* Save an island to the database from memory
* @param island The island to save
*/
default void saveIsland(Island island) {
saveIsland(island.getIslandUUID());
}
/**
* Save an island to the database from memory
* @param islandUUID The island to save by UUID
*/
void saveIsland(UUID islandUUID);
/**
* @return all loaded island data
*/
Set<Island> getLoadedIslands();
}

View File

@ -0,0 +1,12 @@
package com.songoda.skyblock.database;
public enum DatabaseType {
POSTGRESQL,
MARIADB,
MONGODB,
MYSQL,
SQLITE,
FLATFILE
}

View File

@ -0,0 +1,8 @@
package com.songoda.skyblock.database.exceptions;
public class NoIslandDataException extends Exception {
public NoIslandDataException() {
super("Island data does not exist in the database");
}
}

View File

@ -0,0 +1,8 @@
package com.songoda.skyblock.database.exceptions;
public class NoPlayerDataException extends Exception {
public NoPlayerDataException() {
super("Player data does not exist in the database");
}
}

View File

@ -0,0 +1,70 @@
package com.songoda.skyblock.database.migration;
import com.songoda.core.database.DataMigration;
import com.songoda.core.database.MySQLConnector;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
public class _1_InitialMigration extends DataMigration {
public _1_InitialMigration() {
super(1);
}
@Override
public void migrate(Connection connection, String tablePrefix) throws SQLException {
// Create islands table
try (Statement statement = connection.createStatement()) {
statement.execute("CREATE TABLE IF NOT EXISTS " + tablePrefix + " `islands` (" +
"`uuid` INT(11) NOT NULL," +
"`owner` VARCHAR(36) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"`originalOwner` VARCHAR(36) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"`structure` VARCHAR(100) NOT NULL DEFAULT 'Default' COLLATE 'utf8mb4_general_ci'," +
"`size` INT(11) NOT NULL DEFAULT '51'," +
"`biome` VARCHAR(50) NOT NULL DEFAULT 'PLAINS' COLLATE 'utf8mb4_general_ci'," +
"`status` VARCHAR(11) NOT NULL DEFAULT 'WHITELISTED' COLLATE 'utf8mb4_general_ci'," +
"`border` BIT(1) NOT NULL DEFAULT b'1'," +
"`borderColor` VARCHAR(15) NOT NULL DEFAULT 'Blue' COLLATE 'utf8mb4_general_ci'," +
"`weatherSync` BIT(1) NOT NULL DEFAULT b'1'," +
"`weatherTime` INT(11) NOT NULL DEFAULT '6000'," +
"`weatherType` VARCHAR(15) NOT NULL DEFAULT 'CLEAR' COLLATE 'utf8mb4_general_ci'," +
"`maxMembers` INT(11) NOT NULL DEFAULT '3'," +
"`transactionHistory` BLOB NULL DEFAULT NULL," +
"PRIMARY KEY (`uuid`) USING BTREE" +
")" +
"COLLATE='utf8mb4_general_ci'" +
"ENGINE=InnoDB" +
";");
//players table
statement.execute("CREATE TABLE IF NOT EXISTS " + tablePrefix + " `players` (" +
"`uuid` VARCHAR(36) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"`island` VARCHAR(36) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"`textureSignature` MEDIUMTEXT NOT NULL DEFAULT 'K9P4tCIENYbNpDuEuuY0shs1x7iIvwXi4jUUVsATJfwsAIZGS+9OZ5T2HB0tWBoxRvZNi73Vr+syRdvTLUWPusVXIg+2fhXmQoaNEtnQvQVGQpjdQP0TkZtYG8PbvRxE6Z75ddq+DVx/65OSNHLWIB/D+Rg4vINh4ukXNYttn9QvauDHh1aW7/IkIb1Bc0tLcQyqxZQ3mdglxJfgIerqnlA++Lt7TxaLdag4y1NhdZyd3OhklF5B0+B9zw/qP8QCzsZU7VzJIcds1+wDWKiMUO7+60OSrIwgE9FPamxOQDFoDvz5BOULQEeNx7iFMB+eBYsapCXpZx0zf1bduppBUbbVC9wVhto/J4tc0iNyUq06/esHUUB5MHzdJ0Y6IZJAD/xIw15OLCUH2ntvs8V9/cy5/n8u3JqPUM2zhUGeQ2p9FubUGk4Q928L56l3omRpKV+5QYTrvF+AxFkuj2hcfGQG3VE2iYZO6omXe7nRPpbJlHkMKhE8Xvd1HP4PKpgivSkHBoZ92QEUAmRzZydJkp8CNomQrZJf+MtPiNsl/Q5RQM+8CQThg3+4uWptUfP5dDFWOgTnMdA0nIODyrjpp+bvIJnsohraIKJ7ZDnj4tIp4ObTNKDFC/8j8JHz4VCrtr45mbnzvB2DcK8EIB3JYT7ElJTHnc5BKMyLy5SKzuw=' COLLATE 'utf8mb4_general_ci'," +
"`textureValue` MEDIUMTEXT NOT NULL DEFAULT 'eyJ0aW1lc3RhbXAiOjE1MjkyNTg0MTE4NDksInByb2ZpbGVJZCI6Ijg2NjdiYTcxYjg1YTQwMDRhZjU0NDU3YTk3MzRlZWQ3IiwicHJvZmlsZU5hbWUiOiJTdGV2ZSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxYzc3Y2U4ZTU0OTI1YWI1ODEyNTQ0NmVjNTNiMGNkZDNkMGNhM2RiMjczZWI5MDhkNTQ4Mjc4N2VmNDAxNiJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc2N2Q0ODMyNWVhNTMyNDU2MTQwNmI4YzgyYWJiZDRlMjc1NWYxMTE1M2NkODVhYjA1NDVjYzIifX19' COLLATE 'utf8mb4_general_ci'," +
"`playTime` INT(10) UNSIGNED NOT NULL DEFAULT '0'," +
"`joinTime` TIMESTAMP NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp()," +
"`chatSpy` BIT(1) NOT NULL DEFAULT b'0'," +
"`spiedIslands` BLOB NULL DEFAULT NULL," +
"PRIMARY KEY (`uuid`) USING BTREE" +
")" +
"COLLATE='utf8mb4_general_ci'" +
"ENGINE=InnoDB" +
";");
//Player cache table
statement.execute("CREATE TABLE IF NOT EXISTS " + tablePrefix + " `players_cache` (" +
"`uuid` VARCHAR(36) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"`name` VARCHAR(16) NOT NULL COLLATE 'utf8mb4_general_ci'," +
"PRIMARY KEY (`uuid`) USING BTREE" +
")" +
"COLLATE='utf8mb4_general_ci'" +
"ENGINE=InnoDB" +
";");
}
}
}

View File

@ -0,0 +1,125 @@
package com.songoda.skyblock.database.sources;
import com.eatthepath.uuid.FastUUID;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.database.exceptions.NoPlayerDataException;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
public class FlatFileDataProvider implements DataProvider {
private SkyBlock plugin;
private Map<UUID, PlayerData> playerDataStorage;
private Map<UUID, Island> islandStorage;
@Override
public void init(SkyBlock plugin) {
this.plugin = plugin;
this.playerDataStorage = new HashMap<>();
this.islandStorage = new HashMap<>();
}
@Override
public boolean hasPlayerData(UUID player) {
File file = new File(new File(plugin.getDataFolder().toString() + "/player-data"), FastUUID.toString(player) + ".yml");
return file.exists();
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
File data = new File(new File(plugin.getDataFolder().toString() + "/player-data"), FastUUID.toString(playerUUID) + ".yml");
if (data.exists()) {
PlayerData playerData = new PlayerData(playerUUID);
playerDataStorage.put(playerUUID, playerData);
return playerData;
}
try {
throw new NoPlayerDataException();
} catch (NoPlayerDataException e) {
throw new RuntimeException(e);
}
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return playerDataStorage.containsKey(playerUUID);
}
@Override
public void unloadPlayerData(UUID playerUUID) {
playerDataStorage.remove(playerUUID);
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public void savePlayerData(UUID playerUUID) {
savePlayerData(playerDataStorage.get(playerUUID));
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return new HashSet<>(playerDataStorage.values());
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return islandStorage.containsKey(islandUUID);
}
@Override
public void unloadIslandData(UUID islandUUID) {
islandStorage.remove(islandUUID);
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(Island island) {
saveIsland(island.getIslandUUID());
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return new HashSet<>(islandStorage.values());
}
}

View File

@ -0,0 +1,99 @@
package com.songoda.skyblock.database.sources;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.UUID;
public class MariaDBDataProvider implements DataProvider {
@Override
public void init(SkyBlock plugin) {
}
@Override
public boolean hasPlayerData(UUID playerUUID) {
return false;
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
return null;
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return false;
}
@Override
public PlayerData getPlayerData(UUID playerUUID) {
return null;
}
@Override
public void unloadPlayerData(UUID playerUUID) {
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return null;
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return false;
}
@Override
public Island getIsland(UUID islandUUID) {
return null;
}
@Override
public void unloadIslandData(UUID islandUUID) {
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return null;
}
}

View File

@ -0,0 +1,100 @@
package com.songoda.skyblock.database.sources;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.UUID;
public class MongoDBDataProvider implements DataProvider {
@Override
public void init(SkyBlock plugin) {
}
@Override
public boolean hasPlayerData(UUID playerUUID) {
return false;
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
return null;
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return false;
}
@Override
public PlayerData getPlayerData(UUID playerUUID) {
return null;
}
@Override
public void unloadPlayerData(UUID playerUUID) {
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return null;
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return false;
}
@Override
public Island getIsland(UUID islandUUID) {
return null;
}
@Override
public void unloadIslandData(UUID islandUUID) {
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return null;
}
}

View File

@ -0,0 +1,109 @@
package com.songoda.skyblock.database.sources;
import com.songoda.core.database.DataManagerAbstract;
import com.songoda.core.database.DatabaseConnector;
import com.songoda.core.database.MySQLConnector;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import javax.sql.DataSource;
import java.util.Set;
import java.util.UUID;
public class MySQLDataProvider extends DataManagerAbstract implements DataProvider {
public MySQLDataProvider(DatabaseConnector databaseConnector, Plugin plugin) {
super(databaseConnector, plugin);
}
@Override
public void init(SkyBlock plugin) {
}
@Override
public boolean hasPlayerData(UUID playerUUID) {
return false;
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
return null;
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return false;
}
@Override
public PlayerData getPlayerData(UUID playerUUID) {
return null;
}
@Override
public void unloadPlayerData(UUID playerUUID) {
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return null;
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return false;
}
@Override
public Island getIsland(UUID islandUUID) {
return null;
}
@Override
public void unloadIslandData(UUID islandUUID) {
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return null;
}
}

View File

@ -0,0 +1,101 @@
package com.songoda.skyblock.database.sources;
import com.songoda.core.database.DataManagerAbstract;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import java.util.Set;
import java.util.UUID;
public class PostgreSQLDataProvider implements DataProvider {
@Override
public void init(SkyBlock plugin) {
}
@Override
public boolean hasPlayerData(UUID playerUUID) {
return false;
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
return null;
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return false;
}
@Override
public PlayerData getPlayerData(UUID playerUUID) {
return null;
}
@Override
public void unloadPlayerData(UUID playerUUID) {
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return null;
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return false;
}
@Override
public Island getIsland(UUID islandUUID) {
return null;
}
@Override
public void unloadIslandData(UUID islandUUID) {
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return null;
}
}

View File

@ -0,0 +1,107 @@
package com.songoda.skyblock.database.sources;
import com.songoda.core.database.DataManagerAbstract;
import com.songoda.core.database.DatabaseConnector;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.playerdata.PlayerData;
import org.bukkit.OfflinePlayer;
import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin;
import java.util.Set;
import java.util.UUID;
public class SQLiteDataProvider extends DataManagerAbstract implements DataProvider {
public SQLiteDataProvider(DatabaseConnector databaseConnector, Plugin plugin) {
super(databaseConnector, plugin);
}
@Override
public void init(SkyBlock plugin) {
}
@Override
public boolean hasPlayerData(UUID playerUUID) {
return false;
}
@Override
public PlayerData loadPlayerData(UUID playerUUID) {
return null;
}
@Override
public boolean isPlayerDataLoaded(UUID playerUUID) {
return false;
}
@Override
public PlayerData getPlayerData(UUID playerUUID) {
return null;
}
@Override
public void unloadPlayerData(UUID playerUUID) {
}
@Override
public void createPlayerData(UUID playerUUID) {
}
@Override
public void savePlayerData(PlayerData playerData) {
}
@Override
public Set<PlayerData> getLoadedPlayers() {
return null;
}
@Override
public boolean hasIslandData(UUID islandUUID) {
return false;
}
@Override
public Island loadIsland(UUID islandUUID) {
return null;
}
@Override
public boolean isIslandDataLoaded(UUID islandUUID) {
return false;
}
@Override
public Island getIsland(UUID islandUUID) {
return null;
}
@Override
public void unloadIslandData(UUID islandUUID) {
}
@Override
public void createIslandData(UUID islandUUID) {
}
@Override
public void saveIsland(UUID islandUUID) {
}
@Override
public Set<Island> getLoadedIslands() {
return null;
}
}

View File

@ -148,7 +148,7 @@ public class GuiCoop extends Gui {
} else {
targetPlayerName = targetPlayer.getName();
if (playerDataManager.hasPlayerData(targetPlayer)) {
if (playerDataManager.isPlayerDataLoaded(targetPlayer)) {
targetPlayerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture();
} else {
targetPlayerTexture = new String[]{null, null};

View File

@ -106,7 +106,7 @@ public class GuiBans extends Gui {
} else {
targetPlayerName = targetPlayer.getName();
if (playerDataManager.hasPlayerData(targetPlayer)) {
if (playerDataManager.isPlayerDataLoaded(targetPlayer)) {
targetPlayerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture();
} else {
targetPlayerTexture = new String[]{null, null};

View File

@ -11,6 +11,7 @@ import com.songoda.skyblock.api.utils.APIUtil;
import com.songoda.skyblock.ban.Ban;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.database.exceptions.NoIslandDataException;
import com.songoda.skyblock.message.MessageManager;
import com.songoda.skyblock.permission.BasicPermission;
import com.songoda.skyblock.playerdata.PlayerData;
@ -26,12 +27,15 @@ import org.bukkit.OfflinePlayer;
import org.bukkit.WeatherType;
import org.bukkit.block.Biome;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import javax.annotation.Nonnull;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;
import java.util.Map.Entry;
@ -47,11 +51,65 @@ public class Island {
private UUID islandUUID;
private UUID ownerUUID;
//TODO change owner to island UUID
private final IslandLevel level;
private IslandStatus status;
private int size;
private int maxMembers;
private boolean deleted = false;
private Biome biome;
private boolean isWeatherSynced;
private int islandTime;
private FileConfiguration islandData;
public Island(UUID islandUUID) {
this.plugin = SkyBlock.getInstance();
this.islandUUID = islandUUID;
switch (plugin.getDataManager().getDatabaseType()) {
case POSTGRESQL:
case MARIADB:
case MYSQL:
case SQLITE:
try (Connection connection = plugin.getDatabaseConnector().getConnection()) {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + SkyBlock.getTable("islands")+ " WHERE uuid = ?");
statement.setString(1, FastUUID.toString(islandUUID));
ResultSet data = statement.executeQuery();
if (data.next()) {
this.ownerUUID = FastUUID.parseUUID(data.getString("owner"));
this.status = IslandStatus.valueOf(data.getString("status"));
this.size = data.getInt("size");
this.maxMembers = data.getInt("maxMembers");
this.biome = CompatibleBiome.getBiome(data.getString("biome")).getBiome();
} else {
throw new NoIslandDataException();
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case MONGODB:
throw new RuntimeException("MongoDB is not supported yet");
//Flatfile
default:
File dataFile = new File(new File(plugin.getDataFolder().toString() + "/island-data"), FastUUID.toString(islandUUID) + ".yml");
this.islandData = YamlConfiguration.loadConfiguration(dataFile);
break;
}
this.ownerUUID = FastUUID.parseUUID(data.getString("owner"));
this.size = data.getInt("size");
if (size > 1000 || size < 0) {
size = 51;
}
this.level = new IslandLevel(ownerUUID, plugin);
this.apiWrapper = new com.songoda.skyblock.api.island.Island(this);
}
public Island(@Nonnull OfflinePlayer player) {
this.plugin = SkyBlock.getInstance();
@ -64,7 +122,7 @@ public class Island {
this.maxMembers = this.plugin.getConfiguration().getInt("Island.Member.Capacity", 3);
if (this.size > 1000) {
this.size = 50;
this.size = 51;
}
if (player.isOnline()) {
@ -254,14 +312,15 @@ public class Island {
Player onlinePlayer = Bukkit.getServer().getPlayer(ownerUUID);
if (!plugin.getPlayerDataManager().hasPlayerData(onlinePlayer)) {
if (!plugin.getPlayerDataManager().isPlayerDataLoaded(onlinePlayer)) {
plugin.getPlayerDataManager().createPlayerData(onlinePlayer);
}
PlayerData playerData = plugin.getPlayerDataManager().getPlayerData(onlinePlayer);
playerData.setPlaytime(0);
playerData.setOwner(ownerUUID);
playerData.setMemberSince(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
//playerData.setMemberSince(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
playerData.setMemberSince(System.currentTimeMillis());
playerData.save();
}
@ -283,7 +342,7 @@ public class Island {
save();
this.apiWrapper = new com.songoda.skyblock.api.island.Island(this, player);
this.apiWrapper = new com.songoda.skyblock.api.island.Island(this);
}
public UUID getIslandUUID() {

View File

@ -100,6 +100,14 @@ public class IslandManager {
}
}
public synchronized void addIsland(Island island) {
islandStorage.put(island.getOwnerUUID(), island);
}
public synchronized void removeIsland(Island island) {
islandStorage.remove(island.getOwnerUUID());
}
public synchronized void saveNextAvailableLocation(IslandWorld world) {
FileManager fileManager = plugin.getFileManager();
Config config = fileManager.getConfig(new File(plugin.getDataFolder(), "worlds.yml"));
@ -201,7 +209,7 @@ public class IslandManager {
PlayerData data = plugin.getPlayerDataManager().getPlayerData(player);
long amt = 0;
int amt = 0;
if (data != null) {
final int highest = PlayerUtil.getNumberFromPermission(player, "fabledskyblock.limit.create", true, 2);
@ -541,13 +549,13 @@ public class IslandManager {
if (player != null) {
long amt = 0;
int amt = 0;
final int highest = PlayerUtil.getNumberFromPermission(player, "fabledskyblock.limit.delete", true, 1);
if ((amt = data.getIslandDeletionCount()) >= highest) return false;
data.setIslandDeletionCount(amt + 1);
data.deleteTransactions();
//data.deleteTransactions();
}
}
}
@ -574,10 +582,11 @@ public class IslandManager {
if ((island.hasRole(IslandRole.Member, player.getUniqueId()) ||
island.hasRole(IslandRole.Operator, player.getUniqueId()) ||
island.hasRole(IslandRole.Owner, player.getUniqueId())) &&
playerDataManager.hasPlayerData(player)) {
playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
playerData.setOwner(null);
playerData.setMemberSince(null);
//playerData.setMemberSince(null);
playerData.clearMemberSince();
playerData.setChat(false);
playerData.save();
@ -1293,7 +1302,7 @@ public class IslandManager {
Player player = offlinePlayer.getPlayer();
if (offlinePlayer.isOnline() && player != null) {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getOwner() != null && islandStorage.containsKey(playerData.getOwner())) {
@ -1413,7 +1422,7 @@ public class IslandManager {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getIsland() != null) {
@ -1430,7 +1439,7 @@ public class IslandManager {
public boolean isPlayerAtAnIsland(Player player) {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
return playerData.getIsland() != null;

View File

@ -34,7 +34,7 @@ public class ChatListeners implements Listener {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
Island island = null;

View File

@ -3,8 +3,6 @@ package com.songoda.skyblock.listeners;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.cooldown.CooldownManager;
import com.songoda.skyblock.cooldown.CooldownType;
import com.songoda.skyblock.island.Island;
@ -24,7 +22,6 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import java.io.File;
import java.lang.reflect.Method;
public class JoinListeners implements Listener {
@ -74,7 +71,7 @@ public class JoinListeners implements Listener {
playerDataManager.loadPlayerData(player);
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
String[] playerTexture;
try {

View File

@ -3,8 +3,6 @@ package com.songoda.skyblock.listeners;
import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.core.compatibility.ServerVersion;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.island.*;
import com.songoda.skyblock.message.MessageManager;
import com.songoda.skyblock.permission.PermissionManager;
@ -15,7 +13,6 @@ import com.songoda.skyblock.utils.world.LocationUtil;
import com.songoda.skyblock.world.WorldManager;
import io.papermc.lib.PaperLib;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.attribute.Attribute;
@ -28,7 +25,6 @@ import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.potion.PotionEffect;
import java.io.File;
import java.util.Objects;
public class MoveListeners implements Listener {
@ -68,7 +64,7 @@ public class MoveListeners implements Listener {
messageManager.sendMessage(player, configLoad.getString("Island.World.Message").replace(configLoad.getString("Island.World.Word." + world.name()), world.name()));
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getIsland() != null) {
@ -87,7 +83,7 @@ public class MoveListeners implements Listener {
}
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getIsland() != null) {

View File

@ -51,7 +51,8 @@ public class QuitListeners implements Listener {
PlayerData playerData = playerDataManager.getPlayerData(player);
try {
playerData.setLastOnline(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
//playerData.setLastOnline(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()));
playerData.setLastOnline(System.currentTimeMillis());
} catch (Exception ignored) {}
Island island = islandManager.getIsland(player);

View File

@ -7,8 +7,6 @@ import com.songoda.skyblock.api.event.player.PlayerIslandEnterEvent;
import com.songoda.skyblock.api.event.player.PlayerIslandExitEvent;
import com.songoda.skyblock.api.event.player.PlayerIslandSwitchEvent;
import com.songoda.skyblock.api.island.Island;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.island.IslandManager;
import com.songoda.skyblock.island.IslandStatus;
import com.songoda.skyblock.island.IslandWorld;
@ -30,7 +28,6 @@ import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import java.io.File;
import java.util.UUID;
public class TeleportListeners implements Listener {
@ -88,7 +85,7 @@ public class TeleportListeners implements Listener {
return;
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
com.songoda.skyblock.island.Island island = islandManager.getIslandAtLocation(event.getTo());

View File

@ -48,14 +48,14 @@ public class Bans {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
Island island = plugin.getIslandManager().getIsland(player);
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData1 = playerDataManager.getPlayerData(player);
Island island1 = islandManager.getIsland(player);
@ -206,7 +206,7 @@ public class Bans {
} else {
targetPlayerName = targetPlayer.getName();
if (playerDataManager.hasPlayerData(targetPlayer)) {
if (playerDataManager.isPlayerDataLoaded(targetPlayer)) {
targetPlayerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture();
} else {
targetPlayerTexture = new String[]{null, null};

View File

@ -15,7 +15,6 @@ import com.songoda.skyblock.permission.PermissionManager;
import com.songoda.skyblock.placeholder.Placeholder;
import com.songoda.skyblock.playerdata.PlayerDataManager;
import com.songoda.skyblock.sound.SoundManager;
import com.songoda.core.utils.NumberUtils;
import com.songoda.skyblock.utils.NumberUtil;
import com.songoda.skyblock.utils.item.nInventoryUtil;
import com.songoda.skyblock.utils.version.SBiome;
@ -28,8 +27,6 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemFlag;
import org.bukkit.inventory.ItemStack;
import java.io.File;
public class Biome {
private static Biome instance;
@ -53,7 +50,7 @@ public class Biome {
BiomeManager biomeManager = plugin.getBiomeManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration langConfig = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {

View File

@ -51,7 +51,7 @@ public class Information {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getViewer() != null) {
@ -110,7 +110,7 @@ public class Information {
if (viewer.getType() == Information.Viewer.Type.Categories) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData13 = playerDataManager.getPlayerData(player);
ItemStack is = event.getItem();
@ -260,7 +260,7 @@ public class Information {
Bukkit.getServer().getScheduler().runTask(plugin, () -> nInv.open());
} else if (viewer.getType() == Information.Viewer.Type.Members) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData1 = playerDataManager.getPlayerData(player);
ItemStack is = event.getItem();
@ -419,7 +419,7 @@ public class Information {
Bukkit.getServer().getScheduler().runTask(plugin, () -> nInv.open());
} else if (viewer.getType() == Information.Viewer.Type.Visitors) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData12 = playerDataManager.getPlayerData(player);
ItemStack is = event.getItem();

View File

@ -52,7 +52,7 @@ public class Leaderboard {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration configLoad = plugin.getLanguage();
Viewer viewer = (Viewer) playerDataManager.getPlayerData(player).getViewer();
@ -60,7 +60,7 @@ public class Leaderboard {
nInventoryUtil nInv;
if (viewer.getType() == Viewer.Type.Browse) {
nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
ItemStack is = event.getItem();
if ((is.getType() == CompatibleMaterial.OAK_FENCE_GATE.getMaterial()) && (is.hasItemMeta())
@ -148,7 +148,7 @@ public class Leaderboard {
} else {
nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
ItemStack is = event.getItem();
if ((is.getType() == CompatibleMaterial.OAK_FENCE_GATE.getMaterial()) && (is.hasItemMeta())) {
@ -255,7 +255,7 @@ public class Leaderboard {
} else {
playerName = targetPlayer.getName();
if (playerDataManager.hasPlayerData(targetPlayer)) {
if (playerDataManager.isPlayerDataLoaded(targetPlayer)) {
playerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture();
} else {
playerTexture = new String[] {null, null};

View File

@ -60,7 +60,7 @@ public class Levelling {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (!playerDataManager.hasPlayerData(player))
if (!playerDataManager.isPlayerDataLoaded(player))
return;
PlayerData playerData = plugin.getPlayerDataManager().getPlayerData(player);
@ -74,7 +74,7 @@ public class Levelling {
return;
}
if (!playerDataManager.hasPlayerData(player))
if (!playerDataManager.isPlayerDataLoaded(player))
return;
ItemStack is = event.getItem();

View File

@ -52,11 +52,11 @@ public class Members {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getType() == null || playerData.getSort() == null) {

View File

@ -47,11 +47,11 @@ public class Ownership {
IslandManager islandManager = plugin.getIslandManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = plugin.getPlayerDataManager().getPlayerData(player);
Island island = islandManager.getIsland(player);
@ -102,7 +102,7 @@ public class Ownership {
Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> {
AnvilGui gui = new AnvilGui(player);
gui.setAction(event1 -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island1 = islandManager.getIsland(player);
if (island1 == null) {
@ -176,7 +176,7 @@ public class Ownership {
Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> {
AnvilGui gui = new AnvilGui(player);
gui.setAction(event1 -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island12 = islandManager.getIsland(player);
if (island12 == null) {

View File

@ -54,7 +54,7 @@ public class Settings {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island = islandManager.getIsland(player);
FileConfiguration mainConfig = plugin.getConfiguration();
@ -62,7 +62,7 @@ public class Settings {
if (menuType == Settings.Type.Categories) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island13 = islandManager.getIsland(player);
if (island13 == null) {
@ -226,7 +226,7 @@ public class Settings {
Bukkit.getServer().getScheduler().runTask(plugin, () -> nInv.open());
} else if (menuType == Settings.Type.Role && role != null) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island14 = islandManager.getIsland(player);
if (island14 == null) {
@ -1032,7 +1032,7 @@ public class Settings {
} else if (menuType == Settings.Type.Panel) {
if (panel == Settings.Panel.Welcome) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island15 = islandManager.getIsland(player);
if (island15 == null) {
@ -1279,7 +1279,7 @@ public class Settings {
Bukkit.getServer().getScheduler().runTask(plugin, () -> nInv.open());
} else if (panel == Settings.Panel.Signature) {
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island12 = islandManager.getIsland(player);
if (island12 == null) {

View File

@ -7,7 +7,6 @@ import com.songoda.core.hooks.economies.Economy;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.api.event.island.IslandUpgradeEvent;
import com.songoda.skyblock.api.utils.APIUtil;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.island.IslandManager;
import com.songoda.skyblock.message.MessageManager;
@ -31,7 +30,6 @@ import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.potion.PotionType;
import java.io.File;
import java.util.List;
public class Upgrade {
@ -65,7 +63,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player) && playerDataManager.getPlayerData(player).getOwner() != null) {
if (playerDataManager.isPlayerDataLoaded(player) && playerDataManager.getPlayerData(player).getOwner() != null) {
Island island = islandManager.getIsland(player);
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
@ -76,7 +74,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getOwner() == null) {

View File

@ -55,7 +55,7 @@ public class Visit {
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
if (playerData.getType() == null || playerData.getSort() == null) {
@ -402,7 +402,7 @@ public class Visit {
} else {
targetPlayerName = targetPlayer.getName();
if (playerDataManager.hasPlayerData(targetPlayer)) {
if (playerDataManager.isPlayerDataLoaded(targetPlayer)) {
targetPlayerTexture = playerDataManager.getPlayerData(targetPlayer).getTexture();
} else {
targetPlayerTexture = new String[]{null, null};

View File

@ -46,11 +46,11 @@ public class Visitors {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = plugin.getPlayerDataManager().getPlayerData(player);
Island island = islandManager.getIsland(player);

View File

@ -3,7 +3,6 @@ package com.songoda.skyblock.menus;
import com.songoda.core.compatibility.CompatibleMaterial;
import com.songoda.core.compatibility.CompatibleSound;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.config.FileManager;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.island.IslandManager;
import com.songoda.skyblock.island.IslandRole;
@ -23,8 +22,6 @@ import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.inventory.ItemStack;
import java.io.File;
public class Weather {
private static Weather instance;
@ -46,11 +43,11 @@ public class Weather {
PermissionManager permissionManager = plugin.getPermissionManager();
SoundManager soundManager = plugin.getSoundManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
FileConfiguration configLoad = plugin.getLanguage();
nInventoryUtil nInv = new nInventoryUtil(player, event -> {
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Island island = islandManager.getIsland(player);
if (island == null) {

View File

@ -1250,7 +1250,7 @@ public class Creator implements Listener {
if (inventoryName.equals(ChatColor.translateAlternateColorCodes('&', configLoad.getString("Menu.Admin.Creator.Title")))) {
PlayerDataManager playerDataManager = plugin.getPlayerDataManager();
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
Creator.Viewer viewer = (Viewer) playerDataManager.getPlayerData(player).getViewer();
if (viewer != null) {

View File

@ -53,7 +53,7 @@ public class Upgrade {
SoundManager soundManager = plugin.getSoundManager();
FileManager fileManager = plugin.getFileManager();
if (playerDataManager.hasPlayerData(player) && playerDataManager.getPlayerData(player).getViewer() != null) {
if (playerDataManager.isPlayerDataLoaded(player) && playerDataManager.getPlayerData(player).getViewer() != null) {
FileConfiguration configLoad = plugin.getLanguage();
Viewer viewer = (Upgrade.Viewer) playerDataManager.getPlayerData(player).getViewer();
@ -138,7 +138,7 @@ public class Upgrade {
if (event.getClick() == ClickType.LEFT) {
upgrade.setEnabled(!upgrade.isEnabled());
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
com.songoda.skyblock.upgrade.Upgrade.Type upgradeType = ((Viewer) playerDataManager
.getPlayerData(player).getViewer()).getUpgrade();
@ -193,7 +193,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
double upgradeCost = Double.valueOf(gui.getInputText());
com.songoda.skyblock.upgrade.Upgrade.Type upgradeType = ((Viewer) playerDataManager
.getPlayerData(player).getViewer()).getUpgrade();
@ -372,7 +372,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
ItemStack is = event.getItem();
@ -405,7 +405,7 @@ public class Upgrade {
AnvilGui gui = new AnvilGui(player);
gui.setAction(event1 -> {
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!gui.getInputText().matches("[0-9]+")) {
@ -531,7 +531,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!gui.getInputText().matches("[0-9]+")) {
@ -650,7 +650,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!(gui.getInputText().matches("[0-9]+")
@ -791,7 +791,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)) {
if (playerDataManager.isPlayerDataLoaded(player)) {
PlayerData playerData = playerDataManager.getPlayerData(player);
ItemStack is = event.getItem();
@ -824,7 +824,7 @@ public class Upgrade {
AnvilGui gui = new AnvilGui(player);
gui.setAction(event1 -> {
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!gui.getInputText().matches("[0-9]+")) {
@ -952,7 +952,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!gui.getInputText().matches("[0-9]+")) {
@ -1071,7 +1071,7 @@ public class Upgrade {
return;
}
if (playerDataManager.hasPlayerData(player)
if (playerDataManager.isPlayerDataLoaded(player)
&& playerDataManager
.getPlayerData(player) != null) {
if (!(gui.getInputText().matches("[0-9]+")

View File

@ -5,23 +5,30 @@ import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.bank.Transaction;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.confirmation.Confirmation;
import com.songoda.skyblock.database.exceptions.NoPlayerDataException;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.island.IslandRole;
import com.songoda.skyblock.menus.MenuType;
import com.songoda.skyblock.utils.structure.Area;
import org.apache.commons.lang.SerializationUtils;
import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;
public class PlayerData {
private final SkyBlock plugin;
private final UUID uuid;
private UUID islandOwnerUUID;
private UUID ownershipUUID;
private UUID islandUUID;
private long firstJoin;
private final List<MenuPage> pages;
private int playTime;
@ -43,52 +50,91 @@ public class PlayerData {
private Object viewer;
//TODO move this to island data
@Deprecated
private List<Transaction> transactions;
private Config playerConfig;
public PlayerData(Player player) {
private boolean scoreboard;
private String[] texture;
private long lastOnline;
private long islandJoinTime;
private int islandCreationCount;
private int islandDeleteCount;
private IslandRole islandRole;
public PlayerData(UUID playerUUID) {
this.plugin = SkyBlock.getInstance();
uuid = player.getUniqueId();
islandOwnerUUID = null;
this.uuid = playerUUID;
pages = new ArrayList<>();
confirmationTime = 0;
playTime = getConfig().getFileConfiguration().getInt("Statistics.Island.Playtime");
area = new Area();
chatSpy = getConfig().getFileConfiguration().getBoolean("ChatSpy", false);
spiedIslands = new HashSet<>();
if (getConfig().getFileConfiguration().getString("ChatSpiedIslands") != null) {
for (String islandUUID : getConfig().getFileConfiguration().getStringList("ChatSpiedIslands")) {
spiedIslands.add(FastUUID.parseUUID(islandUUID));
}
}
chat = false;
preview = false;
transactions = new ArrayList<>();
FileConfiguration configLoad = getConfig().getFileConfiguration();
for (int i = 0;i< configLoad.getInt("Bank.Transactions.Size");i++) {
Transaction t = new Transaction();
t.action = Transaction.Type.valueOf(configLoad.getString("Bank.Transactions."+i+".Action"));
t.amount = Float.parseFloat(Objects.requireNonNull(configLoad.getString("Bank.Transactions." + i + ".Amount")));
t.player = Bukkit.getOfflinePlayer(FastUUID.parseUUID(Objects.requireNonNull(configLoad.getString("Bank.Transactions." + i + ".Player"))));
Date d = new Date();
d.setTime(configLoad.getLong("Bank.Transactions."+i+".Date"));
t.timestamp = d;
String visibility = configLoad.getString("Bank.Transactions."+i+".Visibility");
if(visibility != null){
t.visibility = Transaction.Visibility.valueOf(visibility);
} else {
t.visibility = Transaction.Visibility.USER; // Defaulting this as it's a new field
}
transactions.add(t);
switch (plugin.getDataManager().getDatabaseType()) {
case POSTGRESQL:
case MARIADB:
case MYSQL:
case SQLITE:
try (Connection connection = plugin.getDatabaseConnector().getConnection()) {
PreparedStatement statement = connection.prepareStatement("SELECT * FROM " + SkyBlock.getTable("players") +" WHERE uuid = ?");
statement.setString(1, FastUUID.toString(playerUUID));
ResultSet data = statement.executeQuery();
if (data.next()) {
playTime = data.getInt("playTime");
firstJoin = data.getLong("joinTime");
this.islandRole = IslandRole.valueOf(data.getString("islandRole"));
chatSpy = data.getBoolean("chatSpy");
byte[] spiedIslands = data.getBytes("spiedIslands");
if (spiedIslands != null) {
this.spiedIslands.addAll((List<UUID>) SerializationUtils.deserialize(spiedIslands));
}
this.scoreboard = data.getBoolean("scoreboard");
this.texture = new String[]{data.getString("textureSignature"), data.getString("textureValue")};
this.islandCreationCount = data.getInt("islandCreationCount");
this.islandDeleteCount = data.getInt("islandDeleteCount");
this.islandJoinTime = data.getLong("islandJoinTime");
} else {
throw new NoPlayerDataException();
}
} catch (Exception e) {
e.printStackTrace();
}
break;
case MONGODB:
throw new RuntimeException("MongoDB is not supported yet");
//Flatfile
default:
playerConfig = plugin.getFileManager().getConfig(new File(new File(plugin.getDataFolder().toString() + "/player-data"), FastUUID.toString(playerUUID) + ".yml"));
chatSpy = getConfig().getFileConfiguration().getBoolean("ChatSpy", false);
if (getConfig().getFileConfiguration().getString("ChatSpiedIslands") != null) {
for (String islandUUID : getConfig().getFileConfiguration().getStringList("ChatSpiedIslands")) {
spiedIslands.add(FastUUID.parseUUID(islandUUID));
}
}
this.scoreboard = getConfig().getFileConfiguration().getBoolean("Scoreboard", true);
String island = getConfig().getFileConfiguration().getString("Island.UUID");
String islandOwner = getConfig().getFileConfiguration().getString("Island.Owner");
this.islandRole = IslandRole.valueOf(getConfig().getFileConfiguration().getString("Island.Role", "Member"));
this.islandUUID = island == null ? null : FastUUID.parseUUID(island);
this.texture = new String[] { getConfig().getFileConfiguration().getString("Texture.Signature"), getConfig().getFileConfiguration().getString("Texture.Value") };
//TODO convert from string to timestamp
this.lastOnline = getConfig().getFileConfiguration().getLong("Statistics.Island.LastOnline");
this.islandCreationCount = getConfig().getFileConfiguration().getInt("Statistics.Island.CreationCount");
this.islandDeleteCount = getConfig().getFileConfiguration().getInt("Statistics.Island.DeleteCount");
this.islandJoinTime = getConfig().getFileConfiguration().getLong("Statistics.Island.Join", 0);
break;
}
}
@Deprecated
public PlayerData(Player player) {
this(player.getUniqueId());
}
public int getPage(MenuType type) {
for(MenuPage menu : pages){
if(menu.getType().equals(type)){
@ -125,19 +171,11 @@ public class PlayerData {
}
public UUID getIsland() {
return islandOwnerUUID;
return islandUUID;
}
public void setIsland(UUID islandOwnerUUID) {
this.islandOwnerUUID = islandOwnerUUID;
}
public UUID getOwnership() {
return ownershipUUID;
}
public void setOwnership(UUID ownershipUUID) {
this.ownershipUUID = ownershipUUID;
public void setIsland(UUID islandUUID) {
this.islandUUID = islandUUID;
}
public int getConfirmationTime() {
@ -168,12 +206,20 @@ public class PlayerData {
this.playTime = playTime;
}
public long getFirstJoin() {
return firstJoin;
}
public void setFirstJoin(long firstJoin) {
this.firstJoin = firstJoin;
}
public boolean isScoreboard() {
return getConfig().getFileConfiguration().getBoolean("Scoreboard", true);
return scoreboard;
}
public void setScoreboard(boolean scoreboard) {
getConfig().getFileConfiguration().set("Scoreboard", scoreboard);
this.scoreboard = true;
}
public boolean isPreview() {
@ -192,63 +238,50 @@ public class PlayerData {
this.visitTime = visitTime;
}
public String getMemberSince() {
return getConfig().getFileConfiguration().getString("Statistics.Island.Join");
public long getMemberSince() {
return islandJoinTime;
}
public void setMemberSince(String date) {
getConfig().getFileConfiguration().set("Statistics.Island.Join", date);
public void setMemberSince(long timestamp) {
this.islandJoinTime = timestamp;
}
public UUID getOwner() {
String islandOwnerUUID = getConfig().getFileConfiguration().getString("Island.Owner");
return (islandOwnerUUID == null) ? null : FastUUID.parseUUID(islandOwnerUUID);
}
public void setOwner(UUID islandOwnerUUID) {
if (islandOwnerUUID == null) {
getConfig().getFileConfiguration().set("Island.Owner", null);
} else {
getConfig().getFileConfiguration().set("Island.Owner", islandOwnerUUID.toString());
}
public void clearMemberSince() {
this.islandJoinTime = 0;
}
public String[] getTexture() {
FileConfiguration configLoad = getConfig().getFileConfiguration();
return new String[] { configLoad.getString("Texture.Signature"), configLoad.getString("Texture.Value") };
return texture;
}
public void setTexture(String signature, String value) {
getConfig().getFileConfiguration().set("Texture.Signature", signature);
getConfig().getFileConfiguration().set("Texture.Value", value);
this.texture = new String[] { signature, value };
}
public String getLastOnline() {
return getConfig().getFileConfiguration().getString("Statistics.Island.LastOnline");
public long getLastOnline() {
return this.lastOnline;
}
public void setLastOnline(String date) {
getConfig().getFileConfiguration().set("Statistics.Island.LastOnline", date);
public void setLastOnline(long timestamp) {
this.lastOnline = timestamp;
}
public long getIslandCreationCount() {
return getConfig().getFileConfiguration().getLong("Statistics.Island.IslandCreationCount");
public int getIslandCreationCount() {
return islandCreationCount;
}
public long getIslandDeletionCount() {
return getConfig().getFileConfiguration().getLong("Statistics.Island.IslandDeleteCount");
public int getIslandDeletionCount() {
return islandDeleteCount;
}
public void setIslandCreationCount(long newNumber) {
getConfig().getFileConfiguration().set("Statistics.Island.IslandCreationCount", newNumber);
public void setIslandCreationCount(int newNumber) {
this.islandCreationCount = newNumber;
}
public void setIslandDeletionCount(long newNumber) {
getConfig().getFileConfiguration().set("Statistics.Island.IslandDeleteCount", newNumber);
public void setIslandDeletionCount(int newNumber) {
this.islandDeleteCount = newNumber;
}
public Area getArea() {
return area;
}
@ -269,6 +302,7 @@ public class PlayerData {
this.viewer = viewer;
}
//ToDo move this to island data
public void deleteTransactions() {
Config config = getConfig();
FileConfiguration configLoad = config.getFileConfiguration();
@ -281,42 +315,21 @@ public class PlayerData {
}
}
public synchronized void save() {
transactions = plugin.getBankManager().getTransactionList(getPlayerUUID());
Config config = getConfig();
FileConfiguration configLoad = config.getFileConfiguration();
configLoad.set("Statistics.Island.Playtime", getPlaytime());
if (transactions != null) {
configLoad.set("Bank.Transactions.Size", transactions.size());
for (int i = 0; i < transactions.size(); i++) {
Transaction t = transactions.get(i);
configLoad.set("Bank.Transactions." + i + ".Action", t.action.name());
configLoad.set("Bank.Transactions." + i + ".Amount", t.amount);
configLoad.set("Bank.Transactions." + i + ".Player", t.player.getUniqueId().toString());
configLoad.set("Bank.Transactions." + i + ".Date", t.timestamp.getTime());
configLoad.set("Bank.Transactions." + i + ".Visibility", t.visibility.name());
}
}else {
configLoad.set("Bank.Transactions.Size", 0);
}
configLoad.set("ChatSpy", chatSpy);
List<String> tempSpiedIslands = new ArrayList<>();
for(UUID uuid : spiedIslands){
tempSpiedIslands.add(FastUUID.toString(uuid));
}
configLoad.set("ChatSpiedIslands", tempSpiedIslands);
try {
configLoad.save(config.getFile());
} catch (IOException e) {
e.printStackTrace();
}
//TODO move this to island data
public List<Transaction> getTransactions() {
return transactions;
}
public synchronized void save() {
plugin.getDataManager().getDataProvider().savePlayerData(this);
}
/**
* Only used when DatabaseType is FlatFile
* @return the player's config if DatabaseType is FlatFile otherwise null
*/
private Config getConfig() {
SkyBlock plugin = SkyBlock.getInstance();
return plugin.getFileManager().getConfig(new File(new File(plugin.getDataFolder().toString() + "/player-data"), FastUUID.toString(uuid) + ".yml"));
return playerConfig;
}
public Player getPlayer() {
@ -327,22 +340,16 @@ public class PlayerData {
return uuid;
}
public List<Transaction> getTransactions() {
return transactions;
}
public boolean isChatSpy() {
return chatSpy;
}
public void setChatSpy(boolean chatSpy) {
this.chatSpy = chatSpy;
Bukkit.getScheduler().runTaskAsynchronously(plugin, this::save);
}
public void addChatSpyIsland(UUID uuid) {
spiedIslands.add(uuid);
Bukkit.getScheduler().runTaskAsynchronously(plugin, this::save);
}
public boolean isChatSpyIsland(UUID uuid) {
@ -351,7 +358,6 @@ public class PlayerData {
public void removeChatSpyIsland(UUID uuid) {
spiedIslands.remove(uuid);
Bukkit.getScheduler().runTaskAsynchronously(plugin, this::save);
}
public Set<UUID> getChatSpyIslands() {
@ -376,6 +382,13 @@ public class PlayerData {
public void enableGlobalChatSpy() {
spiedIslands.clear();
Bukkit.getScheduler().runTaskAsynchronously(plugin, this::save);
}
public IslandRole getIslandRole() {
return islandRole;
}
public void setIslandRole(IslandRole islandRole) {
this.islandRole = islandRole;
}
}

View File

@ -1,10 +1,9 @@
package com.songoda.skyblock.playerdata;
import com.mojang.authlib.GameProfile;
import com.mojang.authlib.properties.Property;
import com.songoda.skyblock.SkyBlock;
import com.songoda.skyblock.ban.BanManager;
import com.songoda.skyblock.config.FileManager.Config;
import com.songoda.skyblock.database.DataProvider;
import com.songoda.skyblock.island.Island;
import com.songoda.skyblock.island.IslandLocation;
import com.songoda.skyblock.island.IslandManager;
@ -23,88 +22,52 @@ import org.bukkit.entity.Player;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class PlayerDataManager {
private final SkyBlock plugin;
private final Map<UUID, PlayerData> playerDataStorage = new HashMap<>();
private final DataProvider dataProvider;
public PlayerDataManager(SkyBlock plugin) {
this.plugin = plugin;
for (Player all : Bukkit.getOnlinePlayers()) {
loadPlayerData(all);
if (!hasPlayerData(all)) {
createPlayerData(all);
loadPlayerData(all);
}
storeIsland(all);
}
this.dataProvider = plugin.getDataManager().getDataProvider();
}
public void onDisable() {
for (PlayerData data : playerDataStorage.values()) {
data.save();
}
public void save() {
}
public synchronized void addData(PlayerData data) {
playerDataStorage.put(data.getPlayerUUID(), data);
}
public synchronized void removeData(PlayerData data) {
playerDataStorage.remove(data.getPlayerUUID());
}
public void createPlayerData(Player player) {
Config config = plugin.getFileManager().getConfig(new File(new File(plugin.getDataFolder().toString() + "/player-data"), player.getUniqueId() + ".yml"));
FileConfiguration configLoad = config.getFileConfiguration();
String[] playerTexture;
try {
Object entityPlayer = player.getClass().getMethod("getHandle").invoke(player);
Method getProfileMethod = entityPlayer.getClass().getMethod("getProfile");
GameProfile gameProfile = (GameProfile) getProfileMethod.invoke(entityPlayer);
Property property = gameProfile.getProperties().get("textures").iterator().next();
playerTexture = new String[] {property.getSignature(), property.getValue()};
} catch (Exception e) {
playerTexture = new String[] {
"K9P4tCIENYbNpDuEuuY0shs1x7iIvwXi4jUUVsATJfwsAIZGS+9OZ5T2HB0tWBoxRvZNi73Vr+syRdvTLUWPusVXIg+2fhXmQoaNEtnQvQVGQpjdQP0TkZtYG8PbvRxE6Z75ddq+DVx/65OSNHLWIB/D+Rg4vINh4ukXNYttn9QvauDHh1aW7/IkIb1Bc0tLcQyqxZQ3mdglxJfgIerqnlA++Lt7TxaLdag4y1NhdZyd3OhklF5B0+B9zw/qP8QCzsZU7VzJIcds1+wDWKiMUO7+60OSrIwgE9FPamxOQDFoDvz5BOULQEeNx7iFMB+eBYsapCXpZx0zf1bduppBUbbVC9wVhto/J4tc0iNyUq06/esHUUB5MHzdJ0Y6IZJAD/xIw15OLCUH2ntvs8V9/cy5/n8u3JqPUM2zhUGeQ2p9FubUGk4Q928L56l3omRpKV+5QYTrvF+AxFkuj2hcfGQG3VE2iYZO6omXe7nRPpbJlHkMKhE8Xvd1HP4PKpgivSkHBoZ92QEUAmRzZydJkp8CNomQrZJf+MtPiNsl/Q5RQM+8CQThg3+4uWptUfP5dDFWOgTnMdA0nIODyrjpp+bvIJnsohraIKJ7ZDnj4tIp4ObTNKDFC/8j8JHz4VCrtr45mbnzvB2DcK8EIB3JYT7ElJTHnc5BKMyLy5SKzuw=",
"eyJ0aW1lc3RhbXAiOjE1MjkyNTg0MTE4NDksInByb2ZpbGVJZCI6Ijg2NjdiYTcxYjg1YTQwMDRhZjU0NDU3YTk3MzRlZWQ3IiwicHJvZmlsZU5hbWUiOiJTdGV2ZSIsInNpZ25hdHVyZVJlcXVpcmVkIjp0cnVlLCJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZGMxYzc3Y2U4ZTU0OTI1YWI1ODEyNTQ0NmVjNTNiMGNkZDNkMGNhM2RiMjczZWI5MDhkNTQ4Mjc4N2VmNDAxNiJ9LCJDQVBFIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjc2N2Q0ODMyNWVhNTMyNDU2MTQwNmI4YzgyYWJiZDRlMjc1NWYxMTE1M2NkODVhYjA1NDVjYzIifX19"};
}
configLoad.set("Texture.Signature", playerTexture[0]);
configLoad.set("Texture.Value", playerTexture[1]);
configLoad.set("Statistics.Island.Playtime", 0);
try {
configLoad.save(config.getFile());
} catch (IOException e) {
e.printStackTrace();
if (dataProvider.hasPlayerData(player)) {
throw new RuntimeException("Player data already exists for " + player.getName());
}
plugin.getDataManager().getDataProvider().createPlayerData(player);
}
public void loadPlayerData(Player player) {
if (plugin.getFileManager().isFileExist(new File(plugin.getDataFolder().toString() + "/player-data", player.getUniqueId().toString() + ".yml"))) {
PlayerData playerData = new PlayerData(player);
playerDataStorage.put(player.getUniqueId(), playerData);
}
if (dataProvider.hasPlayerData(player)) {
addData(dataProvider.loadPlayerData(player));
}
}
public void unloadPlayerData(Player player) {
if (hasPlayerData(player)) {
plugin.getFileManager().unloadConfig(new File(new File(plugin.getDataFolder().toString() + "/player-data"), player.getUniqueId().toString() + ".yml"));
playerDataStorage.remove(player.getUniqueId());
if (isPlayerDataLoaded(player)) {
dataProvider.unloadPlayerData(player);
}
}
public void savePlayerData(Player player) {
if (hasPlayerData(player)) {
Config config = plugin.getFileManager().getConfig(new File(new File(plugin.getDataFolder().toString() + "/player-data"), player.getUniqueId().toString() + ".yml"));
try {
config.getFileConfiguration().save(config.getFile());
} catch (IOException e) {
e.printStackTrace();
}
if (isPlayerDataLoaded(player)) {
dataProvider.savePlayerData(player);
}
}
@ -116,7 +79,7 @@ public class PlayerDataManager {
return playerDataStorage.get(uuid);
}
public boolean hasPlayerData(UUID uuid) {
public boolean isPlayerDataLoaded(UUID uuid) {
return playerDataStorage.containsKey(uuid);
}
@ -124,8 +87,8 @@ public class PlayerDataManager {
return getPlayerData(player.getUniqueId());
}
public boolean hasPlayerData(Player player) {
return hasPlayerData(player.getUniqueId());
public boolean isPlayerDataLoaded(Player player) {
return isPlayerDataLoaded(player.getUniqueId());
}
public void storeIsland(Player player) {
@ -136,7 +99,7 @@ public class PlayerDataManager {
FileConfiguration configLoad = plugin.getLanguage();
if (hasPlayerData(player)) {
if (isPlayerDataLoaded(player)) {
if (worldManager.isIslandWorld(player.getWorld())) {
IslandWorld world = worldManager.getIslandWorld(player.getWorld());
Island island = islandManager.getIslandAtLocation(player.getLocation());

View File

@ -20,7 +20,7 @@ public class PlaytimeTask extends BukkitRunnable {
@Override
public void run() {
for (Player all : Bukkit.getOnlinePlayers()) {
if (playerDataManager.hasPlayerData(all) && islandManager.getIsland(all) != null) {
if (playerDataManager.isPlayerDataLoaded(all) && islandManager.getIsland(all) != null) {
PlayerData playerData = playerDataManager.getPlayerData(all);
playerData.setPlaytime(playerData.getPlaytime() + 1);
}

View File

@ -1,3 +1,26 @@
# Valid types in recommended order: POSTGRESQL, MARIADB, MONGODB, MYSQL, SQLITE, FLATFILE
Database:
Type: FLATFILE
#Only in POSTGRESQL, MARIADB, MYSQL, MONGODB
Connection:
Host: localhost
Port: 3306
Database: fabledskyblock
Username: root
Password: root
Settings:
# Only in POSTGRESQL, MARIADB, MYSQL
ConnectionMaxLifetime: 1800000 # 30 minutes
ConnectionTimeout: 5000 # 5 seconds
MinPoolSize: 10
MaxPoolSize: 10
Command:
Help:
# Lists all commands rather than pages.