From bc74d35faa6020c189726cde8f43c4fe30958f33 Mon Sep 17 00:00:00 2001 From: Teriuihi Date: Tue, 11 Jan 2022 23:02:04 +0100 Subject: [PATCH] Added GUI's Added player settings Added commands --- settings.gradle.kts | 3 - .../java/com/alttd/AltitudeParticles.java | 7 +- .../com/alttd/commands/CommandManager.java | 18 ++-- .../commands/subcommands/CommandGUI.java | 38 ++++++++ .../commands/subcommands/CommandReload.java | 2 +- src/main/java/com/alttd/config/Config.java | 25 ++++- .../java/com/alttd/config/DatabaseConfig.java | 5 +- .../java/com/alttd/database/Database.java | 22 ++++- src/main/java/com/alttd/database/Queries.java | 24 +++++ .../frameSpawners/FrameSpawnerLocation.java | 37 ++++++++ .../frameSpawners/FrameSpawnerPlayer.java | 43 +++++++++ src/main/java/com/alttd/gui/DefaultGUI.java | 51 ++++++++++ src/main/java/com/alttd/gui/GUI.java | 20 ++++ src/main/java/com/alttd/gui/GUIAction.java | 7 ++ src/main/java/com/alttd/gui/GUIListener.java | 44 +++++++++ .../alttd/gui/actions/EnterParticleMenu.java | 23 +++++ .../gui/actions/ToggleParticlesActive.java | 23 +++++ .../alttd/gui/actions/ToggleSeeParticles.java | 23 +++++ .../alttd/gui/windows/ChooseParticleGUI.java | 11 +++ .../alttd/gui/windows/OpenParticleGUI.java | 95 +++++++++++++++++++ .../alttd/listeners/BlockBreakListener.java | 28 ++++++ .../alttd/listeners/BlockPlaceListener.java | 28 ++++++ .../alttd/listeners/PlayerJoinListener.java | 27 ++++++ .../java/com/alttd/objects/APartType.java | 40 ++++++++ src/main/java/com/alttd/objects/Frame.java | 24 +++++ .../java/com/alttd/objects/ParticleSet.java | 37 ++++++++ .../com/alttd/storage/PlayerSettings.java | 66 +++++++++++++ 27 files changed, 750 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/alttd/commands/subcommands/CommandGUI.java create mode 100644 src/main/java/com/alttd/frameSpawners/FrameSpawnerLocation.java create mode 100644 src/main/java/com/alttd/frameSpawners/FrameSpawnerPlayer.java create mode 100644 src/main/java/com/alttd/gui/DefaultGUI.java create mode 100644 src/main/java/com/alttd/gui/GUI.java create mode 100644 src/main/java/com/alttd/gui/GUIAction.java create mode 100644 src/main/java/com/alttd/gui/GUIListener.java create mode 100644 src/main/java/com/alttd/gui/actions/EnterParticleMenu.java create mode 100644 src/main/java/com/alttd/gui/actions/ToggleParticlesActive.java create mode 100644 src/main/java/com/alttd/gui/actions/ToggleSeeParticles.java create mode 100644 src/main/java/com/alttd/gui/windows/ChooseParticleGUI.java create mode 100644 src/main/java/com/alttd/gui/windows/OpenParticleGUI.java create mode 100644 src/main/java/com/alttd/listeners/BlockBreakListener.java create mode 100644 src/main/java/com/alttd/listeners/BlockPlaceListener.java create mode 100644 src/main/java/com/alttd/listeners/PlayerJoinListener.java create mode 100644 src/main/java/com/alttd/objects/APartType.java create mode 100644 src/main/java/com/alttd/objects/Frame.java create mode 100644 src/main/java/com/alttd/objects/ParticleSet.java create mode 100644 src/main/java/com/alttd/storage/PlayerSettings.java diff --git a/settings.gradle.kts b/settings.gradle.kts index 6e89108..f565350 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -5,9 +5,6 @@ dependencyResolutionManagement { mavenLocal() mavenCentral() maven("https://papermc.io/repo/repository/maven-public/") // Paper - maven("https://jitpack.io") { // Vault - content { includeGroup("com.github.milkbowl") } - } } repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) } diff --git a/src/main/java/com/alttd/AltitudeParticles.java b/src/main/java/com/alttd/AltitudeParticles.java index 91b2649..bb9f555 100644 --- a/src/main/java/com/alttd/AltitudeParticles.java +++ b/src/main/java/com/alttd/AltitudeParticles.java @@ -3,6 +3,8 @@ package com.alttd; import com.alttd.commands.CommandManager; import com.alttd.config.Config; import com.alttd.config.DatabaseConfig; +import com.alttd.database.Database; +import com.alttd.util.Logger; import org.bukkit.plugin.java.JavaPlugin; public class AltitudeParticles extends JavaPlugin { @@ -22,8 +24,11 @@ public class AltitudeParticles extends JavaPlugin { public void onEnable() { Config.reload(); DatabaseConfig.reload(); + Database.getDatabase().init(); new CommandManager(); - + Logger.info("--------------------------------------------------"); + Logger.info("Altitude Particles started"); + Logger.info("--------------------------------------------------"); } } diff --git a/src/main/java/com/alttd/commands/CommandManager.java b/src/main/java/com/alttd/commands/CommandManager.java index 8012003..388e299 100644 --- a/src/main/java/com/alttd/commands/CommandManager.java +++ b/src/main/java/com/alttd/commands/CommandManager.java @@ -1,6 +1,7 @@ package com.alttd.commands; import com.alttd.AltitudeParticles; +import com.alttd.commands.subcommands.CommandGUI; import com.alttd.commands.subcommands.CommandHelp; import com.alttd.commands.subcommands.CommandReload; import com.alttd.config.Config; @@ -31,20 +32,17 @@ public class CommandManager implements CommandExecutor, TabExecutor { subCommands = Arrays.asList( new CommandHelp(this), - new CommandReload()); + new CommandReload(), + new CommandGUI()); } @Override public boolean onCommand(@NotNull CommandSender commandSender, @NotNull Command command, @NotNull String cmd, @NotNull String[] args) { - if (args.length == 0) { - commandSender.sendMiniMessage(Config.HELP_MESSAGE_WRAPPER.replaceAll("", subCommands.stream() - .filter(subCommand -> commandSender.hasPermission(subCommand.getPermission())) - .map(SubCommand::getHelpMessage) - .collect(Collectors.joining("\n"))), null); - return true; - } - - SubCommand subCommand = getSubCommand(args[0]); + SubCommand subCommand; + if (args.length == 0) + subCommand = getSubCommand("gui"); + else + subCommand = getSubCommand(args[0]); if (!commandSender.hasPermission(subCommand.getPermission())) { commandSender.sendMiniMessage(Config.NO_PERMISSION, null); diff --git a/src/main/java/com/alttd/commands/subcommands/CommandGUI.java b/src/main/java/com/alttd/commands/subcommands/CommandGUI.java new file mode 100644 index 0000000..8ae6d77 --- /dev/null +++ b/src/main/java/com/alttd/commands/subcommands/CommandGUI.java @@ -0,0 +1,38 @@ +package com.alttd.commands.subcommands; + +import com.alttd.commands.SubCommand; +import com.alttd.config.Config; +import com.alttd.gui.windows.OpenParticleGUI; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class CommandGUI extends SubCommand { + + @Override + public boolean onCommand(CommandSender commandSender, String[] args) { + if (!(commandSender instanceof Player player)) { + commandSender.sendMiniMessage(Config.NO_CONSOLE, null); + return true; + } + new OpenParticleGUI(player).open(player); + return true; + } + + @Override + public String getName() { + return "gui"; + } + + @Override + public List getTabComplete(CommandSender commandSender, String[] args) { + return new ArrayList<>(); + } + + @Override + public String getHelpMessage() { + return Config.GUI_HELP_MESSAGE; + } +} diff --git a/src/main/java/com/alttd/commands/subcommands/CommandReload.java b/src/main/java/com/alttd/commands/subcommands/CommandReload.java index 19d3395..44b9a0e 100644 --- a/src/main/java/com/alttd/commands/subcommands/CommandReload.java +++ b/src/main/java/com/alttd/commands/subcommands/CommandReload.java @@ -30,6 +30,6 @@ public class CommandReload extends SubCommand { @Override public String getHelpMessage() { - return Config.RELOAD_MESSAGE; + return Config.RELOAD_HELP_MESSAGE; } } diff --git a/src/main/java/com/alttd/config/Config.java b/src/main/java/com/alttd/config/Config.java index 261738b..e9f6a30 100644 --- a/src/main/java/com/alttd/config/Config.java +++ b/src/main/java/com/alttd/config/Config.java @@ -21,12 +21,14 @@ public final class Config extends AbstractConfig { public static String HELP_MESSAGE_WRAPPER = "AltitudeParticles help:\n"; public static String HELP_MESSAGE = "Show this menu: /apart help"; - public static String RELOAD_MESSAGE = "Reload configs: /apart reload"; + public static String RELOAD_HELP_MESSAGE = "Reload configs: /apart reload"; + public static String GUI_HELP_MESSAGE = "Open GUI: /apart or /apart gui"; private static void loadHelp() { HELP_MESSAGE_WRAPPER = config.getString("help.help-wrapper", HELP_MESSAGE_WRAPPER); HELP_MESSAGE = config.getString("help.help", HELP_MESSAGE); - RELOAD_MESSAGE = config.getString("help.reload", RELOAD_MESSAGE); + RELOAD_HELP_MESSAGE = config.getString("help.reload", RELOAD_HELP_MESSAGE); + GUI_HELP_MESSAGE = config.getString("help.gui", GUI_HELP_MESSAGE); } public static String NO_PERMISSION = "You do not have permission to do that."; @@ -40,6 +42,25 @@ public final class Config extends AbstractConfig { private static void loadMessages() { } + public static String PARTICLE_TYPE_BUTTON_NAME = ""; + public static String PARTICLE_TYPE_GUI_NAME = "AltitudeParticles"; + private static void loadGUIText() { + config.getString("gui-text.particle-type-button-name", PARTICLE_TYPE_BUTTON_NAME); + config.getString("gui-text.particles-type-gui-name", PARTICLE_TYPE_GUI_NAME); + } + + public static String SEE_OTHERS_ON = "Particles visible"; + public static String SEE_OTHERS_ON_DESC = "Click to hide particles"; + public static String SEE_OTHERS_OFF = "Particles hidden"; + public static String SEE_OTHERS_OFF_DESC = "Click to show particles"; + public static String PARTICLES_ON = "Particles on"; + public static String PARTICLES_ON_DESC = "Click to disable particles"; + public static String PARTICLES_OFF = "Particles off"; + public static String PARTICLES_OFF_DESC = "Click to enable particles"; + private static void loadGUIButtons() { + + } + public static boolean DEBUG = false; private static void loadSettings() { diff --git a/src/main/java/com/alttd/config/DatabaseConfig.java b/src/main/java/com/alttd/config/DatabaseConfig.java index 0fd1f10..8027a40 100644 --- a/src/main/java/com/alttd/config/DatabaseConfig.java +++ b/src/main/java/com/alttd/config/DatabaseConfig.java @@ -1,11 +1,12 @@ package com.alttd.config; +import com.alttd.database.Database; + import java.io.File; public class DatabaseConfig extends AbstractConfig { static DatabaseConfig config; - static int version; public DatabaseConfig() { super(new File(System.getProperty("user.home") + File.separator + "share" + File.separator + "configs" + File.separator + "AltitudeParticles"), "database.yml"); @@ -13,7 +14,7 @@ public class DatabaseConfig extends AbstractConfig { public static void reload() { config = new DatabaseConfig(); - config.readConfig(Config.class, null); + config.readConfig(DatabaseConfig.class, null); } public static String DRIVER = "mysql"; diff --git a/src/main/java/com/alttd/database/Database.java b/src/main/java/com/alttd/database/Database.java index 42d8fa5..47bcd61 100644 --- a/src/main/java/com/alttd/database/Database.java +++ b/src/main/java/com/alttd/database/Database.java @@ -32,7 +32,8 @@ public class Database { } // Tables - createUserPointsTable(); + createActiveParticlesTable(); + createUserSettingsTable(); } /** @@ -61,7 +62,7 @@ public class Database { } } - private static void createUserPointsTable() { + private static void createActiveParticlesTable() { try { String sql = "CREATE TABLE IF NOT EXISTS active_particles(" + "uuid VARCHAR(36) NOT NULL, " + @@ -78,4 +79,21 @@ public class Database { } } + private static void createUserSettingsTable() { + try { + String sql = "CREATE TABLE IF NOT EXISTS user_settings(" + + "uuid VARCHAR(36) NOT NULL, " + + "particles_active BIT(1) NOT NULL DEFAULT b'1', " + + "seeing_particles BIT(1) NOT NULL DEFAULT b'1', " + + "PRIMARY KEY (uuid)" + + ")"; + connection.prepareStatement(sql).executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + Logger.severe("Error while trying to create user point table"); + Logger.severe("Shutting down AltitudeParticles"); + Bukkit.getPluginManager().disablePlugin(AltitudeParticles.getInstance()); + } + } + } diff --git a/src/main/java/com/alttd/database/Queries.java b/src/main/java/com/alttd/database/Queries.java index 8ecc247..2bca7ba 100644 --- a/src/main/java/com/alttd/database/Queries.java +++ b/src/main/java/com/alttd/database/Queries.java @@ -1,4 +1,28 @@ package com.alttd.database; +import com.alttd.storage.PlayerSettings; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + public class Queries { + public static PlayerSettings getPlayerSettings(UUID uuid) { + String sql = "SELECT * FROM user_settings WHERE uuid = ?"; + try { + PreparedStatement preparedStatement = Database.connection.prepareStatement(sql); + preparedStatement.setString(1, uuid.toString()); + + ResultSet resultSet = preparedStatement.executeQuery(); + if (resultSet.next()) { + boolean particlesActive = resultSet.getInt("particles_active") == 1; + boolean seeingParticles = resultSet.getInt("seeing_particles") == 1; + return new PlayerSettings(particlesActive, seeingParticles, uuid); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } } diff --git a/src/main/java/com/alttd/frameSpawners/FrameSpawnerLocation.java b/src/main/java/com/alttd/frameSpawners/FrameSpawnerLocation.java new file mode 100644 index 0000000..d768b6e --- /dev/null +++ b/src/main/java/com/alttd/frameSpawners/FrameSpawnerLocation.java @@ -0,0 +1,37 @@ +package com.alttd.frameSpawners; + +import com.alttd.config.Config; +import com.alttd.objects.Frame; +import com.alttd.util.Logger; +import org.bukkit.Location; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Iterator; +import java.util.List; + +public class FrameSpawnerLocation extends BukkitRunnable { + + int amount; + List frames; + Iterator iterator; + Location location; + public FrameSpawnerLocation(int amount, List frames, Location location) { + this.amount = amount; + this.frames = frames; + this.iterator = frames.iterator(); + this.location = location; + } + + @Override + public void run() { + if (iterator.hasNext()) + iterator.next().spawn(location); + else if (amount != 0) + iterator = frames.iterator(); + else { + this.cancel(); + if (Config.DEBUG) + Logger.info("Stopped repeating task due to end of frames"); + } + } +} diff --git a/src/main/java/com/alttd/frameSpawners/FrameSpawnerPlayer.java b/src/main/java/com/alttd/frameSpawners/FrameSpawnerPlayer.java new file mode 100644 index 0000000..f15de9f --- /dev/null +++ b/src/main/java/com/alttd/frameSpawners/FrameSpawnerPlayer.java @@ -0,0 +1,43 @@ +package com.alttd.frameSpawners; + +import com.alttd.config.Config; +import com.alttd.objects.Frame; +import com.alttd.util.Logger; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Iterator; +import java.util.List; + +public class FrameSpawnerPlayer extends BukkitRunnable { + + int amount; + List frames; + Iterator iterator; + Player player; + public FrameSpawnerPlayer(int amount, List frames, Player player) { + this.amount = amount; + this.frames = frames; + this.iterator = frames.iterator(); + this.player = player; + } + + @Override + public void run() { + if (!player.isOnline()) { + this.cancel(); + if (Config.DEBUG) + Logger.info("Stopped repeating task due to player offline."); + return; + } + if (iterator.hasNext()) + iterator.next().spawn(player.getLocation()); + else if (amount != 0) + iterator = frames.iterator(); + else { + this.cancel(); + if (Config.DEBUG) + Logger.info("Stopped repeating task due to end of frames."); + } + } +} diff --git a/src/main/java/com/alttd/gui/DefaultGUI.java b/src/main/java/com/alttd/gui/DefaultGUI.java new file mode 100644 index 0000000..9752474 --- /dev/null +++ b/src/main/java/com/alttd/gui/DefaultGUI.java @@ -0,0 +1,51 @@ +package com.alttd.gui; + +import net.kyori.adventure.text.Component; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.Merchant; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.HashMap; + +public class DefaultGUI implements GUI { + + protected final Inventory inventory; + protected final HashMap actions; + + public DefaultGUI(Component name) { + inventory = Bukkit.createInventory(null, InventoryType.CHEST, name); + actions = new HashMap<>(); + } + + public void setItem(int slot, @NotNull ItemStack item, @Nullable GUIAction action) { + inventory.setItem(slot, item); + if (action != null) + actions.put(slot, action); + } + + @Override + public void open(Player player) { + player.openInventory(inventory); + GUIByUUID.put(player.getUniqueId(), this); + } + + @Override + public GUIAction getAction(int slot) { + return actions.get(slot); + } + + @Override + public Inventory getInventory() { + return inventory; + } + + @Override + public Merchant getMerchant() { + return null; + } +} diff --git a/src/main/java/com/alttd/gui/GUI.java b/src/main/java/com/alttd/gui/GUI.java new file mode 100644 index 0000000..7461576 --- /dev/null +++ b/src/main/java/com/alttd/gui/GUI.java @@ -0,0 +1,20 @@ +package com.alttd.gui; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.Merchant; + +import java.util.HashMap; +import java.util.UUID; + +public interface GUI { + HashMap GUIByUUID = new HashMap<>(); + + void open(Player player); + + com.alttd.gui.GUIAction getAction(int slot); + + Inventory getInventory(); + + Merchant getMerchant(); +} diff --git a/src/main/java/com/alttd/gui/GUIAction.java b/src/main/java/com/alttd/gui/GUIAction.java new file mode 100644 index 0000000..fcf4d50 --- /dev/null +++ b/src/main/java/com/alttd/gui/GUIAction.java @@ -0,0 +1,7 @@ +package com.alttd.gui; + +import org.bukkit.entity.Player; + +public interface GUIAction { + void click(Player player); +} diff --git a/src/main/java/com/alttd/gui/GUIListener.java b/src/main/java/com/alttd/gui/GUIListener.java new file mode 100644 index 0000000..6ce133d --- /dev/null +++ b/src/main/java/com/alttd/gui/GUIListener.java @@ -0,0 +1,44 @@ +package com.alttd.gui; + +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class GUIListener implements Listener { + + /** + * Handles clicking inside a gui + * @param event gui click event + */ + @EventHandler + public void onClick(InventoryClickEvent event){ + if (!(event.getWhoClicked() instanceof Player player)){ + return; + } + + GUI gui = GUI.GUIByUUID.get(player.getUniqueId()); + if (gui == null || gui.getInventory() == null) + return; + if (!gui.getInventory().equals(event.getInventory())) + return; + event.setCancelled(true); + GUIAction action = gui.getAction(event.getSlot()); + + if (action != null){ + action.click(player); + } + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + GUI.GUIByUUID.remove(event.getPlayer().getUniqueId()); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event){ + GUI.GUIByUUID.remove(event.getPlayer().getUniqueId()); + } +} diff --git a/src/main/java/com/alttd/gui/actions/EnterParticleMenu.java b/src/main/java/com/alttd/gui/actions/EnterParticleMenu.java new file mode 100644 index 0000000..65b5072 --- /dev/null +++ b/src/main/java/com/alttd/gui/actions/EnterParticleMenu.java @@ -0,0 +1,23 @@ +package com.alttd.gui.actions; + +import com.alttd.gui.GUIAction; +import com.alttd.gui.windows.ChooseParticleGUI; +import com.alttd.objects.APartType; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.entity.Player; + +public class EnterParticleMenu implements GUIAction { + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + + private final APartType aPartType; + + public EnterParticleMenu(APartType aPartType) { + this.aPartType = aPartType; + } + + @Override + public void click(Player player) { + ChooseParticleGUI chooseParticleGUI = new ChooseParticleGUI(aPartType, miniMessage.deserialize(aPartType.getName())); + chooseParticleGUI.open(player); + } +} diff --git a/src/main/java/com/alttd/gui/actions/ToggleParticlesActive.java b/src/main/java/com/alttd/gui/actions/ToggleParticlesActive.java new file mode 100644 index 0000000..0df0e75 --- /dev/null +++ b/src/main/java/com/alttd/gui/actions/ToggleParticlesActive.java @@ -0,0 +1,23 @@ +package com.alttd.gui.actions; + +import com.alttd.gui.GUIAction; +import com.alttd.gui.windows.OpenParticleGUI; +import com.alttd.storage.PlayerSettings; +import org.bukkit.entity.Player; + +public class ToggleParticlesActive implements GUIAction { + + OpenParticleGUI openParticleGUI; + PlayerSettings playerSettings; + + public ToggleParticlesActive(OpenParticleGUI openParticleGUI, PlayerSettings playerSettings) { + this.openParticleGUI = openParticleGUI; + this.playerSettings = playerSettings; + } + + @Override + public void click(Player player) { + playerSettings.toggleParticlesActive(); + openParticleGUI.updateSettingSlots(playerSettings); + } +} diff --git a/src/main/java/com/alttd/gui/actions/ToggleSeeParticles.java b/src/main/java/com/alttd/gui/actions/ToggleSeeParticles.java new file mode 100644 index 0000000..3da708f --- /dev/null +++ b/src/main/java/com/alttd/gui/actions/ToggleSeeParticles.java @@ -0,0 +1,23 @@ +package com.alttd.gui.actions; + +import com.alttd.gui.GUIAction; +import com.alttd.gui.windows.OpenParticleGUI; +import com.alttd.storage.PlayerSettings; +import org.bukkit.entity.Player; + +public class ToggleSeeParticles implements GUIAction { + + OpenParticleGUI openParticleGUI; + PlayerSettings playerSettings; + + public ToggleSeeParticles(OpenParticleGUI openParticleGUI, PlayerSettings playerSettings) { + this.openParticleGUI = openParticleGUI; + this.playerSettings = playerSettings; + } + + @Override + public void click(Player player) { + playerSettings.toggleSeeingParticles(); + openParticleGUI.updateSettingSlots(playerSettings); + } +} diff --git a/src/main/java/com/alttd/gui/windows/ChooseParticleGUI.java b/src/main/java/com/alttd/gui/windows/ChooseParticleGUI.java new file mode 100644 index 0000000..e5ebf1b --- /dev/null +++ b/src/main/java/com/alttd/gui/windows/ChooseParticleGUI.java @@ -0,0 +1,11 @@ +package com.alttd.gui.windows; + +import com.alttd.gui.DefaultGUI; +import com.alttd.objects.APartType; +import net.kyori.adventure.text.Component; + +public class ChooseParticleGUI extends DefaultGUI { + public ChooseParticleGUI(APartType aPartType, Component name) { + super(name); + } +} diff --git a/src/main/java/com/alttd/gui/windows/OpenParticleGUI.java b/src/main/java/com/alttd/gui/windows/OpenParticleGUI.java new file mode 100644 index 0000000..10a5d44 --- /dev/null +++ b/src/main/java/com/alttd/gui/windows/OpenParticleGUI.java @@ -0,0 +1,95 @@ +package com.alttd.gui.windows; + +import com.alttd.config.Config; +import com.alttd.gui.DefaultGUI; +import com.alttd.gui.actions.EnterParticleMenu; +import com.alttd.gui.actions.ToggleParticlesActive; +import com.alttd.gui.actions.ToggleSeeParticles; +import com.alttd.objects.APartType; +import com.alttd.storage.PlayerSettings; +import com.alttd.util.Logger; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.minimessage.Template; +import net.kyori.adventure.text.minimessage.template.TemplateResolver; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Arrays; + +public class OpenParticleGUI extends DefaultGUI { + + private static final MiniMessage miniMessage = MiniMessage.miniMessage(); + private static final Component GUIName; + private static final ItemStack seeOthersOn, seeOthersOff, particlesOn, particlesOff; + + public OpenParticleGUI(Player player) { + super(GUIName); + int i = 10; + for (APartType particlesType : APartType.values()) { + if (i > 25) { + Logger.warning("Unable to add the rest of the particles to the GUI (ran out of space)"); + break; + } + if (i == 17) + i = 19; + setItem(i++, particlesType.getItemStack(), new EnterParticleMenu(particlesType)); + } + PlayerSettings playerSettings = PlayerSettings.getPlayer(player.getUniqueId()); + if (playerSettings == null) + return; + setItem(17, playerSettings.isSeeingParticles() ? seeOthersOn : seeOthersOff, new ToggleSeeParticles(this, playerSettings)); + setItem(26, playerSettings.hasActiveParticles() ? particlesOn : particlesOff, new ToggleParticlesActive(this, playerSettings)); + } + + public void updateSettingSlots(PlayerSettings playerSettings) { + setItem(17, playerSettings.isSeeingParticles() ? seeOthersOn : seeOthersOff, new ToggleSeeParticles(this, playerSettings)); + setItem(26, playerSettings.hasActiveParticles() ? particlesOn : particlesOff, new ToggleParticlesActive(this, playerSettings)); + } + + static { //Init gui name + GUIName = miniMessage.deserialize(Config.PARTICLE_TYPE_GUI_NAME); + } + + static { //init APart items + Arrays.stream(APartType.values()).forEach(particlesType -> { + ItemStack itemStack = new ItemStack(particlesType.getMaterial()); + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(Config.PARTICLE_TYPE_BUTTON_NAME, + TemplateResolver.resolving(Template.template("name", particlesType.getName())))); + itemStack.setItemMeta(itemMeta); + particlesType.setItemStack(itemStack); + }); + } + + static { //init setting buttons + ItemMeta itemMeta; + + seeOthersOn = new ItemStack(Material.PLAYER_HEAD); + itemMeta = seeOthersOn.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(Config.SEE_OTHERS_ON)); + itemMeta.displayName(miniMessage.deserialize(Config.SEE_OTHERS_ON_DESC)); + seeOthersOn.setItemMeta(itemMeta); + + seeOthersOff = new ItemStack(Material.SKELETON_SKULL); + itemMeta = seeOthersOff.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(Config.SEE_OTHERS_OFF)); + itemMeta.displayName(miniMessage.deserialize(Config.SEE_OTHERS_OFF_DESC)); + seeOthersOff.setItemMeta(itemMeta); + + particlesOn = new ItemStack(Material.PLAYER_HEAD); + itemMeta = particlesOn.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(Config.PARTICLES_ON)); + itemMeta.displayName(miniMessage.deserialize(Config.PARTICLES_ON_DESC)); + particlesOn.setItemMeta(itemMeta); + + particlesOff = new ItemStack(Material.PLAYER_HEAD); + itemMeta = particlesOff.getItemMeta(); + itemMeta.displayName(miniMessage.deserialize(Config.PARTICLES_OFF)); + itemMeta.displayName(miniMessage.deserialize(Config.PARTICLES_OFF_DESC)); + particlesOff.setItemMeta(itemMeta); + } +} diff --git a/src/main/java/com/alttd/listeners/BlockBreakListener.java b/src/main/java/com/alttd/listeners/BlockBreakListener.java new file mode 100644 index 0000000..e449366 --- /dev/null +++ b/src/main/java/com/alttd/listeners/BlockBreakListener.java @@ -0,0 +1,28 @@ +package com.alttd.listeners; + +import com.alttd.objects.APartType; +import com.alttd.objects.ParticleSet; +import com.alttd.storage.PlayerSettings; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; + +import java.util.List; + +public class BlockBreakListener implements Listener { + private final List particlesToActivate; + public BlockBreakListener(APartType... particleTypes) { + particlesToActivate = List.of(particleTypes); + } + + public void onBlockBreak(BlockBreakEvent event) { + PlayerSettings player = PlayerSettings.getPlayer(event.getPlayer().getUniqueId()); + if (!player.hasActiveParticles()) + return; + particlesToActivate.forEach(aPartType -> { + ParticleSet particleSet = player.getParticles(aPartType); + if (particleSet == null) + return; + particleSet.run(event.getBlock().getLocation()); + }); + } +} diff --git a/src/main/java/com/alttd/listeners/BlockPlaceListener.java b/src/main/java/com/alttd/listeners/BlockPlaceListener.java new file mode 100644 index 0000000..32e7669 --- /dev/null +++ b/src/main/java/com/alttd/listeners/BlockPlaceListener.java @@ -0,0 +1,28 @@ +package com.alttd.listeners; + +import com.alttd.objects.APartType; +import com.alttd.objects.ParticleSet; +import com.alttd.storage.PlayerSettings; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; + +import java.util.List; + +public class BlockPlaceListener implements Listener { + private final List particlesToActivate; + public BlockPlaceListener(APartType... particleTypes) { + particlesToActivate = List.of(particleTypes); + } + + public void onBlockPlace(BlockPlaceEvent event) { + PlayerSettings player = PlayerSettings.getPlayer(event.getPlayer().getUniqueId()); + if (!player.hasActiveParticles()) + return; + particlesToActivate.forEach(aPartType -> { + ParticleSet particleSet = player.getParticles(aPartType); + if (particleSet == null) + return; + particleSet.run(event.getBlock().getLocation()); + }); + } +} diff --git a/src/main/java/com/alttd/listeners/PlayerJoinListener.java b/src/main/java/com/alttd/listeners/PlayerJoinListener.java new file mode 100644 index 0000000..4d75d44 --- /dev/null +++ b/src/main/java/com/alttd/listeners/PlayerJoinListener.java @@ -0,0 +1,27 @@ +package com.alttd.listeners; + +import com.alttd.AltitudeParticles; +import com.alttd.database.Queries; +import com.alttd.storage.PlayerSettings; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.UUID; + +public class PlayerJoinListener implements Listener { + + public void onPlayerJoin(PlayerJoinEvent event) { + new BukkitRunnable() { + @Override + public void run() { + UUID uuid = event.getPlayer().getUniqueId(); + PlayerSettings playerSettings = PlayerSettings.getPlayer(uuid); + if (playerSettings == null) Queries.getPlayerSettings(uuid); + + //TODO activate particles sync/async??? + } + }.runTaskAsynchronously(AltitudeParticles.getInstance()); + } + +} diff --git a/src/main/java/com/alttd/objects/APartType.java b/src/main/java/com/alttd/objects/APartType.java new file mode 100644 index 0000000..a14327b --- /dev/null +++ b/src/main/java/com/alttd/objects/APartType.java @@ -0,0 +1,40 @@ +package com.alttd.objects; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public enum APartType { //TODO add description? + HEAD("Head", Material.PLAYER_HEAD, null), + TRAIL("Trail", Material.GOLD_INGOT, null), + BREAK_PLACE_BLOCK("Break/place block", Material.GRASS_BLOCK, null), + DEATH("Death", Material.SKELETON_SKULL, null), + ATTACK_CLOSE("Attack CQC", Material.DIAMOND_SWORD, null), + ATTACK_RANGE("Attack ranged", Material.BOW, null), + TELEPORT_ARRIVE("Teleport", Material.DRAGON_EGG, null); + + private final String name; + private final Material material; + private ItemStack itemStack; + + public String getName() { + return name; + } + + public Material getMaterial() { + return material; + } + + public ItemStack getItemStack() { + return itemStack; + } + + public void setItemStack(ItemStack itemStack) { + this.itemStack = itemStack; + } + + APartType(String name, Material material, ItemStack itemStack) { + this.name = name; + this.material = material; + } + +} diff --git a/src/main/java/com/alttd/objects/Frame.java b/src/main/java/com/alttd/objects/Frame.java new file mode 100644 index 0000000..557a89f --- /dev/null +++ b/src/main/java/com/alttd/objects/Frame.java @@ -0,0 +1,24 @@ +package com.alttd.objects; + +import com.destroystokyo.paper.ParticleBuilder; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.List; + +public class Frame { + List particles; + + public Frame(List particles) { + this.particles = particles; + } + + /** + * Spawns all particles in a frame (CALL ASYNC) + * + * @param location Location to spawn particles at + */ + public void spawn(Location location) { + particles.forEach(particleBuilder -> particleBuilder.location(location).spawn()); + } +} diff --git a/src/main/java/com/alttd/objects/ParticleSet.java b/src/main/java/com/alttd/objects/ParticleSet.java new file mode 100644 index 0000000..d7b121a --- /dev/null +++ b/src/main/java/com/alttd/objects/ParticleSet.java @@ -0,0 +1,37 @@ +package com.alttd.objects; + +import com.alttd.AltitudeParticles; +import com.alttd.frameSpawners.FrameSpawnerLocation; +import com.alttd.frameSpawners.FrameSpawnerPlayer; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.List; + +public class ParticleSet { + + List frames; + int delay, repeat; + APartType particlesType; + boolean shouldRepeat; + int ticksUntilNextFrame; + + public ParticleSet(List frames, int delay, int repeat, APartType particlesType) { + this.frames = frames; + this.delay = delay; + this.repeat = repeat; + this.particlesType = particlesType; + this.shouldRepeat = repeat < 0; + ticksUntilNextFrame = delay; + } + + public void run(Location location) { + FrameSpawnerLocation frameSpawnerLocation = new FrameSpawnerLocation(repeat, frames, location); + frameSpawnerLocation.runTaskTimerAsynchronously(AltitudeParticles.getInstance(), 0, delay); + } + + public void run(Player player) { + FrameSpawnerPlayer frameSpawnerPlayer = new FrameSpawnerPlayer(repeat, frames, player); + frameSpawnerPlayer.runTaskTimerAsynchronously(AltitudeParticles.getInstance(), 0, delay); + } +} diff --git a/src/main/java/com/alttd/storage/PlayerSettings.java b/src/main/java/com/alttd/storage/PlayerSettings.java new file mode 100644 index 0000000..39100ec --- /dev/null +++ b/src/main/java/com/alttd/storage/PlayerSettings.java @@ -0,0 +1,66 @@ +package com.alttd.storage; + +import com.alttd.objects.APartType; +import com.alttd.objects.ParticleSet; + +import java.util.HashMap; +import java.util.UUID; + +public class PlayerSettings { + + private static final HashMap playerSettingsMap = new HashMap<>(); + + private boolean particlesActive, seeingParticles; + private final UUID uuid; + private final HashMap particles; + + public PlayerSettings(boolean particlesActive, boolean seeingParticles, UUID uuid, HashMap particles) { + this.particlesActive = particlesActive; + this.seeingParticles = seeingParticles; + this.uuid = uuid; + this.particles = particles; + + playerSettingsMap.put(uuid, this); + } + + public PlayerSettings(boolean particlesActive, boolean seeingParticles, UUID uuid) { + this.particlesActive = particlesActive; + this.seeingParticles = seeingParticles; + this.uuid = uuid; + this.particles = new HashMap<>(); + + playerSettingsMap.put(uuid, this); + } + + public boolean hasActiveParticles() { + return particlesActive; + } + + public void toggleParticlesActive() { + particlesActive = !particlesActive; + } + + public boolean isSeeingParticles() { + return seeingParticles; + } + + public void toggleSeeingParticles() { + seeingParticles = !seeingParticles; + } + + public UUID getUuid() { + return uuid; + } + + public HashMap getParticles() { + return particles; + } + + public ParticleSet getParticles(APartType aPartType) { + return particles.get(aPartType); + } + + public static PlayerSettings getPlayer(UUID uuid) { + return playerSettingsMap.get(uuid); + } +}