diff --git a/src/main/java/fr/communaywen/core/AywenCraftPlugin.java b/src/main/java/fr/communaywen/core/AywenCraftPlugin.java index 618f4f08..c2713991 100644 --- a/src/main/java/fr/communaywen/core/AywenCraftPlugin.java +++ b/src/main/java/fr/communaywen/core/AywenCraftPlugin.java @@ -11,8 +11,10 @@ import fr.communaywen.core.levels.LevelsCommand; import fr.communaywen.core.levels.LevelsListeners; import fr.communaywen.core.listeners.*; +import fr.communaywen.core.quests.PlayerQuests; import fr.communaywen.core.quests.QuestsListener; import fr.communaywen.core.quests.QuestsManager; +import fr.communaywen.core.quests.qenum.QUESTS; import fr.communaywen.core.staff.freeze.FreezeCommand; import fr.communaywen.core.staff.players.PlayersCommand; import fr.communaywen.core.tpa.TPACommand; @@ -25,6 +27,7 @@ import fr.communaywen.core.utils.*; import fr.communaywen.core.utils.command.InteractiveHelpMenu; import lombok.Getter; +import lombok.SneakyThrows; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.luckperms.api.LuckPerms; import org.bukkit.Bukkit; @@ -43,6 +46,7 @@ import revxrsal.commands.autocomplete.SuggestionProvider; import revxrsal.commands.bukkit.BukkitCommandHandler; +import java.sql.SQLException; import java.util.ArrayList; import java.util.List; @@ -66,6 +70,7 @@ public final class AywenCraftPlugin extends JavaPlugin { public List regions; + @SneakyThrows @Override public void onEnable() { // Logs @@ -197,19 +202,25 @@ public void run() { createFarineRecipe(); - getServer().getOnlinePlayers().forEach(QuestsManager::loadPlayerData); - for (Player player : Bukkit.getOnlinePlayers()) { new GamePlayer(player.getName()); + QuestsManager.loadPlayerData(player); } - ClaimConfigDataBase.loadAllClaims(); + QuestsManager.createQuestsTable(); + ClaimConfigDataBase.loadAllClaims(); } + @SneakyThrows @Override public void onDisable() { + for(Player player : Bukkit.getOnlinePlayers()) { + for(QUESTS quests : QUESTS.values()) { + PlayerQuests pq = QuestsManager.getPlayerQuests(player); + QuestsManager.savePlayerQuestProgress(player, quests, pq.getProgress(quests)); + } + } managers.cleanup(); - QuestsManager.saveAllPlayersData(); } public void registerEvents(Listener... args) { @@ -232,6 +243,7 @@ public int getBanDuration() { private void createFarineRecipe() { ItemStack farine = new ItemStack(Material.SUGAR); ItemMeta meta = farine.getItemMeta(); + assert meta != null; meta.setDisplayName("Farine"); farine.setItemMeta(meta); @@ -251,7 +263,6 @@ private Menu hasMenuOpened(Player player) { return null; } - /** * Format a permission with the permission prefix. * diff --git a/src/main/java/fr/communaywen/core/claim/ClaimConfigDataBase.java b/src/main/java/fr/communaywen/core/claim/ClaimConfigDataBase.java index d8d7f526..14bb6822 100644 --- a/src/main/java/fr/communaywen/core/claim/ClaimConfigDataBase.java +++ b/src/main/java/fr/communaywen/core/claim/ClaimConfigDataBase.java @@ -1,6 +1,7 @@ package fr.communaywen.core.claim; import fr.communaywen.core.AywenCraftPlugin; +import fr.communaywen.core.credit.Credit; import fr.communaywen.core.teams.Team; import fr.communaywen.core.utils.database.DatabaseConnector; import org.bukkit.Bukkit; @@ -27,9 +28,7 @@ public static void loadAllClaims() { UUID uuid = UUID.fromString(result.getString("claimID")); if (team != null) { AywenCraftPlugin.getInstance().regions.add(new RegionManager(pos1, pos2, team, uuid)); - AywenCraftPlugin.getInstance().getLogger().info(AywenCraftPlugin.getInstance().regions.toString()); } - AywenCraftPlugin.getInstance().getLogger().info(result.getString("team")); } @@ -84,9 +83,6 @@ public static boolean removeAllClaims(String teamName) { if (rowsAffected > 0) { AywenCraftPlugin.getInstance().regions.removeIf(region -> region.getTeam().getName().equals(teamName)); - AywenCraftPlugin.getInstance().getLogger().info("Claims removed for team: " + teamName + ". Affected rows: " + rowsAffected); - } else { - AywenCraftPlugin.getInstance().getLogger().info("No claims found for team: " + teamName); } return true; diff --git a/src/main/java/fr/communaywen/core/claim/ClaimDeleteConfirmationMenu.java b/src/main/java/fr/communaywen/core/claim/ClaimDeleteConfirmationMenu.java index bb3aa7a1..a57e5772 100644 --- a/src/main/java/fr/communaywen/core/claim/ClaimDeleteConfirmationMenu.java +++ b/src/main/java/fr/communaywen/core/claim/ClaimDeleteConfirmationMenu.java @@ -37,9 +37,7 @@ public ClaimDeleteConfirmationMenu(Player owner, RegionManager claim, Team team) } @Override - public void onInventoryClick(InventoryClickEvent event) { - // This method is not needed as we're using ItemBuilder's setOnClick - } + public void onInventoryClick(InventoryClickEvent event) {} @Override public @NotNull Map getContent() { diff --git a/src/main/java/fr/communaywen/core/economy/EconomyManager.java b/src/main/java/fr/communaywen/core/economy/EconomyManager.java index bc46656b..e4e74466 100644 --- a/src/main/java/fr/communaywen/core/economy/EconomyManager.java +++ b/src/main/java/fr/communaywen/core/economy/EconomyManager.java @@ -1,60 +1,76 @@ -package fr.communaywen.core.economy; - -import fr.communaywen.core.credit.Credit; -import fr.communaywen.core.credit.Feature; -import org.bukkit.entity.Player; - -import java.io.File; -import java.util.Map; -import java.util.UUID; - -@Feature("Economie") -@Credit("TheR0001") -public class EconomyManager { - private final Map balances; - private final EconomyData economyData; - - public EconomyManager(File dataFolder) { - this.economyData = new EconomyData(dataFolder); - this.balances = economyData.loadBalances(); - } - - public double getBalance(Player player) { - return balances.getOrDefault(player.getUniqueId(), 0.0); - } - - public void addBalance(Player player, double amount) { - UUID uuid = player.getUniqueId(); - balances.put(uuid, getBalance(player) + amount); - saveBalances(); - } - - public boolean withdrawBalance(Player player, double amount) { - UUID uuid = player.getUniqueId(); - double balance = getBalance(player); - if (balance >= amount) { - balances.put(uuid, balance - amount); - saveBalances(); - return true; - } else { - return false; - } - } - - public boolean transferBalance(Player from, Player to, double amount) { - if (withdrawBalance(from, amount)) { - addBalance(to, amount); - return true; - } else { - return false; - } - } - - private void saveBalances() { - economyData.saveBalances(balances); - } - - public Map getBalances() { - return balances; - } -} +package fr.communaywen.core.economy; + +import fr.communaywen.core.AywenCraftPlugin; +import fr.communaywen.core.credit.Credit; +import fr.communaywen.core.credit.Feature; +import fr.communaywen.core.quests.PlayerQuests; +import fr.communaywen.core.quests.QuestsManager; +import fr.communaywen.core.quests.qenum.QUESTS; +import fr.communaywen.core.quests.qenum.TYPE; +import org.bukkit.entity.Player; + +import java.io.File; +import java.util.Map; +import java.util.UUID; + +@Feature("Economie") +@Credit("TheR0001") +public class EconomyManager { + private final Map balances; + private final EconomyData economyData; + + public EconomyManager(File dataFolder) { + this.economyData = new EconomyData(dataFolder); + this.balances = economyData.loadBalances(); + } + + public double getBalance(Player player) { + return balances.getOrDefault(player.getUniqueId(), 0.0); + } + + public void addBalance(Player player, double amount) { + UUID uuid = player.getUniqueId(); + balances.put(uuid, getBalance(player) + amount); + + saveBalances(); + for(QUESTS quests : QUESTS.values()) { + PlayerQuests pq = QuestsManager.getPlayerQuests(player); + if(quests.getType() == TYPE.MONEY) { + if(!pq.isQuestCompleted(quests)) { + AywenCraftPlugin.getInstance().getLogger().info(String.valueOf(pq.getProgress(quests))); + AywenCraftPlugin.getInstance().getLogger().info(String.valueOf(getBalance(player))); + QuestsManager.manageQuestsPlayer(player, quests, (int) amount, " argents récoltés"); + } + } + } + } + + public boolean withdrawBalance(Player player, double amount) { + UUID uuid = player.getUniqueId(); + double balance = getBalance(player); + if (balance >= amount) { + balances.put(uuid, balance - amount); + saveBalances(); + return true; + } else { + return false; + } + } + + public boolean transferBalance(Player from, Player to, double amount) { + if (withdrawBalance(from, amount)) { + addBalance(to, amount); + return true; + } else { + return false; + } + } + + private void saveBalances() { + economyData.saveBalances(balances); + } + + public Map getBalances() { + return balances; + } +} diff --git a/src/main/java/fr/communaywen/core/quests/PlayerQuests.java b/src/main/java/fr/communaywen/core/quests/PlayerQuests.java index 3631cc3e..3bc52ecc 100644 --- a/src/main/java/fr/communaywen/core/quests/PlayerQuests.java +++ b/src/main/java/fr/communaywen/core/quests/PlayerQuests.java @@ -1,33 +1,33 @@ package fr.communaywen.core.quests; +import fr.communaywen.core.quests.qenum.QUESTS; +import lombok.Getter; + import java.util.HashMap; import java.util.Map; +@Getter public class PlayerQuests { - private final Map questsProgress; + private final Map questsProgress; public PlayerQuests() { this.questsProgress = new HashMap<>(); - for (QuestsManager.QUESTS quest : QuestsManager.QUESTS.values()) { + for (QUESTS quest : QUESTS.values()) { questsProgress.put(quest, 0); } } - public Map getQuestsProgress() { - return questsProgress; - } - - public int getProgress(QuestsManager.QUESTS quest) { + public int getProgress(QUESTS quest) { return questsProgress.getOrDefault(quest, 0); } - public void addProgress(QuestsManager.QUESTS quest, int amount) { + public void addProgress(QUESTS quest, int amount) { int newProgress = questsProgress.getOrDefault(quest, 0) + amount; questsProgress.put(quest, newProgress); } - public boolean isQuestCompleted(QuestsManager.QUESTS quest) { + public boolean isQuestCompleted(QUESTS quest) { return getProgress(quest) >= quest.getQt(); } diff --git a/src/main/java/fr/communaywen/core/quests/QuestsListener.java b/src/main/java/fr/communaywen/core/quests/QuestsListener.java index b5167bc4..104bbaa8 100644 --- a/src/main/java/fr/communaywen/core/quests/QuestsListener.java +++ b/src/main/java/fr/communaywen/core/quests/QuestsListener.java @@ -2,6 +2,7 @@ import dev.lone.itemsadder.api.CustomStack; import fr.communaywen.core.AywenCraftPlugin; +import fr.communaywen.core.quests.qenum.QUESTS; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.EntityType; @@ -18,23 +19,27 @@ import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.ItemStack; +import java.sql.SQLException; + public class QuestsListener implements Listener { @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { + public void onPlayerJoin(PlayerJoinEvent event) throws SQLException { QuestsManager.loadPlayerData(event.getPlayer()); } @EventHandler - public void onPlayerQuit(PlayerQuitEvent event) { - QuestsManager.savePlayerData(event.getPlayer()); + public void onPlayerQuit(PlayerQuitEvent event) throws SQLException { + PlayerQuests pq = QuestsManager.getPlayerQuests(event.getPlayer()); + for(QUESTS quests : QUESTS.values()) + QuestsManager.savePlayerQuestProgress(event.getPlayer(), quests, pq.getProgress(quests)); } @EventHandler public void onBlockBreak(BlockBreakEvent event) { if ((event.getBlock().getType().equals(Material.DIAMOND_ORE) || event.getBlock().getType().equals(Material.DEEPSLATE_DIAMOND_ORE))) { - QuestsManager.manageQuestsPlayer(event.getPlayer(), QuestsManager.QUESTS.BREAK_DIAMOND, 1, "diamants(s) miné(s)"); + QuestsManager.manageQuestsPlayer(event.getPlayer(), QUESTS.BREAK_DIAMOND, 1, "diamants(s) miné(s)"); } else if ((event.getBlock().getType().equals(Material.STONE) || event.getBlock().getType().equals(Material.DEEPSLATE))) { - QuestsManager.manageQuestsPlayer(event.getPlayer(), QuestsManager.QUESTS.BREAK_STONE, 1, "stone(s) cassé(s)"); + QuestsManager.manageQuestsPlayer(event.getPlayer(), QUESTS.BREAK_STONE, 1, "stone(s) cassé(s)"); } } @@ -42,7 +47,7 @@ public void onBlockBreak(BlockBreakEvent event) { public void onPlayerDeath(PlayerDeathEvent event) { Player killer = event.getEntity().getKiller(); assert killer != null; - QuestsManager.manageQuestsPlayer(killer, QuestsManager.QUESTS.KILL_PLAYERS, 1, "joueur(s) tué(s)"); + QuestsManager.manageQuestsPlayer(killer, QUESTS.KILL_PLAYERS, 1, "joueur(s) tué(s)"); } @EventHandler @@ -50,7 +55,7 @@ public void onEntityKill(EntityDeathEvent event) { Player player = event.getEntity().getKiller(); if (player == null) return; if (event.getEntity().getType().equals(EntityType.WARDEN)) { - QuestsManager.manageQuestsPlayer(player, QuestsManager.QUESTS.KILL_WARDENS, 1, "warden tué"); + QuestsManager.manageQuestsPlayer(player, QUESTS.KILL_WARDENS, 1, "warden tué"); } } @@ -62,7 +67,7 @@ public void onPlayerMove(PlayerMoveEvent event) { assert to != null; if (to.getBlockX() != from.getBlockX() || to.getBlockZ() != from.getBlockZ()) { - QuestsManager.manageQuestsPlayer(player, QuestsManager.QUESTS.WALK_BLOCKS, 1, "Block(s) marché(s)"); + QuestsManager.manageQuestsPlayer(player, QUESTS.WALK_BLOCKS, 1, "Block(s) marché(s)"); } } @@ -73,10 +78,11 @@ public void onCraftItem(CraftItemEvent event) { ItemStack itemStackWAND = stackRTPWAND.getItemStack(); if (event.getRecipe().getResult().getItemMeta().equals(itemStackWAND.getItemMeta())) { - QuestsManager.manageQuestsPlayer(player, QuestsManager.QUESTS.CRAFT_RTP_WAND, 1, "RTP WAND crafté"); + QuestsManager.manageQuestsPlayer(player, QUESTS.CRAFT_RTP_WAND, 1, "RTP WAND crafté"); } else if (event.getRecipe().getResult().getItemMeta().getDisplayName().equals("§fKebab")) { - QuestsManager.manageQuestsPlayer(player, QuestsManager.QUESTS.CRAFT_KEBAB, 1, "kebab crafté"); + QuestsManager.manageQuestsPlayer(player, QUESTS.CRAFT_KEBAB, 1, "kebab crafté"); } + } @EventHandler @@ -86,7 +92,7 @@ public void onFurnaceExtract(FurnaceExtractEvent event) { ItemStack iron = new ItemStack(Material.IRON_INGOT); if (extractedItem.equals(iron)) { - QuestsManager.manageQuestsPlayer(player, QuestsManager.QUESTS.SMELT_IRON, event.getItemAmount(), "fer(s) cuit(s)"); + QuestsManager.manageQuestsPlayer(player, QUESTS.SMELT_IRON, event.getItemAmount(), "fer(s) cuit(s)"); } } diff --git a/src/main/java/fr/communaywen/core/quests/QuestsManager.java b/src/main/java/fr/communaywen/core/quests/QuestsManager.java index 5b387f34..111a2799 100644 --- a/src/main/java/fr/communaywen/core/quests/QuestsManager.java +++ b/src/main/java/fr/communaywen/core/quests/QuestsManager.java @@ -1,239 +1,100 @@ package fr.communaywen.core.quests; import fr.communaywen.core.AywenCraftPlugin; +import fr.communaywen.core.quests.qenum.QUESTS; +import fr.communaywen.core.utils.database.DatabaseConnector; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Material; import org.bukkit.Sound; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import java.io.File; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.sql.*; +import java.util.*; -public class QuestsManager { +public class QuestsManager extends DatabaseConnector { private static final Map playerQuests = new HashMap<>(); - private static final File questsFile = new File(AywenCraftPlugin.getInstance().getDataFolder(), "quests.yml"); - private static final FileConfiguration questsData = YamlConfiguration.loadConfiguration(questsFile); - public enum QUESTS { - BREAK_STONE(Material.STONE, 10000, TYPE.BREAK, "Casseur de pierres", "de stone", REWARD.MONEY, 2000, TIER.TIER_1), - BREAK_DIAMOND(Material.DIAMOND, 100, TYPE.BREAK, "Richou", "diamants", REWARD.MONEY, 2500, TIER.TIER_1), - KILL_PLAYERS(Material.IRON_SWORD, 10, TYPE.KILL, "Le pro du pvp", "joueurs", REWARD.MONEY, 5000, TIER.TIER_1), - KILL_WARDENS(Material.SCULK_SHRIEKER, 1, TYPE.KILL, "L'explorateur des profondeurs", "wardens", REWARD.MONEY, 10000, TIER.TIER_1), - CRAFT_RTP_WAND(Material.ENDER_PEARL, 1, TYPE.CRAFT, "Attention, ça va aller loin ...", "RTP wand", REWARD.MONEY, 500, TIER.TIER_1), - EAT_KEBAB(Material.COOKED_BEEF, 10, TYPE.EAT, "Miam Miam", "Kebabs", REWARD.MONEY, 100, TIER.TIER_1), - CRAFT_KEBAB(Material.BREAD, 1, TYPE.CRAFT, "Kebabier un jour, Kebabier toujours", "Kebab", REWARD.MONEY, 100, TIER.TIER_1), - WALK_BLOCKS(Material.LEATHER_BOOTS, 20000, TYPE.WALK, "Le randonneur", "block", REWARD.MONEY, 10000, TIER.TIER_1), - SMELT_IRON(Material.IRON_ORE, 256, TYPE.SMELT, "Chaud devant !", "de fer", REWARD.MONEY, 2000, TIER.TIER_1); - private final Material material; - private final int qt; - private final TYPE type; - private final String name; - private final String desc; - private final int rewardsQt; - private final REWARD reward; - private final Material rewardsMaterial; - private final TIER tier; + public static void createQuestsTable() throws SQLException { - QUESTS(Material material, int qt, TYPE type, String name, String desc, REWARD reward, int rewardsQt, Material rewardsMaterial, TIER tier) { - this.material = material; - this.qt = qt; - this.type = type; - this.name = name; - this.desc = desc; - this.reward = reward; - this.rewardsMaterial = rewardsMaterial; - this.rewardsQt = rewardsQt; - this.tier = tier; - } - - QUESTS(Material material, int qt, TYPE type, String name, String desc, REWARD reward, int rewardsQt, TIER tier) { - this(material, qt, type, name, desc, reward, rewardsQt, null, tier); - } - - public Material getMaterial() { - return material; - } - - public int getQt() { - return qt; - } - - public TYPE getType() { - return type; - } - - public String getName() { - return name; - } - - public REWARD getReward() { - return reward; - } + DatabaseMetaData meta = connection.getMetaData(); + ResultSet tables = meta.getTables(null, null, "quests", null); - public int getRewardsQt() { - return rewardsQt; - } + if (!tables.next()) { + StringBuilder sql = new StringBuilder("CREATE TABLE IF NOT EXISTS quests (player VARCHAR(36) PRIMARY KEY"); - public Material getRewardsMaterial() { - return rewardsMaterial; - } + for (QUESTS quest : QUESTS.values()) { + sql.append(", ").append(quest.name()).append(" INT DEFAULT 0"); + } - public TIER getTier() { - return tier; - } + sql.append(")"); - public String getDesc() { - switch (type) { - case GET -> { - return "Récupérer " + qt + " " + desc; - } - case KILL -> { - return "Tuer " + qt + " " + desc; - } - case WALK -> { - return "Marcher " + qt + " " + desc; - } - case BREAK -> { - return "Casser " + qt + " " + desc; - } - case CRAFT -> { - return "Crafter " + qt + " " + desc; - } - case PLACE -> { - return "Placer " + qt + " " + desc; - } - case EAT -> { - return "Manger " + qt + " " + desc; - } - case ENCHANT -> { - return "Enchanter " + qt + " " + desc; - } - case SMELT -> { - return "Cuire " + qt + " " + desc; - } - default -> { - return ""; + Statement stmt = connection.createStatement(); + stmt.execute(sql.toString()); + stmt.close(); + System.out.println("Table 'quests' created successfully."); + } else { + for (QUESTS quest : QUESTS.values()) { + if (!columnExists(quest.name())) { + addColumn(quest.name()); } } } - } - - private enum TYPE { - BREAK, - PLACE, - GET, - WALK, - KILL, - CRAFT, - EAT, - ENCHANT, - SMELT - } - - private enum REWARD { - MONEY, - ITEMS - } - private enum TIER { - TIER_1, - TIER_2, - TIER_3, - TIER_4, - TIER_5 + tables.close(); } - public static void loadPlayerData(Player player) { + public static void loadPlayerData(Player player) throws SQLException { UUID playerId = player.getUniqueId(); - FileConfiguration data = YamlConfiguration.loadConfiguration(questsFile); - PlayerQuests pq = new PlayerQuests(); - if (data.contains(playerId.toString())) { - ConfigurationSection playerSection = data.getConfigurationSection(playerId.toString()); - - for (String questName : playerSection.getKeys(false)) { - try { - QUESTS quest = QUESTS.valueOf(questName); - int progress = playerSection.getInt(questName); - pq.getQuestsProgress().put(quest, progress); - } catch (IllegalArgumentException e) { - e.printStackTrace(); - } + for (QUESTS quest : QUESTS.values()) { + if (!columnExists(quest.name())) { + addColumn(quest.name()); } } - playerQuests.put(playerId, pq); - } - - - public static void savePlayerData(Player player) { - UUID playerId = player.getUniqueId(); - PlayerQuests pq = playerQuests.get(playerId); + PreparedStatement statement = connection.prepareStatement("SELECT * FROM quests WHERE player = ?"); + statement.setString(1, playerId.toString()); + ResultSet rs = statement.executeQuery(); - Map questsProgressMap = new HashMap<>(); - for (Map.Entry entry : pq.getQuestsProgress().entrySet()) { - questsProgressMap.put(entry.getKey().name(), entry.getValue()); + if (rs.next()) { + for (QUESTS quest : QUESTS.values()) { + int progress = rs.getInt(quest.name()); + pq.getQuestsProgress().put(quest, progress); + } + } else { + insertNewPlayer(playerId); } - questsData.set(playerId.toString(), questsProgressMap); + rs.close(); + statement.close(); - try { - questsData.save(questsFile); - } catch (IOException e) { - e.printStackTrace(); - } + playerQuests.put(playerId, pq); } - public static void loadAllPlayersData() { - if (!questsFile.exists()) { - return; - } - - FileConfiguration data = YamlConfiguration.loadConfiguration(questsFile); + private static void insertNewPlayer(UUID playerId) throws SQLException { - for (String playerIdString : data.getKeys(false)) { - UUID playerId = UUID.fromString(playerIdString); - ConfigurationSection playerSection = data.getConfigurationSection(playerIdString); + PreparedStatement stmt = connection.prepareStatement("INSERT INTO quests (player) VALUES (?)"); + stmt.setString(1, playerId.toString()); - PlayerQuests pq = new PlayerQuests(); - for (String questName : playerSection.getKeys(false)) { - QUESTS quest = QUESTS.valueOf(questName); - int progress = playerSection.getInt(questName); - pq.getQuestsProgress().put(quest, progress); - } - - playerQuests.put(playerId, pq); - } + stmt.executeUpdate(); + stmt.close(); } - public static void saveAllPlayersData() { - FileConfiguration data = new YamlConfiguration(); - - for (Map.Entry entry : playerQuests.entrySet()) { - UUID playerId = entry.getKey(); - PlayerQuests pq = entry.getValue(); - - ConfigurationSection playerSection = data.createSection(playerId.toString()); - for (Map.Entry questEntry : pq.getQuestsProgress().entrySet()) { - playerSection.set(questEntry.getKey().name(), questEntry.getValue()); - } - } + private static boolean columnExists(String columnName) throws SQLException { + DatabaseMetaData meta = connection.getMetaData(); + ResultSet rs = meta.getColumns(null, null, "quests", columnName); + boolean exists = rs.next(); + rs.close(); + return exists; + } - try { - data.save(questsFile); - } catch (IOException e) { - e.printStackTrace(); - } + private static void addColumn(String columnName) throws SQLException { + Statement stmt = connection.createStatement(); + stmt.execute("ALTER TABLE quests ADD COLUMN " + columnName + " INT DEFAULT 0"); + stmt.close(); } public static PlayerQuests getPlayerQuests(Player player) { @@ -243,26 +104,36 @@ public static PlayerQuests getPlayerQuests(Player player) { public static void manageQuestsPlayer(Player player, QUESTS quests, int amount, String actionBar) { PlayerQuests pq = getPlayerQuests(player); - if (!pq.isQuestCompleted(quests)) { - pq.addProgress(quests, amount); - QuestsManager.savePlayerData(player); - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent("» §7[§9§lQuêtes§7] §6" + pq.getProgress(quests) + "§l/§6" + quests.getQt() + " " + actionBar)); - if (pq.isQuestCompleted(quests)) { - player.playSound(player, Sound.UI_TOAST_CHALLENGE_COMPLETE, 10, 10); - player.sendTitle("§6QUETE COMPLETE", "§e" + quests.getName()); - player.sendMessage("» §7[§9§lQuêtes§7] §6Quête complétée: §e" + quests.getName()); - switch (quests.getReward()) { - case ITEMS -> { - player.getInventory().addItem(new ItemStack(quests.rewardsMaterial, quests.getRewardsQt())); - player.sendMessage("» §7[§9§lQuêtes§7] §6+ " + quests.rewardsQt + " " + quests.rewardsMaterial); - } - case MONEY -> { - AywenCraftPlugin.getInstance().getManagers().getEconomyManager().addBalance(player, quests.getRewardsQt()); - player.sendMessage("» §7[§9§lQuêtes§7] §6+ " + quests.rewardsQt + "$"); + try { + if (!pq.isQuestCompleted(quests)) { + pq.addProgress(quests, amount); + savePlayerQuestProgress(player, quests, pq.getProgress(quests)); + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, new TextComponent("» §7[§9§lQuêtes§7] §6" + pq.getProgress(quests) + "§l/§6" + quests.getQt() + " " + actionBar)); + if (pq.isQuestCompleted(quests)) { + player.playSound(player, Sound.UI_TOAST_CHALLENGE_COMPLETE, 10, 10); + player.sendTitle("§6QUETE COMPLETE", "§e" + quests.getName()); + player.sendMessage("» §7[§9§lQuêtes§7] §6Quête complétée: §e" + quests.getName()); + switch (quests.getReward()) { + case ITEMS -> { + player.getInventory().addItem(new ItemStack(quests.getRewardsMaterial().getType(), quests.getRewardsQt())); + player.sendMessage("» §7[§9§lQuêtes§7] §6+ " + quests.getRewardsQt() + " " + quests.getRewardsMaterial().getType().name()); + } + case MONEY -> { + AywenCraftPlugin.getInstance().getManagers().getEconomyManager().addBalance(player, quests.getRewardsQt()); + player.sendMessage("» §7[§9§lQuêtes§7] §6+ " + quests.getRewardsQt() + "$"); + } } } } - } + } catch (SQLException ignored) {} + } + public static void savePlayerQuestProgress(Player player, QUESTS quest, int progress) throws SQLException { + UUID playerId = player.getUniqueId(); + String sql = "UPDATE quests SET " + quest.name() + " = ? WHERE player = ?"; + PreparedStatement stmt = connection.prepareStatement(sql); + stmt.setInt(1, progress); + stmt.setString(2, playerId.toString()); + stmt.executeUpdate(); + stmt.close(); } - } \ No newline at end of file diff --git a/src/main/java/fr/communaywen/core/quests/QuestsMenu.java b/src/main/java/fr/communaywen/core/quests/QuestsMenu.java index 48147098..b35118da 100644 --- a/src/main/java/fr/communaywen/core/quests/QuestsMenu.java +++ b/src/main/java/fr/communaywen/core/quests/QuestsMenu.java @@ -2,6 +2,7 @@ import dev.xernas.menulib.Menu; import dev.xernas.menulib.utils.InventorySize; +import fr.communaywen.core.quests.qenum.QUESTS; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.entity.Player; @@ -50,7 +51,7 @@ public void onInventoryClick(InventoryClickEvent event) { refresh(); } } else if (slot == 26) { - int totalPages = (int) Math.ceil((double) QuestsManager.QUESTS.values().length / QUESTS_PER_PAGE); + int totalPages = (int) Math.ceil((double) QUESTS.values().length / QUESTS_PER_PAGE); if (currentPage < totalPages - 1) { currentPage++; refresh(); @@ -63,7 +64,7 @@ public void onInventoryClick(InventoryClickEvent event) { Map content = new HashMap<>(); List questItems = new ArrayList<>(); - for (QuestsManager.QUESTS quest : QuestsManager.QUESTS.values()) { + for (QUESTS quest : QUESTS.values()) { ItemStack item = new ItemStack(quest.getMaterial()); ItemMeta meta = item.getItemMeta(); PlayerQuests pq = QuestsManager.getPlayerQuests(getOwner().getPlayer()); @@ -75,7 +76,7 @@ public void onInventoryClick(InventoryClickEvent event) { meta.setDisplayName("§a" + quest.getName()); List lore = new ArrayList<>(); lore.add("§7Description: §f" + quest.getDesc()); - lore.add("§7Récompense: §f" + (quest.getRewardsMaterial() != null ? "x" + quest.getRewardsQt() + " " + quest.getRewardsMaterial() : quest.getRewardsQt() + "$")); + lore.add("§7Récompense: §f" + (quest.getRewardsMaterial() != null ? "x" + quest.getRewardsQt() + " " + quest.getRewardsMaterial().getType().name() : quest.getRewardsQt() + "$")); lore.add("§e" + (pq.isQuestCompleted(quest) ? "§aQuetes complété" : "En cours: " + pq.getProgress(quest) + "/" + quest.getQt())); meta.setLore(lore); item.setItemMeta(meta); @@ -104,8 +105,6 @@ public void onInventoryClick(InventoryClickEvent event) { int startIndex = currentPage * QUESTS_PER_PAGE; int endIndex = Math.min(startIndex + QUESTS_PER_PAGE, questItems.size()); - System.out.println("currentPage: " + currentPage + ", startIndex: " + startIndex + ", endIndex: " + endIndex); // Debug message - int slotIndex = startRow * inventoryWidth + padding; for (int i = startIndex; i < endIndex; i++) { content.put(slotIndex++, questItems.get(i)); diff --git a/src/main/java/fr/communaywen/core/quests/qenum/QUESTS.java b/src/main/java/fr/communaywen/core/quests/qenum/QUESTS.java new file mode 100644 index 00000000..ec9e2832 --- /dev/null +++ b/src/main/java/fr/communaywen/core/quests/qenum/QUESTS.java @@ -0,0 +1,69 @@ +package fr.communaywen.core.quests.qenum; + +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +public enum QUESTS { + BREAK_STONE(Material.STONE, 10000, TYPE.BREAK, "Casseur de pierres", "de stone", REWARD.MONEY, 2000, TIER.TIER_1), + BREAK_DIAMOND(Material.DIAMOND, 100, TYPE.BREAK, "Richou", "diamants", REWARD.MONEY, 2500, TIER.TIER_1), + KILL_PLAYERS(Material.IRON_SWORD, 10, TYPE.KILL, "Le pro du pvp", "joueurs", REWARD.MONEY, 5000, TIER.TIER_1), + KILL_WARDENS(Material.SCULK_SHRIEKER, 1, TYPE.KILL, "L'explorateur des profondeurs", "wardens", REWARD.MONEY, 10000, TIER.TIER_1), + CRAFT_RTP_WAND(Material.ENDER_PEARL, 1, TYPE.CRAFT, "Attention, ça va aller loin ...", "RTP wand", REWARD.MONEY, 500, TIER.TIER_1), + EAT_KEBAB(Material.COOKED_BEEF, 10, TYPE.EAT, "Miam Miam", "Kebabs", REWARD.MONEY, 100, TIER.TIER_1), + CRAFT_KEBAB(Material.BREAD, 1, TYPE.CRAFT, "Kebabier un jour, Kebabier toujours", "Kebab", REWARD.MONEY, 62, TIER.TIER_1), + WALK_BLOCKS(Material.LEATHER_BOOTS, 20000, TYPE.WALK, "Le randonneur", "block", REWARD.MONEY, 10000, TIER.TIER_1), + SMELT_IRON(Material.IRON_ORE, 256, TYPE.SMELT, "Chaud devant !", "de fer", REWARD.MONEY, 2000, TIER.TIER_1), + MONEY_500K(Material.DIAMOND_BLOCK, 500000, TYPE.MONEY, "Devient Elon", "$", REWARD.ITEMS, 1, new ItemStack(Material.NETHERITE_INGOT), TIER.TIER_1), + ; + + @Getter + private final Material material; + @Getter + private final int qt; + @Getter + private final TYPE type; + @Getter + private final String name; + private final String desc; + @Getter + private final int rewardsQt; + @Getter + private final REWARD reward; + @Getter + private final ItemStack rewardsMaterial; + @Getter + private final TIER tier; + + QUESTS(Material material, int qt, TYPE type, String name, String desc, REWARD reward, int rewardsQt, ItemStack rewardsMaterial, TIER tier) { + this.material = material; + this.qt = qt; + this.type = type; + this.name = name; + this.desc = desc; + this.reward = reward; + this.rewardsMaterial = rewardsMaterial; + this.rewardsQt = rewardsQt; + this.tier = tier; + } + + QUESTS(Material material, int qt, TYPE type, String name, String desc, REWARD reward, int rewardsQt, TIER tier) { + this(material, qt, type, name, desc, reward, rewardsQt, null, tier); + } + + public String getDesc() { + switch (type) { + case GET -> { return "Récupérer " + qt + " " + desc; } + case KILL -> { return "Tuer " + qt + " " + desc; } + case WALK -> { return "Marcher " + qt + " " + desc; } + case BREAK -> { return "Casser " + qt + " " + desc; } + case CRAFT -> { return "Crafter " + qt + " " + desc; } + case PLACE -> { return "Placer " + qt + " " + desc; } + case EAT -> { return "Manger " + qt + " " + desc; } + case ENCHANT -> { return "Enchanter " + qt + " " + desc; } + case SMELT -> { return "Cuire " + qt + " " + desc; } + case MONEY -> { return "Avoir " + qt + " " + desc; } + default -> { return ""; } + } + } +} diff --git a/src/main/java/fr/communaywen/core/quests/qenum/REWARD.java b/src/main/java/fr/communaywen/core/quests/qenum/REWARD.java new file mode 100644 index 00000000..56155a12 --- /dev/null +++ b/src/main/java/fr/communaywen/core/quests/qenum/REWARD.java @@ -0,0 +1,6 @@ +package fr.communaywen.core.quests.qenum; + +public enum REWARD { + MONEY, + ITEMS +} diff --git a/src/main/java/fr/communaywen/core/quests/qenum/TIER.java b/src/main/java/fr/communaywen/core/quests/qenum/TIER.java new file mode 100644 index 00000000..a0fd6c75 --- /dev/null +++ b/src/main/java/fr/communaywen/core/quests/qenum/TIER.java @@ -0,0 +1,9 @@ +package fr.communaywen.core.quests.qenum; + +public enum TIER { + TIER_1, + TIER_2, + TIER_3, + TIER_4, + TIER_5 +} diff --git a/src/main/java/fr/communaywen/core/quests/qenum/TYPE.java b/src/main/java/fr/communaywen/core/quests/qenum/TYPE.java new file mode 100644 index 00000000..35e18e05 --- /dev/null +++ b/src/main/java/fr/communaywen/core/quests/qenum/TYPE.java @@ -0,0 +1,14 @@ +package fr.communaywen.core.quests.qenum; + +public enum TYPE { + BREAK, + PLACE, + GET, + WALK, + KILL, + CRAFT, + EAT, + ENCHANT, + SMELT, + MONEY +}