From 80d65bc2f42c7331a5a953821f0d1e6bbe4387ae Mon Sep 17 00:00:00 2001 From: Luka de Vrij Date: Fri, 5 Jan 2024 22:12:31 +0100 Subject: [PATCH] i am going insane --- PureKitsFork/pom.xml | 8 + .../purekitpvp/AbstractInventory.java | 14 +- .../lifelessnerd/purekitpvp/PureKitPvP.java | 26 ++- .../cosmeticsListeners/ProjectileTrail.java | 14 +- .../purekitpvp/database/KitDatabase.java | 73 +++++++++ .../entities/PlayerKitPreferences.java | 57 +++++++ .../purekitpvp/files/lang/LanguageConfig.java | 5 + .../purekitpvp/files/lang/LanguageKey.java | 5 + .../purekitpvp/kitCommand/GUIListener.java | 2 +- .../purekitpvp/kitCommand/GetKit.java | 20 ++- .../kitCommand/KitPreferencesInventory.java | 150 ++++++++++++++++++ .../kitCommand/KitPreviewInventory.java | 62 ++++++-- .../purekitpvp/kitadmin/EditKitInventory.java | 9 +- .../me/lifelessnerd/purekitpvp/sample.java | 9 +- 14 files changed, 423 insertions(+), 31 deletions(-) create mode 100644 PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/KitDatabase.java create mode 100644 PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/entities/PlayerKitPreferences.java create mode 100644 PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreferencesInventory.java diff --git a/PureKitsFork/pom.xml b/PureKitsFork/pom.xml index 9dddbbe..b3e9955 100644 --- a/PureKitsFork/pom.xml +++ b/PureKitsFork/pom.xml @@ -111,6 +111,7 @@ sonatype-snapshots https://oss.sonatype.org/content/repositories/snapshots/ + @@ -125,5 +126,12 @@ bukkit-sidebar 6.2.5-SNAPSHOT + + + com.j256.ormlite + ormlite-jdbc + 6.1 + + diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/AbstractInventory.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/AbstractInventory.java index fb32a53..e3748c6 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/AbstractInventory.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/AbstractInventory.java @@ -6,8 +6,10 @@ import org.bukkit.Bukkit; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.inventory.Inventory; import org.bukkit.plugin.Plugin; @@ -17,7 +19,7 @@ public abstract class AbstractInventory implements Listener { public AbstractInventory(int size, Component title, Plugin plugin) { this.plugin = plugin; - // Create a new inventory, with no owner (as this isn't a real inventory), a size of nine, called example + // Create a new inventory, with no owner (as this isn't a real inventory) inv = Bukkit.createInventory(null, size, title); plugin.getServer().getPluginManager().registerEvents(this, plugin); } @@ -31,6 +33,10 @@ public abstract class AbstractInventory implements Listener { ent.openInventory(inv); } + public void unregisterEvents(){ + HandlerList.unregisterAll(this); + + } // Check for clicks on items @EventHandler public void onInventoryClick(final InventoryClickEvent e) { @@ -46,4 +52,10 @@ public abstract class AbstractInventory implements Listener { } public abstract void onInventoryClickLogic(final InventoryClickEvent e); + @EventHandler + public void onInventoryClose(InventoryCloseEvent e){ + if (!e.getInventory().equals(inv)) return; + HandlerList.unregisterAll(this); + } + } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/PureKitPvP.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/PureKitPvP.java index 9890af1..01cdc56 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/PureKitPvP.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/PureKitPvP.java @@ -4,6 +4,7 @@ import me.lifelessnerd.purekitpvp.combathandlers.leveling.PlayerLevelChat; import me.lifelessnerd.purekitpvp.combathandlers.killhandler.Suicide; import me.lifelessnerd.purekitpvp.combathandlers.mobhandler.OnPlayerSpawnMob; import me.lifelessnerd.purekitpvp.combathandlers.killhandler.DeathHandler; +import me.lifelessnerd.purekitpvp.database.KitDatabase; import me.lifelessnerd.purekitpvp.files.lang.LanguageConfig; import me.lifelessnerd.purekitpvp.globalevents.events.DoubleHealthListeners; import me.lifelessnerd.purekitpvp.scoreboards.SidebarScoreboard; @@ -26,10 +27,14 @@ import me.lifelessnerd.purekitpvp.kitCommand.KitsGUI; import me.lifelessnerd.purekitpvp.noncombatstats.commands.GetStats; import me.lifelessnerd.purekitpvp.noncombatstats.listeners.ArrowsShotStat; import me.lifelessnerd.purekitpvp.noncombatstats.listeners.ProjectilesThrownStat; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; +import java.sql.SQLException; + public final class PureKitPvP extends JavaPlugin { + private KitDatabase kitDatabase; @Override public void onEnable() { PerkFireHandler.plugin = this; //idk? fixes npe? @@ -39,13 +44,23 @@ public final class PureKitPvP extends JavaPlugin { getConfig().options().copyDefaults(); saveConfig(); + //Database + try { + // Ensure the plugin's data folder exists + if (!getDataFolder().exists()) { + getDataFolder().mkdirs(); + } + + kitDatabase = new KitDatabase(getDataFolder().getAbsolutePath() + "/kitdatabase.db"); + } catch (SQLException e) { + e.printStackTrace(); + System.out.println("Failed to connect to database! " + e.getMessage()); + Bukkit.getPluginManager().disablePlugin(this); + } + //Kits config KitConfig.setup(); KitConfig.get().addDefault("kits", ""); - //Might create problems, I tried to just keep value null but then the entire value didn't show up until I created a kit - //Which is not too bad either so whatever, if there are any problems ever change this and hope for the best - //Otherwise find a way to make a path without a value, like: kits: , instead of kits: '' - //: fix this with createConfiguration if I feel like it, tbf it works fine (IT DOES) KitConfig.get().options().copyDefaults(true); KitConfig.save(); @@ -126,5 +141,8 @@ public final class PureKitPvP extends JavaPlugin { getLogger().info("Goodbye!"); } + public KitDatabase getKitDatabase() { + return kitDatabase; + } } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/cosmetics/cosmeticsListeners/ProjectileTrail.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/cosmetics/cosmeticsListeners/ProjectileTrail.java index 6e2a977..89ef64e 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/cosmetics/cosmeticsListeners/ProjectileTrail.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/cosmetics/cosmeticsListeners/ProjectileTrail.java @@ -100,25 +100,25 @@ public class ProjectileTrail implements Listener { case "none": return; case "flame": - location.getWorld().spawnParticle(Particle.FLAME, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.FLAME, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "sparkle": - location.getWorld().spawnParticle(Particle.END_ROD, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.END_ROD, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "water_drip": - location.getWorld().spawnParticle(Particle.DRIP_WATER, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.DRIP_WATER, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "heart": - location.getWorld().spawnParticle(Particle.HEART, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.HEART, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "firework": - location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "totem": - location.getWorld().spawnParticle(Particle.TOTEM, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.TOTEM, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; case "smoke": - location.getWorld().spawnParticle(Particle.CAMPFIRE_COSY_SMOKE, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, true); + location.getWorld().spawnParticle(Particle.CAMPFIRE_COSY_SMOKE, location, plugin.getConfig().getInt("projectile-trail-count"), 0.1, 0.1, 0.1, 0.001, null, true); break; default: break; diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/KitDatabase.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/KitDatabase.java new file mode 100644 index 0000000..a6faa27 --- /dev/null +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/KitDatabase.java @@ -0,0 +1,73 @@ +package me.lifelessnerd.purekitpvp.database; + +import com.j256.ormlite.dao.Dao; +import com.j256.ormlite.dao.DaoManager; +import com.j256.ormlite.jdbc.JdbcConnectionSource; +import com.j256.ormlite.stmt.QueryBuilder; +import com.j256.ormlite.support.ConnectionSource; +import com.j256.ormlite.table.TableUtils; +import me.lifelessnerd.purekitpvp.database.entities.PlayerKitPreferences; +import org.bukkit.entity.Player; + +import java.sql.SQLException; +import java.util.HashMap; + +public class KitDatabase { + + private final Dao playerKitPreferencesDao; + + public KitDatabase(String path) throws SQLException { + ConnectionSource connectionSource = new JdbcConnectionSource("jdbc:sqlite:" + path); + TableUtils.createTableIfNotExists(connectionSource, PlayerKitPreferences.class); + playerKitPreferencesDao = DaoManager.createDao(connectionSource, PlayerKitPreferences.class); + } + + public void addEntry(Player player, String kitName, HashMap prefs) throws SQLException { + if (hasEntry(player, kitName)){ + updateEntry(player, kitName, prefs); + return; + } + PlayerKitPreferences playerKitPreferences = new PlayerKitPreferences(); + playerKitPreferences.setUuid(player.getUniqueId().toString()); + playerKitPreferences.setUsername(player.getName()); + playerKitPreferences.setKitName(kitName); + playerKitPreferences.setPreferences(prefs); + playerKitPreferencesDao.create(playerKitPreferences); + } + + + public boolean hasEntry(Player player, String kitName) throws SQLException { + // Query for a user with the specified uuid and kitName + QueryBuilder queryBuilder = playerKitPreferencesDao.queryBuilder(); + queryBuilder.where().eq("uuid", player.getUniqueId().toString()).and().eq("kitName", kitName); + // Check if any records match the criteria + return queryBuilder.queryForFirst() != null; + + } + + public void updateEntry(Player player, String kitName, HashMap prefs) throws SQLException { + QueryBuilder queryBuilder = playerKitPreferencesDao.queryBuilder(); + queryBuilder.where().eq("uuid", player.getUniqueId().toString()).and().eq("kitName", kitName); + + PlayerKitPreferences playerKitPreferences = queryBuilder.queryForFirst(); + if (playerKitPreferences != null) { + playerKitPreferences.setPreferences(prefs); + playerKitPreferencesDao.update(playerKitPreferences); + } else { + addEntry(player, kitName, prefs); + } + + } + + public PlayerKitPreferences getEntry(Player player, String kitName) throws SQLException { + if (!hasEntry(player, kitName)){ + HashMap emptyMap = new HashMap<>(); + addEntry(player, kitName, emptyMap); + } + // Query for a user with the specified uuid and kitName + QueryBuilder queryBuilder = playerKitPreferencesDao.queryBuilder(); + queryBuilder.where().eq("uuid", player.getUniqueId().toString()).and().eq("kitName", kitName); + // Check if any records match the criteria + return queryBuilder.queryForFirst(); + } +} diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/entities/PlayerKitPreferences.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/entities/PlayerKitPreferences.java new file mode 100644 index 0000000..6f6768e --- /dev/null +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/database/entities/PlayerKitPreferences.java @@ -0,0 +1,57 @@ +package me.lifelessnerd.purekitpvp.database.entities; + +import com.j256.ormlite.field.DataType; +import com.j256.ormlite.field.DatabaseField; +import com.j256.ormlite.table.DatabaseTable; + +import java.util.HashMap; + +@DatabaseTable(tableName = "player_kit_preferences") +public class PlayerKitPreferences { + + @DatabaseField(generatedId = true, canBeNull = false) + private int id; + @DatabaseField(canBeNull = false) + private String uuid; + @DatabaseField(canBeNull = false) + private String username; + @DatabaseField(canBeNull = false) + private String kitName; + @DatabaseField(dataType = DataType.SERIALIZABLE) + private HashMap preferences; + + public PlayerKitPreferences() { + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getKitName() { + return kitName; + } + + public void setKitName(String kitName) { + this.kitName = kitName; + } + + public HashMap getPreferences() { + return preferences; + } + + public void setPreferences(HashMap preferences) { + this.preferences = preferences; + } +} diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageConfig.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageConfig.java index 51c073e..53daa6d 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageConfig.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageConfig.java @@ -149,6 +149,11 @@ public class LanguageConfig { defaults.put(LanguageKey.KITS_GUI_PREVIEW_TITLE, "&aKit Preview > &b%KIT%"); defaults.put(LanguageKey.KITS_GUI_PREVIEW_TEXT, "&aRight click to preview."); defaults.put(LanguageKey.KITS_GUI_PREVIEW_STATS, "&6Global Stats"); + defaults.put(LanguageKey.KITS_GUI_PREVIEW_PREFS, "&6Customize layout"); + defaults.put(LanguageKey.KITS_GUI_PREFS_TITLE, "&6Customizing > &b%KIT%"); + defaults.put(LanguageKey.KITS_GUI_PREFS_SAVE, "&6Save custom layout"); + defaults.put(LanguageKey.KITS_GUI_PREFS_SAVED, "&6Custom layout saved!"); + defaults.put(LanguageKey.KITS_GUI_PREFS_BACK, "&6Back to kit preview"); defaults.put(LanguageKey.KITS_GUI_PREVIEW_SELECT, "&aSelect Kit"); defaults.put(LanguageKey.KITS_GUI_PREVIEW_BACK, "&aBack to Kits"); defaults.put(LanguageKey.KITS_GUI_EDIT_SAVE, "&aSave Kit"); diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageKey.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageKey.java index 3b70834..466a557 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageKey.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/files/lang/LanguageKey.java @@ -60,6 +60,11 @@ public enum LanguageKey { KITS_GUI_PREVIEW_TITLE, KITS_GUI_PREVIEW_TEXT, KITS_GUI_PREVIEW_STATS, + KITS_GUI_PREVIEW_PREFS, + KITS_GUI_PREFS_TITLE, + KITS_GUI_PREFS_SAVE, + KITS_GUI_PREFS_SAVED, + KITS_GUI_PREFS_BACK, KITS_GUI_PREVIEW_SELECT, KITS_GUI_PREVIEW_BACK, KITS_GUI_EDIT_SAVE, diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GUIListener.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GUIListener.java index b28bab8..79f287e 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GUIListener.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GUIListener.java @@ -51,7 +51,7 @@ public class GUIListener implements Listener { KitPreviewInventory kitPreviewInventory = new KitPreviewInventory(54, LanguageConfig.lang.get("KITS_GUI_PREVIEW_TITLE").replaceText(ComponentUtils.replaceConfig("%KIT%", displayName)), plugin, - displayName); + displayName, player); kitPreviewInventory.openInventory(player); return; } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GetKit.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GetKit.java index fec84ce..5a9791e 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GetKit.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/GetKit.java @@ -1,5 +1,8 @@ package me.lifelessnerd.purekitpvp.kitCommand; +import me.lifelessnerd.purekitpvp.PureKitPvP; +import me.lifelessnerd.purekitpvp.database.KitDatabase; +import me.lifelessnerd.purekitpvp.database.entities.PlayerKitPreferences; import me.lifelessnerd.purekitpvp.files.KitConfig; import me.lifelessnerd.purekitpvp.files.KitStatsConfig; import me.lifelessnerd.purekitpvp.files.lang.LanguageConfig; @@ -20,8 +23,11 @@ import org.bukkit.potion.PotionEffect; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class GetKit implements TabExecutor, Listener { Plugin plugin; @@ -94,13 +100,25 @@ public class GetKit implements TabExecutor, Listener { for (PotionEffect effect : player.getActivePotionEffects()) player.removePotionEffect(effect.getType()); + Map playerPrefs = new HashMap<>(); + PureKitPvP pureKitPvP = (PureKitPvP) plugin; + KitDatabase db = pureKitPvP.getKitDatabase(); + try { + if(db.hasEntry(player, kitNameArg)){ + PlayerKitPreferences playerKitPreferences = db.getEntry(player, kitNameArg); + playerPrefs = playerKitPreferences.getPreferences(); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + //Give items for (int index = 0; index < kitItems.size(); index++) { ItemStack item = kitItems.get(index); if (item == null) { item = new ItemStack(Material.AIR); } - player.getInventory().setItem(index, item); + player.getInventory().setItem(playerPrefs.getOrDefault(index, index), item); } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreferencesInventory.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreferencesInventory.java new file mode 100644 index 0000000..32dc6c3 --- /dev/null +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreferencesInventory.java @@ -0,0 +1,150 @@ +package me.lifelessnerd.purekitpvp.kitCommand; + +import me.lifelessnerd.purekitpvp.AbstractInventory; +import me.lifelessnerd.purekitpvp.PureKitPvP; +import me.lifelessnerd.purekitpvp.database.KitDatabase; +import me.lifelessnerd.purekitpvp.database.entities.PlayerKitPreferences; +import me.lifelessnerd.purekitpvp.files.KitConfig; +import me.lifelessnerd.purekitpvp.files.lang.LanguageConfig; +import me.lifelessnerd.purekitpvp.files.lang.LanguageKey; +import me.lifelessnerd.purekitpvp.utils.ComponentUtils; +import net.kyori.adventure.text.Component; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.inventory.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.plugin.Plugin; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class KitPreferencesInventory extends AbstractInventory { + String kitName; + Player player; + KitDatabase db; + public KitPreferencesInventory(int size, Component title, Plugin plugin, String kitName, Player toBeShownPlayer) { + super(size, title, plugin); + this.kitName = kitName; + this.player = toBeShownPlayer; + PureKitPvP pureKitPvP = (PureKitPvP) this.plugin; + db = pureKitPvP.getKitDatabase(); + initializeItems(); + } + + @Override + public void initializeItems() { + FileConfiguration fileConfiguration = KitConfig.get(); + List kitItems = (List) fileConfiguration.get("kits." + kitName + ".contents"); + + Map playerPrefs = new HashMap<>(); + try { + if(db.hasEntry(player, kitName)){ + PlayerKitPreferences playerKitPreferences = db.getEntry(player, kitName); + playerPrefs = playerKitPreferences.getPreferences(); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + + for (int index = 0; index < kitItems.size(); index++) { + ItemStack item = kitItems.get(index); + if (item == null) continue; + ItemMeta meta = item.getItemMeta(); + // Sets defaults indices as PDC - only after this we shift stuff around + meta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_GUI_PREFS_INDEX"), PersistentDataType.INTEGER, index); + item.setItemMeta(meta); + + inv.setItem(playerPrefs.getOrDefault(index, index), item); + } + + ItemStack redStainedGlass = new ItemStack(Material.RED_STAINED_GLASS_PANE, 1); + ItemMeta glassMeta = redStainedGlass.getItemMeta(); + glassMeta.displayName(Component.text("")); + redStainedGlass.setItemMeta(glassMeta); + + for (int i = 41; i < 54; i++) inv.setItem(i, redStainedGlass); + + ItemStack greenConcrete = new ItemStack(Material.GREEN_CONCRETE, 1); + ItemMeta saveMeta = greenConcrete.getItemMeta(); + saveMeta.displayName(LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREFS_SAVE.toString())); + greenConcrete.setItemMeta(saveMeta); + inv.setItem(49, greenConcrete); + + ItemStack arrow = new ItemStack(Material.ARROW, 1); + ItemMeta backMeta = arrow.getItemMeta(); + backMeta.displayName(LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREFS_BACK.toString())); + arrow.setItemMeta(backMeta); + inv.setItem(48, arrow); + + } + + @Override + public void onInventoryClickLogic(InventoryClickEvent e) { + if (e.getSlot() < 41){ + e.setCancelled(false); + return; + } + if (e.getSlot() >= 41) { // red panes + e.setCancelled(true); + } + if (e.getSlot() == 48){ // back button + KitPreviewInventory kitPreviewInventory = new KitPreviewInventory(54, + LanguageConfig.lang.get("KITS_GUI_PREVIEW_TITLE").replaceText(ComponentUtils.replaceConfig("%KIT%", kitName)), + plugin, + kitName, player); + kitPreviewInventory.openInventory(player); + return; + } + if (e.getSlot() == 49) { // save icon + + HashMap newPrefs = new HashMap<>(); + // See changes in inventory + int index = 0; + for (ItemStack item : inv.getContents()){ + if (index >= 41) break; + if (item == null) { + index++; + continue; + } + ItemMeta itemMeta = item.getItemMeta(); + int oldIndex = itemMeta.getPersistentDataContainer().get(new NamespacedKey(plugin, "KITS_GUI_PREFS_INDEX"), PersistentDataType.INTEGER); + if (oldIndex != index){ // Change is different from standard! + System.out.println("change! item that was on " + oldIndex + " now on " + index); + newPrefs.put(oldIndex, index); + } + index++; + } + + // Update db pref value + try { + db.updateEntry(player, kitName, newPrefs); + } catch(Exception ex){ + throw new RuntimeException(ex); + } + player.sendMessage(LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREFS_SAVED.toString())); + return; + } + e.setCancelled(true); // ensures no listeners are fighting + } + + @EventHandler + public void onInventoryMove(InventoryClickEvent e){ + System.out.println(e.getRawSlot()); + + if (!e.getView().getTopInventory().equals(inv)) return; + if (!e.getView().getBottomInventory().getType().equals(InventoryType.PLAYER)) return; + + if (e.getRawSlot() >= 54){ // TODO + e.setCancelled(true); + } + } + +} diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreviewInventory.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreviewInventory.java index ef7504a..8a4c5e2 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreviewInventory.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitCommand/KitPreviewInventory.java @@ -1,9 +1,14 @@ package me.lifelessnerd.purekitpvp.kitCommand; import me.lifelessnerd.purekitpvp.AbstractInventory; +import me.lifelessnerd.purekitpvp.PureKitPvP; +import me.lifelessnerd.purekitpvp.database.KitDatabase; +import me.lifelessnerd.purekitpvp.database.entities.PlayerKitPreferences; import me.lifelessnerd.purekitpvp.files.KitConfig; import me.lifelessnerd.purekitpvp.files.KitStatsConfig; import me.lifelessnerd.purekitpvp.files.lang.LanguageConfig; +import me.lifelessnerd.purekitpvp.files.lang.LanguageKey; +import me.lifelessnerd.purekitpvp.utils.ComponentUtils; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; @@ -18,30 +23,45 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import org.bukkit.plugin.Plugin; +import java.sql.SQLException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class KitPreviewInventory extends AbstractInventory { public String kitName; + KitDatabase db; + Player player; - public KitPreviewInventory(int size, Component title, Plugin plugin, String kitName) { + public KitPreviewInventory(int size, Component title, Plugin plugin, String kitName, Player playerToBeShown) { super(size, title, plugin); this.kitName = kitName; + this.player = playerToBeShown; + PureKitPvP pureKitPvP = (PureKitPvP) this.plugin; + db = pureKitPvP.getKitDatabase(); initializeItems(); } @Override public void initializeItems() { FileConfiguration fileConfiguration = KitConfig.get(); - System.out.println(kitName); List kitItems = (List) fileConfiguration.get("kits." + kitName + ".contents"); + Map playerPrefs = new HashMap<>(); + try { + if(db.hasEntry(player, kitName)){ + PlayerKitPreferences playerKitPreferences = db.getEntry(player, kitName); + playerPrefs = playerKitPreferences.getPreferences(); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } + for (int index = 0; index < kitItems.size(); index++) { ItemStack item = kitItems.get(index); - if (item == null) { - item = new ItemStack(Material.AIR); - } - inv.setItem(index, item); + if (item == null) continue; + inv.setItem(playerPrefs.getOrDefault(index, index), item); } ItemStack redStainedGlass = new ItemStack(Material.RED_STAINED_GLASS_PANE, 1); @@ -62,14 +82,22 @@ public class KitPreviewInventory extends AbstractInventory { selectItem.setItemMeta(selectMeta); inv.setItem(50, selectItem); - ItemStack anvil = new ItemStack(Material.ANVIL, 1); - ItemMeta anvilMeta = anvil.getItemMeta(); - anvilMeta.displayName(LanguageConfig.lang.get("KITS_GUI_PREVIEW_STATS")); - anvilMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM"), PersistentDataType.STRING, "Stats"); + ItemStack paper = new ItemStack(Material.PAPER, 1); + ItemMeta paperMeta = paper.getItemMeta(); + paperMeta.displayName(LanguageConfig.lang.get("KITS_GUI_PREVIEW_STATS")); + paperMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM"), PersistentDataType.STRING, "Stats"); ArrayList lore2 = new ArrayList<>(); int kitChosen = KitStatsConfig.get().getInt(kitName); lore2.add(Component.text("Times Chosen: ", NamedTextColor.AQUA).append(Component.text(kitChosen, NamedTextColor.GREEN)).decoration(TextDecoration.ITALIC, false)); - anvilMeta.lore(lore2); + paperMeta.lore(lore2); + paper.setItemMeta(paperMeta); + inv.setItem(51, paper); + + ItemStack anvil = new ItemStack(Material.ANVIL, 1); + ItemMeta anvilMeta = anvil.getItemMeta(); + anvilMeta.displayName(LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREVIEW_PREFS.toString())); + anvilMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM"), PersistentDataType.STRING, "Edit"); + anvilMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM_KIT"), PersistentDataType.STRING, kitName); anvil.setItemMeta(anvilMeta); inv.setItem(49, anvil); @@ -87,12 +115,13 @@ public class KitPreviewInventory extends AbstractInventory { ItemStack clickedItem = e.getCurrentItem(); Player player = (Player) e.getWhoClicked(); InventoryView inv = e.getView(); + String kitName; if (clickedItem.getItemMeta().getPersistentDataContainer().has(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM"))){ String pdcValue = clickedItem.getItemMeta().getPersistentDataContainer().get(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM"), PersistentDataType.STRING); switch(pdcValue){ case "Select": - String kitName = clickedItem.getItemMeta().getPersistentDataContainer().get(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM_KIT"), PersistentDataType.STRING); + kitName = clickedItem.getItemMeta().getPersistentDataContainer().get(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM_KIT"), PersistentDataType.STRING); player.chat("/getkit " + kitName); player.closeInventory(); break; @@ -102,6 +131,15 @@ public class KitPreviewInventory extends AbstractInventory { case "Back": player.chat("/kit"); break; + case "Edit": + kitName = clickedItem.getItemMeta().getPersistentDataContainer().get(new NamespacedKey(plugin, "KITS_PREVIEW_GUI_ITEM_KIT"), PersistentDataType.STRING); + KitPreferencesInventory kitPreferencesInventory = new KitPreferencesInventory(54, + LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREFS_TITLE.toString()). + replaceText(ComponentUtils.replaceConfig("%KIT%", kitName)). + decoration(TextDecoration.ITALIC, false), + plugin, kitName, player); + kitPreferencesInventory.openInventory(player); + break; default: break; } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitadmin/EditKitInventory.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitadmin/EditKitInventory.java index 9c27255..be20118 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitadmin/EditKitInventory.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/kitadmin/EditKitInventory.java @@ -44,11 +44,11 @@ public class EditKitInventory extends AbstractInventory { glassMeta.displayName(Component.text("")); redStainedGlass.setItemMeta(glassMeta); - for (int i = 45; i < 54; i++) inv.setItem(i, redStainedGlass); + for (int i = 41; i < 54; i++) inv.setItem(i, redStainedGlass); ItemStack greenConcrete = new ItemStack(Material.GREEN_CONCRETE, 1); ItemMeta saveMeta = greenConcrete.getItemMeta(); - saveMeta.displayName(LanguageConfig.lang.get("KITS_GUI_EDIT_SAVE")); + saveMeta.displayName(LanguageConfig.lang.get(LanguageKey.KITS_GUI_PREFS_SAVE.toString())); saveMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_GUI_EDIT_ITEM"), PersistentDataType.STRING, "Save"); saveMeta.getPersistentDataContainer().set(new NamespacedKey(plugin, "KITS_GUI_EDIT_ITEM_KIT"), PersistentDataType.STRING, kitName); greenConcrete.setItemMeta(saveMeta); @@ -59,7 +59,7 @@ public class EditKitInventory extends AbstractInventory { @Override public void onInventoryClickLogic(InventoryClickEvent e) { - if (e.getSlot() >= 45){ // red panes + if (e.getSlot() >= 41){ // red panes e.setCancelled(true); } if (e.getSlot() == 49){ // save icon @@ -68,7 +68,7 @@ public class EditKitInventory extends AbstractInventory { ItemStack[] kitContents = inv.getContents(); int index = 0; for (ItemStack item : inv.getContents()){ - if (index >= 45) { + if (index >= 41) { kitContents[index] = null; } @@ -79,6 +79,7 @@ public class EditKitInventory extends AbstractInventory { KitConfig.reload(); e.getWhoClicked().sendMessage(LanguageConfig.lang.get(LanguageKey.KITS_GUI_EDIT_SAVED.toString())); + inv.close(); } diff --git a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/sample.java b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/sample.java index 953bd2a..d62e46b 100644 --- a/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/sample.java +++ b/PureKitsFork/src/main/java/me/lifelessnerd/purekitpvp/sample.java @@ -3,10 +3,17 @@ package me.lifelessnerd.purekitpvp; import me.lifelessnerd.purekitpvp.files.lang.LanguageKey; +import java.util.HashMap; +import java.util.Map; + public class sample { public static void main(String[] args) { - System.out.println(String.valueOf(LanguageKey.SCOREBOARD_GLOBAL_LEVEL)); + Map playerPrefs = new HashMap<>(); + playerPrefs.put(0, 8); + playerPrefs.put(1, 7); + + System.out.println(playerPrefs); }