From 3fe5c25e7baf20b6ad3f8c28775468611fd02c03 Mon Sep 17 00:00:00 2001 From: RonanCraft Date: Thu, 7 Apr 2022 16:45:09 -0400 Subject: [PATCH] Database Handler + Queue System blueprint --- .../SuperRonanCraft/BetterRTP/BetterRTP.java | 10 +- .../{Listener.java => EventListener.java} | 3 +- .../BetterRTP/player/rtp/queue/RTPQueue.java | 31 ------ .../references/database/DatabaseHandler.java | 33 ++++++ .../references/database/DatabaseQueue.java | 102 ++++++++++++++++++ .../references/rtpinfo/CooldownHandler.java | 27 ++--- .../references/rtpinfo/QueueData.java | 16 +++ .../references/rtpinfo/QueueHandler.java | 64 +++++++++++ src/main/resources/permissions.yml | 20 ++-- 9 files changed, 249 insertions(+), 57 deletions(-) rename src/main/java/me/SuperRonanCraft/BetterRTP/player/events/{Listener.java => EventListener.java} (95%) delete mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/queue/RTPQueue.java create mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseHandler.java create mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseQueue.java create mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueData.java create mode 100644 src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java b/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java index a82496a..71ce78d 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/BetterRTP.java @@ -3,8 +3,10 @@ package me.SuperRonanCraft.BetterRTP; import lombok.Getter; import me.SuperRonanCraft.BetterRTP.player.PlayerInfo; import me.SuperRonanCraft.BetterRTP.player.commands.Commands; -import me.SuperRonanCraft.BetterRTP.player.events.Listener; +import me.SuperRonanCraft.BetterRTP.player.events.EventListener; import me.SuperRonanCraft.BetterRTP.player.rtp.RTP; +import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; +import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueHandler; import me.SuperRonanCraft.BetterRTP.references.Permissions; import me.SuperRonanCraft.BetterRTP.references.web.Updater; import me.SuperRonanCraft.BetterRTP.references.depends.DepEconomy; @@ -27,7 +29,7 @@ public class BetterRTP extends JavaPlugin { private final DepEconomy eco = new DepEconomy(); private final Commands cmd = new Commands(this); private final RTP rtp = new RTP(); - private final Listener listener = new Listener(); + private final EventListener listener = new EventListener(); private static BetterRTP instance; private final Files files = new Files(); private final RTPInventories invs = new RTPInventories(); @@ -35,6 +37,8 @@ public class BetterRTP extends JavaPlugin { @Getter private final PlayerDataManager playerDataManager = new PlayerDataManager(); private final Settings settings = new Settings(); @Getter private final CooldownHandler cooldowns = new CooldownHandler(); + private final QueueHandler queue = new QueueHandler(); + @Getter private final DatabaseHandler databaseHandler = new DatabaseHandler(); public void onEnable() { instance = this; @@ -42,6 +46,7 @@ public class BetterRTP extends JavaPlugin { new Metrics(this); loadAll(); listener.registerEvents(this); + queue.registerEvents(this); } public void onDisable() { @@ -113,6 +118,7 @@ public class BetterRTP extends JavaPlugin { //(Re)Load all plugin systems/files/cache private void loadAll() { playerDataManager.clear(); + databaseHandler.load(); files.loadAll(); settings.load(); invs.load(); diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Listener.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java similarity index 95% rename from src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Listener.java rename to src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java index 1d41329..4832c6b 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/Listener.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/player/events/EventListener.java @@ -2,6 +2,7 @@ package me.SuperRonanCraft.BetterRTP.player.events; import me.SuperRonanCraft.BetterRTP.BetterRTP; import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -10,7 +11,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.plugin.PluginManager; -public class Listener implements org.bukkit.event.Listener { +public class EventListener implements Listener { private final Join join = new Join(); private final Leave leave = new Leave(); private final Interact interact = new Interact(); diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/queue/RTPQueue.java b/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/queue/RTPQueue.java deleted file mode 100644 index 8ab9aa6..0000000 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/player/rtp/queue/RTPQueue.java +++ /dev/null @@ -1,31 +0,0 @@ -package me.SuperRonanCraft.BetterRTP.player.rtp.queue; - -import me.SuperRonanCraft.BetterRTP.BetterRTP; -import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent; -import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -import java.util.HashMap; -import java.util.List; - -public class RTPQueue implements Listener { //Randomly queues up some randomly safe locations - - HashMap> queue = new HashMap<>(); - - public void load() { - Bukkit.getPluginManager().registerEvents(this, BetterRTP.getInstance()); - //queue(); - } - - @EventHandler - public void onRtpFindLoc(RTP_FindLocationEvent e) { - RTPWorld world = e.getWorld(); - } - - private void queue(RTPWorld world) { - - } -} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseHandler.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseHandler.java new file mode 100644 index 0000000..c5414dd --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseHandler.java @@ -0,0 +1,33 @@ +package me.SuperRonanCraft.BetterRTP.references.database; + +import lombok.Getter; +import me.SuperRonanCraft.BetterRTP.BetterRTP; +import org.bukkit.Bukkit; + +public class DatabaseHandler { + + @Getter private final DatabasePlayers databasePlayers = new DatabasePlayers(); + @Getter private final DatabaseCooldownsWorlds databaseCooldownsWorlds = new DatabaseCooldownsWorlds(); + @Getter private final DatabaseQueue databaseQueue = new DatabaseQueue(); + + public void load() { + Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { + databasePlayers.load(); + databaseCooldownsWorlds.load(); + databaseQueue.load(); + }); + } + + public static DatabasePlayers getPlayers() { + return BetterRTP.getInstance().getDatabaseHandler().getDatabasePlayers(); + } + + public static DatabaseCooldownsWorlds getWorldCooldowns() { + return BetterRTP.getInstance().getDatabaseHandler().getDatabaseCooldownsWorlds(); + } + + public static DatabaseQueue getQueue() { + return BetterRTP.getInstance().getDatabaseHandler().getDatabaseQueue(); + } + +} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseQueue.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseQueue.java new file mode 100644 index 0000000..9bbd6f2 --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/database/DatabaseQueue.java @@ -0,0 +1,102 @@ +package me.SuperRonanCraft.BetterRTP.references.database; + +import me.SuperRonanCraft.BetterRTP.BetterRTP; +import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData; +import me.SuperRonanCraft.BetterRTP.references.rtpinfo.QueueData; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; + +public class DatabaseQueue extends SQLite { + + public DatabaseQueue() { + super(DATABASE_TYPE.PLAYERS); + } + + @Override + public List getTables() { + List list = new ArrayList<>(); + list.add("Queue"); + return list; + } + + public enum COLUMNS { + ID("id", "long PRIMARY KEY AUTOINCREMENT"), + //COOLDOWN DATA + X("x", "long"), + Y("y", "long"), + Z("z", "long"), + WORLD("world", "varchar(32)"), + GENERATED("generated", "long"), + //USES("uses", "integer"), + ; + + public final String name; + public final String type; + + COLUMNS(String name, String type) { + this.name = name; + this.type = type; + } + } + + public List getQueues() { + Connection conn = null; + PreparedStatement ps = null; + ResultSet rs = null; + List queueDataList = new ArrayList<>(); + try { + conn = getSQLConnection(); + ps = conn.prepareStatement("SELECT * FROM " + tables.get(0)); + + rs = ps.executeQuery(); + while (rs.next()) { + long x = rs.getLong(COLUMNS.X.name); + long y = rs.getLong(COLUMNS.Y.name); + long z = rs.getLong(COLUMNS.Z.name); + String worldName = rs.getString(COLUMNS.WORLD.name); + long generated = rs.getLong(COLUMNS.GENERATED.name); + World world = Bukkit.getWorld(worldName); + if (world != null) { + QueueData data = new QueueData(new Location(world, x, y, z), generated); + queueDataList.add(data); + } + } + } catch (SQLException ex) { + BetterRTP.getInstance().getLogger().log(Level.SEVERE, Errors.sqlConnectionExecute(), ex); + } finally { + close(ps, rs, conn); + } + return queueDataList; + } + + //Set a queue to save + public void addQueue(QueueData data) { + String pre = "INSERT INTO "; + String sql = pre + tables.get(0) + " (" + + COLUMNS.X.name + ", " + + COLUMNS.Y.name + ", " + + COLUMNS.Z.name + ", " + + COLUMNS.WORLD.name + ", " + + COLUMNS.GENERATED.name + " " + //+ COLUMNS.USES.name + " " + + ") VALUES(?, ?, ?, ?, ?)"; + List params = new ArrayList() {{ + add(data.getLocation().getX()); + add(data.getLocation().getY()); + add(data.getLocation().getZ()); + add(data.getLocation().getWorld().getName()); + add(data.getGenerated()); + //add(data.getUses()); + }}; + sqlUpdate(sql, params); + } +} \ No newline at end of file diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/CooldownHandler.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/CooldownHandler.java index aad1c01..aa64c74 100644 --- a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/CooldownHandler.java +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/CooldownHandler.java @@ -4,7 +4,7 @@ import lombok.Getter; import me.SuperRonanCraft.BetterRTP.BetterRTP; import me.SuperRonanCraft.BetterRTP.references.PermissionNode; import me.SuperRonanCraft.BetterRTP.references.database.DatabaseCooldownsWorlds; -import me.SuperRonanCraft.BetterRTP.references.database.DatabasePlayers; +import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; import me.SuperRonanCraft.BetterRTP.references.file.FileBasics; import me.SuperRonanCraft.BetterRTP.references.player.HelperPlayer; import me.SuperRonanCraft.BetterRTP.references.player.playerdata.PlayerData; @@ -25,8 +25,6 @@ public class CooldownHandler { @Getter private int cooldownTime; //Global Cooldown timer private int lockedAfter; //Rtp's before being locked private final List downloading = new ArrayList<>(); - private final DatabaseCooldownsWorlds cooldowns = new DatabaseCooldownsWorlds(); - private final DatabasePlayers players = new DatabasePlayers(); //private final DatabaseCooldownsGlobal globalCooldown = new DatabaseCooldownsGlobal(); public void load() { @@ -40,22 +38,17 @@ public class CooldownHandler { lockedAfter = config.getInt("Settings.Cooldown.LockAfter"); cooldownByWorld = config.getBoolean("Settings.Cooldown.PerWorld"); } - Bukkit.getScheduler().runTaskAsynchronously(BetterRTP.getInstance(), () -> { - //globalCooldown.load(); - players.load(); - cooldowns.load(); - checkLater(); - }); + queueDownload(); } - private void checkLater() { + private void queueDownload() { Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> { - if (cooldownByWorld && !cooldowns.isLoaded()) { - checkLater(); + if (cooldownByWorld && !DatabaseHandler.getWorldCooldowns().isLoaded()) { + queueDownload(); return; } - if (!players.isLoaded()) { - checkLater(); + if (!DatabaseHandler.getPlayers().isLoaded()) { + queueDownload(); return; } //OldCooldownConverter.loadOldCooldowns(); @@ -141,7 +134,7 @@ public class CooldownHandler { else getDatabaseWorlds().removePlayer(data.getUuid(), data.getWorld()); } - players.setData(getData(player)); + DatabaseHandler.getPlayers().setData(getData(player)); }); } @@ -157,7 +150,7 @@ public class CooldownHandler { playerData.getCooldowns().put(world, cooldown); } //Player Data - players.setupData(playerData); + DatabaseHandler.getPlayers().setupData(playerData); downloading.remove(player); } @@ -168,7 +161,7 @@ public class CooldownHandler { @Nullable private DatabaseCooldownsWorlds getDatabaseWorlds() { if (cooldownByWorld) - return cooldowns; + return DatabaseHandler.getWorldCooldowns(); return null; } diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueData.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueData.java new file mode 100644 index 0000000..ff15e85 --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueData.java @@ -0,0 +1,16 @@ +package me.SuperRonanCraft.BetterRTP.references.rtpinfo; + +import lombok.Getter; +import org.bukkit.Location; + +public class QueueData { + + @Getter Location location; + @Getter long generated; + + public QueueData(Location location, long generated) { + this.location = location; + this.generated = generated; + } + +} diff --git a/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java new file mode 100644 index 0000000..d78ed43 --- /dev/null +++ b/src/main/java/me/SuperRonanCraft/BetterRTP/references/rtpinfo/QueueHandler.java @@ -0,0 +1,64 @@ +package me.SuperRonanCraft.BetterRTP.references.rtpinfo; + +import me.SuperRonanCraft.BetterRTP.BetterRTP; +import me.SuperRonanCraft.BetterRTP.references.customEvents.RTP_FindLocationEvent; +import me.SuperRonanCraft.BetterRTP.references.database.DatabaseHandler; +import me.SuperRonanCraft.BetterRTP.references.rtpinfo.worlds.RTPWorld; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.plugin.PluginManager; + +import java.util.ArrayList; +import java.util.List; + +public class QueueHandler implements Listener { //Randomly queues up some randomly safe locations + + boolean loaded = false; + List queueList = new ArrayList<>(); + private final int queueSize = 32; + + public void registerEvents(BetterRTP pl) { + PluginManager pm = pl.getServer().getPluginManager(); + pm.registerEvents(this, pl); + } + + public void load() { + loaded = false; + queueDownload(); + } + + private void queueDownload() { + //LOAD FROM DATABASE + Bukkit.getScheduler().runTaskLaterAsynchronously(BetterRTP.getInstance(), () -> { + + if (!DatabaseHandler.getQueue().isLoaded()) { + queueDownload(); + return; + } + //Download all queue cached from last session + queueList = DatabaseHandler.getQueue().getQueues(); + loaded = true; + }, 10L); + } + + @EventHandler + public void onRtpFindLoc(RTP_FindLocationEvent e) { + //RTPWorld world = e.getWorld(); + Location location = e.getLocation(); + List deleteList = new ArrayList<>(); + for (QueueData data : queueList) { + Location dataLoc = data.getLocation(); + if (location.getBlockX() == dataLoc.getBlockX() + && location.getBlockY() == dataLoc.getBlockY() + && location.getBlockZ() == dataLoc.getBlockZ() + && location.getWorld().getName().equals(dataLoc.getWorld().getName())) { + deleteList.add(data); + } + } + deleteList.forEach(queueData -> queueList.remove(queueData)); + } +} + diff --git a/src/main/resources/permissions.yml b/src/main/resources/permissions.yml index f3f5224..4c83544 100644 --- a/src/main/resources/permissions.yml +++ b/src/main/resources/permissions.yml @@ -8,17 +8,19 @@ permissions: betterrtp.player: true betterrtp.reload: true betterrtp.updater: true + betterrtp.group.*: true betterrtp.world: - description: RTP into other worlds + description: Ability to use the world command betterrtp.world.*: description: RTP in all enabled worlds betterrtp.world.: - description: RTP in + description: RTP in world named world betterrtp.bypass.*: - children: - betterrtp.bypass.cooldown: true - betterrtp.bypass.delay: true - betterrtp.bypass.economy: true + children: + betterrtp.bypass.cooldown: true + betterrtp.bypass.delay: true + betterrtp.bypass.economy: true + betterrtp.bypass.hunger: true betterrtp.use: description: Use RTP command default: true @@ -41,6 +43,8 @@ permissions: description: Bypass delays betterrtp.bypass.economy: description: Bypass economy + betterrtp.bypass.hunger: + description: Bypass hunger #Reload betterrtp.reload: description: Reload the config @@ -50,4 +54,8 @@ permissions: default: op betterrtp.test: description: While debugger enabled, be able to test particles, potion effects and sounds + default: op + #Permission Groups + betterrtp.group.*: + description: Allow access to all permission groups default: op \ No newline at end of file