From 73cb35b98774ca3668f9fcb49e75e8f3ae2ed56f Mon Sep 17 00:00:00 2001 From: LMBishop <13875753+LMBishop@users.noreply.github.com> Date: Tue, 8 Jun 2021 21:46:06 +0100 Subject: Allow qPlayer to be null --- .../com/leonardobishop/quests/QuestCompleter.java | 3 + .../java/com/leonardobishop/quests/Quests.java | 1 - .../quests/api/QuestsPlaceholders.java | 1 + .../quests/command/QuestsCommand.java | 132 ++++++++++----------- .../quests/listener/PlayerJoinListener.java | 5 +- .../com/leonardobishop/quests/player/QPlayer.java | 11 +- .../quests/player/QPlayerManager.java | 15 ++- .../quest/tasktype/type/MiningCertainTaskType.java | 3 + .../type/dependent/EssentialsBalanceTaskType.java | 3 + .../quests/storage/MySqlStorageProvider.java | 26 ++-- .../com/leonardobishop/quests/util/Messages.java | 1 + src/main/resources/config.yml | 1 + 12 files changed, 117 insertions(+), 85 deletions(-) (limited to 'src') diff --git a/src/main/java/com/leonardobishop/quests/QuestCompleter.java b/src/main/java/com/leonardobishop/quests/QuestCompleter.java index f31e5daa..d3ff8cf1 100644 --- a/src/main/java/com/leonardobishop/quests/QuestCompleter.java +++ b/src/main/java/com/leonardobishop/quests/QuestCompleter.java @@ -35,6 +35,8 @@ public class QuestCompleter implements Runnable { Player player = Bukkit.getPlayer(questProgress.getPlayer()); if (player != null && player.isOnline()) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) return; + Quest quest = plugin.getQuestManager().getQuestById(questProgress.getQuestId()); if (!qPlayer.hasStartedQuest(quest)) return; @@ -52,6 +54,7 @@ public class QuestCompleter implements Runnable { Player player = Bukkit.getPlayer(questProgressFile.getPlayerUUID()); if (player != null && player.isOnline()) { QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) return; for (QuestProgress questProgress : questProgressFile.getAllQuestProgress()) { Quest quest = plugin.getQuestManager().getQuestById(questProgress.getQuestId()); if (quest == null) continue; diff --git a/src/main/java/com/leonardobishop/quests/Quests.java b/src/main/java/com/leonardobishop/quests/Quests.java index bfbc0e60..6308f9de 100644 --- a/src/main/java/com/leonardobishop/quests/Quests.java +++ b/src/main/java/com/leonardobishop/quests/Quests.java @@ -174,7 +174,6 @@ public class Quests extends JavaPlugin { qPlayerManager = new QPlayerManager(this); menuController = new MenuController(this); - super.getCommand("quests").setExecutor(new QuestsCommand(this)); Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(this), this); Bukkit.getPluginManager().registerEvents(menuController, this); diff --git a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java index 9a402ed5..5c82cf6b 100644 --- a/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java +++ b/src/main/java/com/leonardobishop/quests/api/QuestsPlaceholders.java @@ -70,6 +70,7 @@ public class QuestsPlaceholders extends PlaceholderExpansion implements Cacheabl if (save) args = Arrays.copyOf(args, args.length - 1); final QPlayer qPlayer = plugin.getPlayerManager().getPlayer(p.getUniqueId()); + if (qPlayer == null) return "Data not loaded"; String split = args[args.length - 1]; String result = "null"; diff --git a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java index d33baa65..d18f977c 100644 --- a/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java +++ b/src/main/java/com/leonardobishop/quests/command/QuestsCommand.java @@ -78,6 +78,10 @@ public class QuestsCommand implements TabExecutor { if (args.length == 0 && sender instanceof Player) { Player player = (Player) sender; QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); + return true; + } qPlayer.openQuests(); return true; } else if (args.length >= 1) { @@ -90,10 +94,11 @@ public class QuestsCommand implements TabExecutor { showAdminHelp(sender, "moddata"); return true; } else if (args[1].equalsIgnoreCase("reload")) { + sender.sendMessage(ChatColor.GRAY + "Please note that some options, such as storage, require a full restart for chances to take effect."); plugin.reloadConfig(); plugin.reloadQuests(); - showProblems(sender); - sender.sendMessage(ChatColor.GRAY + "Quests successfully reloaded."); + if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) showProblems(sender); + sender.sendMessage(ChatColor.GREEN + "Quests successfully reloaded."); return true; } else if (args[1].equalsIgnoreCase("config")) { showProblems(sender); @@ -156,6 +161,7 @@ public class QuestsCommand implements TabExecutor { showAdminHelp(sender, "opengui"); return true; } else if (args[1].equalsIgnoreCase("moddata")) { + // TODO remove me if (args[2].equalsIgnoreCase("clean")) { FileVisitor fileVisitor = new SimpleFileVisitor() { @Override @@ -260,36 +266,16 @@ public class QuestsCommand implements TabExecutor { showAdminHelp(sender, "opengui"); return true; } else if (args[1].equalsIgnoreCase("moddata")) { - OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); - UUID uuid; - String name; - // Player.class is a superclass for OfflinePlayer. - // getofflinePlayer return a player regardless if exists or not - if (ofp.hasPlayedBefore()) { - uuid = ofp.getUniqueId(); - name = ofp.getName(); - } else { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } + QPlayer qPlayer = getOtherPlayer(sender, args[3]); + if (qPlayer == null) return true; if (args[2].equalsIgnoreCase("fullreset")) { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid); - qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again - } - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); - return true; - } QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); questProgressFile.clear(); - plugin.getPlayerManager().savePlayerSync(uuid, questProgressFile); - if (Bukkit.getPlayer(uuid) == null) { - plugin.getPlayerManager().dropPlayer(uuid); + plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); + if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { + plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); } - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", name)); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_FULLRESET.getMessage().replace("{player}", args[3])); return true; } showAdminHelp(sender, "moddata"); @@ -326,26 +312,8 @@ public class QuestsCommand implements TabExecutor { } } else if (args[1].equalsIgnoreCase("moddata")) { boolean success = false; - OfflinePlayer ofp = Bukkit.getOfflinePlayer(args[3]); - UUID uuid; - String name; - if (ofp.hasPlayedBefore()) { - uuid = ofp.getUniqueId(); - name = ofp.getName(); - } else { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", args[3])); - return true; - } - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", name)); - plugin.getPlayerManager().loadPlayer(uuid); - } - if (qPlayer == null) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", name)); - success = true; - } - qPlayer = plugin.getPlayerManager().getPlayer(uuid); //get again + QPlayer qPlayer = getOtherPlayer(sender, args[3]); + if (qPlayer == null) return true; QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); Quest quest = plugin.getQuestManager().getQuestById(args[4]); if (quest == null) { @@ -355,47 +323,47 @@ public class QuestsCommand implements TabExecutor { } if (args[2].equalsIgnoreCase("reset")) { questProgressFile.generateBlankQuestProgress(quest); - plugin.getPlayerManager().savePlayerSync(uuid, questProgressFile); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_RESET_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); success = true; } else if (args[2].equalsIgnoreCase("start")) { QuestStartResult response = qPlayer.startQuest(quest); if (response == QuestStartResult.QUEST_LIMIT_REACHED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLIMIT.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.QUEST_ALREADY_COMPLETED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOMPLETE.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.QUEST_COOLDOWN) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCOOLDOWN.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.QUEST_LOCKED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILLOCKED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.QUEST_ALREADY_STARTED) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILSTARTED.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.QUEST_NO_PERMISSION) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } else if (response == QuestStartResult.NO_PERMISSION_FOR_CATEGORY) { - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_FAILCATEGORYPERMISSION.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); return true; } - plugin.getPlayerManager().savePlayerSync(uuid, questProgressFile); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_START_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); success = true; } else if (args[2].equalsIgnoreCase("complete")) { qPlayer.completeQuest(quest); - plugin.getPlayerManager().savePlayerSync(uuid, questProgressFile); - sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", name).replace("{quest}", quest.getId())); + plugin.getPlayerManager().savePlayerSync(qPlayer.getPlayerUUID(), questProgressFile); + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_COMPLETE_SUCCESS.getMessage().replace("{player}", args[3]).replace("{quest}", quest.getId())); success = true; } if (!success) { showAdminHelp(sender, "moddata"); } - if (Bukkit.getPlayer(uuid) == null) { - plugin.getPlayerManager().dropPlayer(uuid); + if (Bukkit.getPlayer(qPlayer.getPlayerUUID()) == null) { + plugin.getPlayerManager().dropPlayer(qPlayer.getPlayerUUID()); } return true; } @@ -409,7 +377,7 @@ public class QuestsCommand implements TabExecutor { Quest quest = plugin.getQuestManager().getQuestById(args[1]); QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { - sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); + player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); return true; } if (quest == null) { @@ -434,10 +402,14 @@ public class QuestsCommand implements TabExecutor { Player player = (Player) sender; if (args.length >= 2) { Category category = plugin.getQuestManager().getCategoryById(args[1]); + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); + return true; + } if (category == null) { sender.sendMessage(Messages.COMMAND_CATEGORY_OPEN_DOESNTEXIST.getMessage().replace("{category}", args[1])); } else { - QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); qPlayer.openCategory(category, null, false); return true; } @@ -447,7 +419,7 @@ public class QuestsCommand implements TabExecutor { Player player = (Player) sender; QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); if (qPlayer == null) { - sender.sendMessage(ChatColor.RED + "Your quest progress file has not been loaded yet."); + player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); return true; } List validQuests = new ArrayList<>(); @@ -467,6 +439,10 @@ public class QuestsCommand implements TabExecutor { } else if (sender instanceof Player && (args[0].equalsIgnoreCase("started"))) { Player player = (Player) sender; QPlayer qPlayer = plugin.getPlayerManager().getPlayer(player.getUniqueId()); + if (qPlayer == null) { + player.sendMessage(Messages.COMMAND_DATA_NOT_LOADED.getMessage()); + return true; + } qPlayer.openStartedQuests(); return true; } @@ -477,6 +453,30 @@ public class QuestsCommand implements TabExecutor { return true; } + private QPlayer getOtherPlayer(CommandSender sender, String name) { + OfflinePlayer ofp = Bukkit.getOfflinePlayer(name); + UUID uuid; + String username; + if (ofp.hasPlayedBefore()) { + uuid = ofp.getUniqueId(); + username = ofp.getName(); + } else { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_PLAYERNOTFOUND.getMessage().replace("{player}", name)); + return null; + } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(uuid); + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_LOADDATA.getMessage().replace("{player}", username)); + plugin.getPlayerManager().loadPlayer(uuid); + qPlayer = plugin.getPlayerManager().getPlayer(uuid); + } + if (qPlayer == null) { + sender.sendMessage(Messages.COMMAND_QUEST_ADMIN_NODATA.getMessage().replace("{player}", username)); + return null; + } + return qPlayer; + } + private void showProblems(CommandSender sender) { if (!plugin.getQuestsConfigLoader().getFilesWithProblems().isEmpty()) { // sender.sendMessage(ChatColor.DARK_GRAY.toString() + "----"); diff --git a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java index 5cdb465e..53916c32 100644 --- a/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java +++ b/src/main/java/com/leonardobishop/quests/listener/PlayerJoinListener.java @@ -38,8 +38,11 @@ public class PlayerJoinListener implements Listener { Bukkit.getScheduler().runTaskLater(this.plugin, () -> event.getPlayer().sendMessage(plugin.getUpdater().getMessage()), 50L); } + QPlayer qPlayer = plugin.getPlayerManager().getPlayer(playerUuid); + if (qPlayer == null) return; + // run a full check to check for any missed quest completions - plugin.getQuestCompleter().queueFullCheck(plugin.getPlayerManager().getPlayer(playerUuid).getQuestProgressFile()); + plugin.getQuestCompleter().queueFullCheck(qPlayer.getQuestProgressFile()); } } diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayer.java b/src/main/java/com/leonardobishop/quests/player/QPlayer.java index 872b02d2..4e04566b 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayer.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayer.java @@ -78,10 +78,9 @@ public class QPlayer { } Player player = Bukkit.getPlayer(uuid); if (player != null) { - QPlayer questPlayer = QuestsAPI.getPlayerManager().getPlayer(uuid); String questFinishMessage = Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped()); // PlayerFinishQuestEvent -- start - PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, questPlayer, questProgress, questFinishMessage); + PlayerFinishQuestEvent questFinishEvent = new PlayerFinishQuestEvent(player, this, questProgress, questFinishMessage); Bukkit.getPluginManager().callEvent(questFinishEvent); // PlayerFinishQuestEvent -- end Bukkit.getServer().getScheduler().runTask(plugin, () -> { @@ -375,10 +374,10 @@ public class QPlayer { } if (Options.CATEGORIES_ENABLED.getBooleanValue()) { - CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); + CategoryQMenu categoryQMenu = new CategoryQMenu(plugin, this); List questMenus = new ArrayList<>(); for (Category category : plugin.getQuestManager().getCategories()) { - QuestQMenu questQMenu = new QuestQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), categoryQMenu); + QuestQMenu questQMenu = new QuestQMenu(plugin, this, category.getId(), categoryQMenu); List quests = new ArrayList<>(); for (String questid : category.getRegisteredQuestIds()) { Quest quest = plugin.getQuestManager().getQuestById(questid); @@ -393,7 +392,7 @@ public class QPlayer { plugin.getMenuController().openMenu(player, categoryQMenu, 1); } else { - QuestQMenu questQMenu = new QuestQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId()), "", null); + QuestQMenu questQMenu = new QuestQMenu(plugin, this, "", null); List quests = new ArrayList<>(); for (Map.Entry entry : plugin.getQuestManager().getQuests().entrySet()) { quests.add(entry.getValue()); @@ -414,7 +413,7 @@ public class QPlayer { return; } - StartedQMenu startedQMenu = new StartedQMenu(plugin, plugin.getPlayerManager().getPlayer(player.getUniqueId())); + StartedQMenu startedQMenu = new StartedQMenu(plugin, this); List quests = new ArrayList<>(); for (Map.Entry entry : plugin.getQuestManager().getQuests().entrySet()) { quests.add(new QuestSortWrapper(plugin, entry.getValue())); diff --git a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java index 2cd9cbfd..41c704e3 100644 --- a/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java +++ b/src/main/java/com/leonardobishop/quests/player/QPlayerManager.java @@ -36,7 +36,11 @@ public class QPlayerManager { plugin.getQuestsLogger().warning("No valid storage provider is configured - Quests will use YAML storage as a default"); this.storageProvider = new YamlStorageProvider(plugin); } - storageProvider.init(); + try { + storageProvider.init(); + } catch (Exception ignored) { + plugin.getQuestsLogger().severe("An error occurred initialising the storage provider."); + } } private final Map qPlayers = new ConcurrentHashMap<>(); @@ -78,7 +82,9 @@ public class QPlayerManager { * @param uuid the uuid of the player */ public void savePlayer(UUID uuid) { - savePlayer(uuid, getPlayer(uuid).getQuestProgressFile()); + QPlayer qPlayer = getPlayer(uuid); + if (qPlayer == null) return; + savePlayer(uuid, qPlayer.getQuestProgressFile()); } /** @@ -101,7 +107,9 @@ public class QPlayerManager { * @param uuid the uuid of the player */ public void savePlayerSync(UUID uuid) { - savePlayerSync(uuid, getPlayer(uuid).getQuestProgressFile()); + QPlayer qPlayer = getPlayer(uuid); + if (qPlayer == null) return; + savePlayerSync(uuid, qPlayer.getQuestProgressFile()); } /** @@ -144,6 +152,7 @@ public class QPlayerManager { plugin.getQuestsLogger().debug("Loading player " + uuid + ". Main thread: " + Bukkit.isPrimaryThread()); qPlayers.computeIfAbsent(uuid, s -> { QuestProgressFile questProgressFile = storageProvider.loadProgressFile(uuid); + if (questProgressFile == null) return null; return new QPlayer(uuid, questProgressFile, new QPlayerPreferences(null), plugin); }); } diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java index da497808..125bfecc 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/MiningCertainTaskType.java @@ -127,6 +127,9 @@ public final class MiningCertainTaskType extends TaskType { if (event.getPlayer().hasMetadata("NPC")) return; QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(event.getPlayer().getUniqueId()); + if (qPlayer == null) { + return; + } for (Quest quest : super.getRegisteredQuests()) { if (qPlayer.hasStartedQuest(quest)) { diff --git a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java index 581cbafb..22cef8a2 100644 --- a/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java +++ b/src/main/java/com/leonardobishop/quests/quest/tasktype/type/dependent/EssentialsBalanceTaskType.java @@ -47,6 +47,9 @@ public class EssentialsBalanceTaskType extends TaskType { Essentials ess = (Essentials) Bukkit.getPluginManager().getPlugin("Essentials"); if (player != null && player.isOnline() && ess != null) { QPlayer qPlayer = QuestsAPI.getPlayerManager().getPlayer(playerUUID); + if (qPlayer == null) { + return; + } QuestProgressFile questProgressFile = qPlayer.getQuestProgressFile(); QuestProgress questProgress = questProgressFile.getQuestProgress(quest); TaskProgress taskProgress = questProgress.getTaskProgress(task.getId()); diff --git a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java b/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java index fefd53ba..02692919 100644 --- a/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java +++ b/src/main/java/com/leonardobishop/quests/storage/MySqlStorageProvider.java @@ -57,17 +57,23 @@ public class MySqlStorageProvider implements StorageProvider { private static final String WRITE_PLAYER_TASK_PROGRESS = "INSERT INTO `{prefix}task_progress` (uuid, quest_id, task_id, completed, progress, data_type) VALUES (?,?,?,?,?,?) ON DUPLICATE KEY UPDATE completed=?, progress=?, data_type=?"; - private final HikariDataSource hikari; - private final String prefix; + private final ConfigurationSection configuration; private final Quests plugin; - private final Function statementProcessor; + private HikariDataSource hikari; + private String prefix; + private Function statementProcessor; + private boolean fault; public MySqlStorageProvider(Quests plugin, ConfigurationSection configuration) { this.plugin = plugin; if (configuration == null) { configuration = new YamlConfiguration(); } + this.configuration = configuration; + } + @Override + public void init() { String address = configuration.getString("network.address", "localhost:3306"); String database = configuration.getString("network.database", "minecraft"); String url = "jdbc:mysql://" + address + "/" + database; @@ -94,13 +100,14 @@ public class MySqlStorageProvider implements StorageProvider { config.addDataSourceProperty("elideSetAutoCommits", true); config.addDataSourceProperty("maintainTimeStats", false); - this.hikari = new HikariDataSource(config); + try { + this.hikari = new HikariDataSource(config); + } catch (Exception e) { + e.printStackTrace(); + fault = true; + } this.prefix = configuration.getString("database-settings.table-prefix", "quests_"); this.statementProcessor = s -> s.replace("{prefix}", prefix); - } - - @Override - public void init() { try (Connection connection = hikari.getConnection()) { try (Statement s = connection.createStatement()) { plugin.getQuestsLogger().debug("Creating default tables"); @@ -121,6 +128,7 @@ public class MySqlStorageProvider implements StorageProvider { @Override public QuestProgressFile loadProgressFile(UUID uuid) { + if (fault) return null; QuestProgressFile questProgressFile = new QuestProgressFile(uuid, plugin); try (Connection connection = hikari.getConnection()) { plugin.getQuestsLogger().debug("Querying player " + uuid); @@ -193,12 +201,14 @@ public class MySqlStorageProvider implements StorageProvider { } catch (SQLException e) { plugin.getQuestsLogger().severe("Failed to load player: " + uuid + "!"); e.printStackTrace(); + return null; } return questProgressFile; } @Override public void saveProgressFile(UUID uuid, QuestProgressFile questProgressFile) { + if (fault) return; try (Connection connection = hikari.getConnection()) { try (PreparedStatement writeQuestProgress = connection.prepareStatement(this.statementProcessor.apply(WRITE_PLAYER_QUEST_PROGRESS)); PreparedStatement writeTaskProgress = connection.prepareStatement(this.statementProcessor.apply(WRITE_PLAYER_TASK_PROGRESS))) { diff --git a/src/main/java/com/leonardobishop/quests/util/Messages.java b/src/main/java/com/leonardobishop/quests/util/Messages.java index ba9e42da..a86a4144 100644 --- a/src/main/java/com/leonardobishop/quests/util/Messages.java +++ b/src/main/java/com/leonardobishop/quests/util/Messages.java @@ -22,6 +22,7 @@ public enum Messages { QUEST_CATEGORY_PERMISSION("messages.quest-category-permission"), QUEST_CANCEL_NOTSTARTED("messages.quest-cancel-notstarted"), QUEST_UPDATER("messages.quest-updater"), + COMMAND_DATA_NOT_LOADED("messages.command-data-not-loaded"), COMMAND_SUB_DOESNTEXIST("messages.command-sub-doesntexist"), COMMAND_QUEST_START_DOESNTEXIST("messages.command-quest-start-doesntexist"), COMMAND_QUEST_GENERAL_DOESNTEXIST("messages.command-quest-general-doesntexist"), diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4b8a4f2b..2c2e09c7 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -334,6 +334,7 @@ messages: quest-category-quest-permission: "&7You do not have permission to start this quest since it is in a category you do not have permission to view." quest-cancel-notstarted: "&7You have not started this quest." quest-updater: "&cQuests > &7A new version &c{newver} &7was found on Spigot (your version: &c{oldver}&7). Please update me! <3 - Link: {link}" + command-data-not-loaded: "&4Your quests progress file has not been loaded; you cannot use quests. If this issue persists, contact an admin." command-sub-doesntexist: "&7The specified subcommand '&c{sub}' &7does not exist." command-quest-start-doesntexist: "&7The specified quest '&c{quest}&7' does not exist." command-quest-general-doesntexist: "&7The specified quest '&c{quest}&7' does not exist." -- cgit v1.2.3-70-g09d2