diff options
Diffstat (limited to 'src/me/fatpigsarefat/quests/player')
5 files changed, 558 insertions, 0 deletions
diff --git a/src/me/fatpigsarefat/quests/player/QPlayer.java b/src/me/fatpigsarefat/quests/player/QPlayer.java new file mode 100644 index 00000000..27e9283d --- /dev/null +++ b/src/me/fatpigsarefat/quests/player/QPlayer.java @@ -0,0 +1,101 @@ +package me.fatpigsarefat.quests.player; + +import me.fatpigsarefat.quests.Quests; +import me.fatpigsarefat.quests.events.EventInventory; +import me.fatpigsarefat.quests.obj.Options; +import me.fatpigsarefat.quests.obj.misc.QMenu; +import me.fatpigsarefat.quests.obj.misc.QMenuCategory; +import me.fatpigsarefat.quests.obj.misc.QMenuQuest; +import me.fatpigsarefat.quests.player.questprogressfile.QuestProgressFile; +import me.fatpigsarefat.quests.quests.Category; +import me.fatpigsarefat.quests.quests.Quest; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +public class QPlayer { + + private UUID uuid; + private QuestProgressFile questProgressFile; + + public QPlayer(UUID uuid, QuestProgressFile questProgressFile) { + this.uuid = uuid; + this.questProgressFile = questProgressFile; + } + + public UUID getUuid() { + return uuid; + } + + public void openCategory(Category category) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + return; + } + + QMenuQuest qMenuQuest = new QMenuQuest(Quests.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), null); + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = Quests.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); + } + } + qMenuQuest.populate(quests); + qMenuQuest.setBackButtonEnabled(false); + + player.openInventory(qMenuQuest.toInventory(1)); + EventInventory.track(player.getUniqueId(), qMenuQuest); + } + + public void openQuests() { + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + return; + } + + if (Options.CATEGORIES_ENABLED.getBooleanValue()) { + QMenuCategory qMenuCategory = new QMenuCategory(Quests.getPlayerManager().getPlayer(player.getUniqueId())); + List<QMenuQuest> questMenus = new ArrayList<>(); + for (Category category : Quests.getQuestManager().getCategories()) { + QMenuQuest qMenuQuest = new QMenuQuest(Quests.getPlayerManager().getPlayer(player.getUniqueId()), category.getId(), qMenuCategory); + List<Quest> quests = new ArrayList<>(); + for (String questid : category.getRegisteredQuestIds()) { + Quest quest = Quests.getQuestManager().getQuestById(questid); + if (quest != null) { + quests.add(quest); + } + } + qMenuQuest.populate(quests); + questMenus.add(qMenuQuest); + } + qMenuCategory.populate(questMenus); + + player.openInventory(qMenuCategory.toInventory(1)); + EventInventory.track(player.getUniqueId(), qMenuCategory); + } else { + QMenuQuest qMenuQuest = new QMenuQuest(Quests.getPlayerManager().getPlayer(player.getUniqueId()), "", null); + List<Quest> quests = new ArrayList<>(); + for (Map.Entry<String, Quest> entry : Quests.getQuestManager().getQuests().entrySet()) { + quests.add(entry.getValue()); + } + qMenuQuest.populate(quests); + qMenuQuest.setBackButtonEnabled(false); + + player.openInventory(qMenuQuest.toInventory(1)); + EventInventory.track(player.getUniqueId(), qMenuQuest); + } + } + + public QuestProgressFile getQuestProgressFile() { + return questProgressFile; + } + + public QuestProgressFile setQuestProgressFile() { + return questProgressFile; + } +} diff --git a/src/me/fatpigsarefat/quests/player/QPlayerManager.java b/src/me/fatpigsarefat/quests/player/QPlayerManager.java new file mode 100644 index 00000000..2d18bcf3 --- /dev/null +++ b/src/me/fatpigsarefat/quests/player/QPlayerManager.java @@ -0,0 +1,86 @@ +package me.fatpigsarefat.quests.player; + +import me.fatpigsarefat.quests.Quests; +import me.fatpigsarefat.quests.player.questprogressfile.QuestProgress; +import me.fatpigsarefat.quests.player.questprogressfile.QuestProgressFile; +import me.fatpigsarefat.quests.player.questprogressfile.TaskProgress; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class QPlayerManager { + + private List<QPlayer> qPlayers = new ArrayList<>(); + + public void addPlayer(QPlayer qPlayer) { + qPlayers.add(qPlayer); + } + + public QPlayer getPlayer(UUID uuid) { + for (QPlayer qPlayer : qPlayers) { + if (qPlayer.getUuid().equals(uuid)) { + return qPlayer; + } + } + return null; + } + + public void removePlayer(UUID uuid) { + QPlayer toRemove = null; + for (QPlayer qPlayer : qPlayers) { + if (qPlayer.getUuid().equals(uuid)) { + toRemove = qPlayer; + break; + } + } + if (toRemove != null) { + qPlayers.remove(toRemove); + } + } + + public List<QPlayer> getQPlayers() { + return qPlayers; + } + + public void loadPlayer(UUID uuid) { + if (getPlayer(uuid) == null) { + QuestProgressFile questProgressFile = new QuestProgressFile(uuid); + + File directory = new File(Quests.getInstance().getDataFolder() + File.separator + "playerdata"); + if (directory.exists() && directory.isDirectory()) { + File file = new File(Quests.getInstance().getDataFolder() + File.separator + "playerdata" + File.separator + uuid.toString() + ".yml"); + if (file.exists()) { + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + if (data.contains("quest-progress")) { + for (String id : data.getConfigurationSection("quest-progress").getKeys(false)) { + boolean started = data.getBoolean("quest-progress." + id + ".started"); + boolean completed = data.getBoolean("quest-progress." + id + ".completed"); + boolean completedBefore = data.getBoolean("quest-progress." + id + ".completed-before"); + long completionDate = data.getLong("quest-progress." + id + ".completion-date"); + + QuestProgress questProgress = new QuestProgress(id, completed, completedBefore, completionDate, uuid, started, true); + + for (String taskid : data.getConfigurationSection("quest-progress." + id + ".task-progress").getKeys(false)) { + boolean taskCompleted = data.getBoolean("quest-progress." + id + ".task-progress." + taskid + ".completed"); + Object taskProgression = data.get("quest-progress." + id + ".task-progress." + taskid + ".progress"); + + TaskProgress taskProgress = new TaskProgress(taskid, taskProgression, uuid, taskCompleted); + questProgress.addTaskProgress(taskProgress); + } + + questProgressFile.addQuestProgress(questProgress); + } + } + } + } + + QPlayer qPlayer = new QPlayer(uuid, questProgressFile); + + Quests.getPlayerManager().addPlayer(qPlayer); + } + } + +} diff --git a/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgress.java b/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgress.java new file mode 100644 index 00000000..c4fe87b2 --- /dev/null +++ b/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgress.java @@ -0,0 +1,96 @@ +package me.fatpigsarefat.quests.player.questprogressfile; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class QuestProgress { + + private List<TaskProgress> taskProgress = new ArrayList<>(); + private String questid; + private boolean started; + private boolean completed; + private boolean completedBefore; + private long completionDate; + private UUID player; + private boolean modified; + + public QuestProgress(String questid, boolean completed, boolean completedBefore, long completionDate, UUID player, boolean started) { + this.questid = questid; + this.completed = completed; + this.completedBefore = completedBefore; + this.completionDate = completionDate; + this.player = player; + this.started = started; + } + + public QuestProgress(String questid, boolean completed, boolean completedBefore, long completionDate, UUID player, boolean started, boolean modified) { + this(questid, completed, completedBefore, completionDate, player, started); + this.modified = modified; + } + + public String getQuestId() { + return questid; + } + + public boolean isCompleted() { + return completed; + } + + public void setStarted(boolean started) { + this.started = started; + this.modified = true; + } + + public boolean isStarted() { + return started; + } + + public void setCompleted(boolean completed) { + this.completed = completed; + this.modified = true; + } + + public long getCompletionDate() { + return completionDate; + } + + public void setCompletionDate(long completionDate) { + this.completionDate = completionDate; + this.modified = true; + } + + public UUID getPlayer() { + return player; + } + + public boolean isCompletedBefore() { + return completedBefore; + } + + public void setCompletedBefore(boolean completedBefore) { + this.completedBefore = completedBefore; + this.modified = true; + } + + public void addTaskProgress(TaskProgress taskProgress) { + this.taskProgress.add(taskProgress); + } + + public List<TaskProgress> getTaskProgress() { + return taskProgress; + } + + public TaskProgress getTaskProgress(String taskId) { + for (TaskProgress taskProgress : this.taskProgress) { + if (taskProgress.getTaskId().equals(taskId)) { + return taskProgress; + } + } + return null; + } + + public boolean isWorthSaving() { + return modified; + } +} diff --git a/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgressFile.java b/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgressFile.java new file mode 100644 index 00000000..bfc80ad3 --- /dev/null +++ b/src/me/fatpigsarefat/quests/player/questprogressfile/QuestProgressFile.java @@ -0,0 +1,234 @@ +package me.fatpigsarefat.quests.player.questprogressfile; + +import me.fatpigsarefat.quests.Quests; +import me.fatpigsarefat.quests.obj.Messages; +import me.fatpigsarefat.quests.obj.Options; +import me.fatpigsarefat.quests.quests.Quest; +import me.fatpigsarefat.quests.quests.Task; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.YamlConfiguration; +import org.bukkit.entity.Player; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +public class QuestProgressFile { + + private List<QuestProgress> questProgress = new ArrayList<>(); + private UUID player; + + public QuestProgressFile(UUID player) { + this.player = player; + } + + //TODO change back to quest id to save performance + + public boolean completeQuest(Quest quest) { + QuestProgress questProgress = getQuestProgress(quest); + questProgress.setStarted(false); + questProgress.setCompleted(true); + questProgress.setCompletedBefore(true); + questProgress.setCompletionDate(System.currentTimeMillis()); + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(this.player); + for (String s : quest.getRewards()) { + Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(), s.replace("{player}", player.getName())); + } + player.sendMessage(Messages.QUEST_COMPLETE.getMessage().replace("{quest}", quest.getDisplayNameStripped())); + if (Options.TITLES_ENABLED.getBooleanValue()) { + Quests.getTitle().sendTitle(player, Messages.TITLE_QUEST_COMPLETE_TITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped()), Messages.TITLE_QUEST_COMPLETE_SUBTITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped())); + } + for (String s : quest.getRewardString()) { + player.sendMessage(ChatColor.translateAlternateColorCodes('&', s)); + } + } + return true; + } + + public boolean startQuest(Quest quest) { + if (getStartedQuests().size() >= Options.QUESTS_START_LIMIT.getIntValue()) { + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START_LIMIT.getMessage().replace("{limit}", String.valueOf(Options.QUESTS_START_LIMIT.getIntValue()))); + } + return false; + } + QuestProgress questProgress = getQuestProgress(quest); + if (!quest.isRepeatable() && questProgress.isCompletedBefore()) { + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START_DISABLED.getMessage()); + } + return false; + } + long cooldown = getCooldownFor(quest); + if (cooldown > 0) { + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START_COOLDOWN.getMessage().replace("{time}", String.valueOf(Quests.convertToFormat(TimeUnit.MINUTES.convert(cooldown, TimeUnit.MILLISECONDS))))); + } + return false; + } + if (!hasMetRequirements(quest)) { + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START_LOCKED.getMessage()); + } + return false; + } + questProgress.setStarted(true); + for (TaskProgress taskProgress : questProgress.getTaskProgress()) { + taskProgress.setCompleted(false); + taskProgress.setProgress(null); + } + questProgress.setCompleted(false); + if (Bukkit.getPlayer(player) != null) { + Player player = Bukkit.getPlayer(getPlayer()); + player.sendMessage(Messages.QUEST_START.getMessage().replace("{quest}", quest.getDisplayNameStripped())); + if (Options.TITLES_ENABLED.getBooleanValue()) { + Quests.getTitle().sendTitle(player, Messages.TITLE_QUEST_START_TITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped()), Messages.TITLE_QUEST_START_SUBTITLE.getMessage().replace("{quest}", quest + .getDisplayNameStripped())); + } + } + return true; + } + + public void addQuestProgress(QuestProgress questProgress) { + this.questProgress.add(questProgress); + } + + public List<Quest> getStartedQuests() { + List<Quest> startedQuests = new ArrayList<>(); + for (QuestProgress questProgress : questProgress) { + if (questProgress.isStarted()) { + startedQuests.add(Quests.getQuestManager().getQuestById(questProgress.getQuestId())); + } + } + return startedQuests; + } + + public boolean hasQuestProgress(Quest quest) { + for (QuestProgress questProgress : this.questProgress) { + if (questProgress.getQuestId().equals(quest.getId())) { + return true; + } + } + return false; + } + + public boolean hasStartedQuest(Quest quest) { + //TODO always return true if the need for starting quests is disabled & requirements are met + if (hasQuestProgress(quest)) { + if (getQuestProgress(quest).isStarted()) { + return true; + } + } + return false; + } + + public long getCooldownFor(Quest quest) { + QuestProgress questProgress = getQuestProgress(quest); + if (quest.isCooldownEnabled() && questProgress.isCompleted()) { + if (questProgress.getCompletionDate() > 0) { + long date = questProgress.getCompletionDate(); + return (date + TimeUnit.MILLISECONDS.convert(quest.getCooldown(), TimeUnit.MINUTES)) - System.currentTimeMillis(); + } + } + return 0; + } + + public boolean hasMetRequirements(Quest quest) { + for (String id : quest.getRequirements()) { + Quest q = Quests.getQuestManager().getQuestById(id); + if (q == null) { + continue; + } + if (hasQuestProgress(q) && !getQuestProgress(q).isCompletedBefore()) { + return false; + } else if (!hasQuestProgress(q)) { + return false; + } + } + return true; + } + + public UUID getPlayer() { + return player; + } + + public QuestProgress getQuestProgress(Quest quest) { + for (QuestProgress questProgress : this.questProgress) { + if (questProgress.getQuestId().equals(quest.getId())) { + return questProgress; + } + } + if (generateBlankQuestProgress(quest.getId())) { + return getQuestProgress(quest); + } + return null; + } + + public boolean generateBlankQuestProgress(String questid) { + if (Quests.getQuestManager().getQuestById(questid) != null) { + Quest quest = Quests.getQuestManager().getQuestById(questid); + QuestProgress questProgress = new QuestProgress(quest.getId(), false, false, 0, player, false, false); + for (Task task : quest.getTasks()) { + TaskProgress taskProgress = new TaskProgress(task.getId(), null, player, false); + questProgress.addTaskProgress(taskProgress); + } + + this.questProgress.add(questProgress); + return true; + } + return false; + } + + public void saveToDisk() { + File directory = new File(Quests.getInstance().getDataFolder() + File.separator + "playerdata"); + if (!directory.exists() && !directory.isDirectory()) { + directory.mkdirs(); + } + File file = new File(Quests.getInstance().getDataFolder() + File.separator + "playerdata" + File.separator + player.toString() + ".yml"); + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + YamlConfiguration data = YamlConfiguration.loadConfiguration(file); + data.set("quest-progress", null); + for (QuestProgress questProgress : this.questProgress) { + if (!questProgress.isWorthSaving()) { + continue; + } + data.set("quest-progress." + questProgress.getQuestId() + ".started", questProgress.isStarted()); + data.set("quest-progress." + questProgress.getQuestId() + ".completed", questProgress.isCompleted()); + data.set("quest-progress." + questProgress.getQuestId() + ".completed-before", questProgress.isCompletedBefore()); + data.set("quest-progress." + questProgress.getQuestId() + ".completion-date", questProgress.getCompletionDate()); + for (TaskProgress taskProgress : questProgress.getTaskProgress()) { + data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".completed", taskProgress + .isCompleted()); + data.set("quest-progress." + questProgress.getQuestId() + ".task-progress." + taskProgress.getTaskId() + ".progress", taskProgress + .getProgress()); + } + } + + try { + data.save(file); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} + diff --git a/src/me/fatpigsarefat/quests/player/questprogressfile/TaskProgress.java b/src/me/fatpigsarefat/quests/player/questprogressfile/TaskProgress.java new file mode 100644 index 00000000..3b896334 --- /dev/null +++ b/src/me/fatpigsarefat/quests/player/questprogressfile/TaskProgress.java @@ -0,0 +1,41 @@ +package me.fatpigsarefat.quests.player.questprogressfile; + +import java.util.UUID; + +public class TaskProgress { + + private String taskid; + private Object progress; + private UUID player; + private boolean completed; + + public TaskProgress(String taskid, Object progress, UUID player, boolean completed) { + this.taskid = taskid; + this.progress = progress; + this.completed = completed; + } + + public String getTaskId() { + return taskid; + } + + public Object getProgress() { + return progress; + } + + public void setProgress(Object progress) { + this.progress = progress; + } + + public UUID getPlayer() { + return player; + } + + public boolean isCompleted() { + return completed; + } + + public void setCompleted(boolean complete) { + this.completed = complete; + } +} |
