Allow for empty objective lores

This commit is contained in:
Indyuce 2021-08-25 21:13:17 +02:00
parent ebf0d40fbf
commit 63c837be2c
2 changed files with 184 additions and 182 deletions

View File

@ -3,9 +3,9 @@ package net.Indyuce.mmocore.api.quest;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import io.lumine.mythic.lib.MythicLib;
import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.api.player.PlayerData;
import io.lumine.mythic.lib.MythicLib;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.boss.BarColor; import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarStyle; import org.bukkit.boss.BarStyle;
@ -20,171 +20,171 @@ import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
public class PlayerQuests { public class PlayerQuests {
private final PlayerData playerData; private final PlayerData playerData;
private final BossBar bossbar; private final BossBar bossbar;
private final Map<String, Long> finished = new HashMap<>(); private final Map<String, Long> finished = new HashMap<>();
private QuestProgress current; private QuestProgress current;
public PlayerQuests(PlayerData playerData) { public PlayerQuests(PlayerData playerData) {
this.playerData = playerData; this.playerData = playerData;
bossbar = MythicLib.plugin.getVersion().getWrapper().createBossBar(
new NamespacedKey(MMOCore.plugin, "quest_bar_" + playerData.getUniqueId().toString()),
"", BarColor.PURPLE, BarStyle.SEGMENTED_20);
if(playerData.isOnline())
bossbar.addPlayer(playerData.getPlayer());
}
@Deprecated bossbar = MythicLib.plugin.getVersion().getWrapper().createBossBar(
public PlayerQuests(PlayerData playerData, BossBar bar) { new NamespacedKey(MMOCore.plugin, "quest_bar_" + playerData.getUniqueId().toString()),
this.playerData = playerData; "", BarColor.PURPLE, BarStyle.SEGMENTED_20);
this.bossbar = bar; if (playerData.isOnline())
} bossbar.addPlayer(playerData.getPlayer());
}
public PlayerQuests load(ConfigurationSection config) { @Deprecated
if (config.contains("current")) public PlayerQuests(PlayerData playerData, BossBar bar) {
try { this.playerData = playerData;
current = MMOCore.plugin.questManager.get(config.getString("current.id")).generateNewProgress(playerData, config.getInt("current.objective")); this.bossbar = bar;
} catch (Exception e) { }
playerData.log(Level.WARNING, "Couldn't load current quest progress (ID '" + config.getString("current.id") + "')");
}
if (config.contains("finished")) public PlayerQuests load(ConfigurationSection config) {
for (String key : config.getConfigurationSection("finished").getKeys(false)) if (config.contains("current"))
finished.put(key, config.getLong("finished." + key)); try {
current = MMOCore.plugin.questManager.get(config.getString("current.id")).generateNewProgress(playerData, config.getInt("current.objective"));
} catch (Exception e) {
playerData.log(Level.WARNING, "Couldn't load current quest progress (ID '" + config.getString("current.id") + "')");
}
/* if (config.contains("finished"))
* must update the boss bar once the instance is loaded, otherwise it for (String key : config.getConfigurationSection("finished").getKeys(false))
* won't detect the current quest. THE BOSS BAR UPDATE is in the player finished.put(key, config.getLong("finished." + key));
* data class, this way it is still set invisible even if the player has
* no quest data
*/
return this; /*
} * must update the boss bar once the instance is loaded, otherwise it
* won't detect the current quest. THE BOSS BAR UPDATE is in the player
* data class, this way it is still set invisible even if the player has
* no quest data
*/
public void save(ConfigurationSection config) { return this;
if (current != null) { }
config.set("current.id", current.getQuest().getId());
config.set("current.objective", current.getObjectiveNumber());
} else
config.set("current", null);
for (String key : finished.keySet()) public void save(ConfigurationSection config) {
config.set("finished." + key, finished.get(key)); if (current != null) {
} config.set("current.id", current.getQuest().getId());
config.set("current.objective", current.getObjectiveNumber());
} else
config.set("current", null);
public String toJsonString() { for (String key : finished.keySet())
JsonObject json = new JsonObject(); config.set("finished." + key, finished.get(key));
if(current != null) { }
JsonObject cur = new JsonObject();
cur.addProperty("id", current.getQuest().getId());
cur.addProperty("objective", current.getObjectiveNumber());
json.add("current", cur);
}
JsonObject fin = new JsonObject();
for (String key : finished.keySet())
fin.addProperty(key, finished.get(key));
if(finished.size() != 0)
json.add("finished", fin);
return json.toString();
}
public void load(String json) { public String toJsonString() {
Gson parser = new Gson(); JsonObject json = new JsonObject();
JsonObject jo = parser.fromJson(json, JsonObject.class); if (current != null) {
if(jo.has("current")) { JsonObject cur = new JsonObject();
JsonObject cur = jo.getAsJsonObject("current"); cur.addProperty("id", current.getQuest().getId());
try { cur.addProperty("objective", current.getObjectiveNumber());
current = MMOCore.plugin.questManager.get(cur.get("id").getAsString()).generateNewProgress(playerData, cur.get("objective").getAsInt()); json.add("current", cur);
} catch (Exception e) { }
playerData.log(Level.WARNING, "Couldn't load current quest progress (ID '" + cur.get("id").getAsString() + "')");
}
}
if(jo.has("finished")) {
for (Entry<String, JsonElement> entry : jo.getAsJsonObject("finished").entrySet())
finished.put(entry.getKey(), entry.getValue().getAsLong());
}
for(Entry<String, Long> entry : finished.entrySet())
MMOCore.log("Finished: (" + entry.getKey() + ") - at: " + entry.getValue());
}
public QuestProgress getCurrent() {
return current;
}
public boolean hasCurrent() { JsonObject fin = new JsonObject();
return current != null; for (String key : finished.keySet())
} fin.addProperty(key, finished.get(key));
public Set<String> getFinishedQuests() { if (finished.size() != 0)
return finished.keySet(); json.add("finished", fin);
} return json.toString();
}
public boolean hasCurrent(Quest quest) { public void load(String json) {
return hasCurrent() && current.getQuest().equals(quest); Gson parser = new Gson();
} JsonObject jo = parser.fromJson(json, JsonObject.class);
if (jo.has("current")) {
JsonObject cur = jo.getAsJsonObject("current");
try {
current = MMOCore.plugin.questManager.get(cur.get("id").getAsString()).generateNewProgress(playerData, cur.get("objective").getAsInt());
} catch (Exception e) {
playerData.log(Level.WARNING, "Couldn't load current quest progress (ID '" + cur.get("id").getAsString() + "')");
}
}
if (jo.has("finished")) {
for (Entry<String, JsonElement> entry : jo.getAsJsonObject("finished").entrySet())
finished.put(entry.getKey(), entry.getValue().getAsLong());
}
public boolean hasFinished(Quest quest) { for (Entry<String, Long> entry : finished.entrySet())
return finished.containsKey(quest.getId()); MMOCore.log("Finished: (" + entry.getKey() + ") - at: " + entry.getValue());
} }
public void finishCurrent() { public QuestProgress getCurrent() {
finished.put(current.getQuest().getId(), System.currentTimeMillis()); return current;
start(null); }
}
public void resetFinishedQuests() { public boolean hasCurrent() {
finished.clear(); return current != null;
} }
public Date getFinishDate(Quest quest) { public Set<String> getFinishedQuests() {
return new Date(finished.get(quest.getId())); return finished.keySet();
} }
public void start(Quest quest) { public boolean hasCurrent(Quest quest) {
return hasCurrent() && current.getQuest().equals(quest);
}
// close current objective progress if quest is active public boolean hasFinished(Quest quest) {
if (hasCurrent()) return finished.containsKey(quest.getId());
current.getProgress().close(); }
// apply newer quest public void finishCurrent() {
current = quest == null ? null : quest.generateNewProgress(playerData); finished.put(current.getQuest().getId(), System.currentTimeMillis());
updateBossBar(); start(null);
} }
public boolean checkCooldownAvailability(Quest quest) { public void resetFinishedQuests() {
return (finished.get(quest.getId()) + quest.getDelayMillis()) < System.currentTimeMillis(); finished.clear();
} }
public long getDelayFeft(Quest quest) { public Date getFinishDate(Quest quest) {
return Math.max(finished.get(quest.getId()) + quest.getDelayMillis() - System.currentTimeMillis(), 0); return new Date(finished.get(quest.getId()));
} }
public boolean checkParentAvailability(Quest quest) { public void start(Quest quest) {
for (Quest parent : quest.getParents())
if (!hasFinished(parent))
return false;
return true;
}
public void updateBossBar() { // close current objective progress if quest is active
if (!hasCurrent()) { if (hasCurrent())
bossbar.setVisible(false); current.getProgress().close();
return;
}
bossbar.setVisible(true); // apply newer quest
bossbar.setColor(current.getProgress().getObjective().getBarColor()); current = quest == null ? null : quest.generateNewProgress(playerData);
bossbar.setTitle(current.getFormattedLore()); updateBossBar();
bossbar.setProgress((double) current.getObjectiveNumber() / current.getQuest().getObjectives().size()); }
}
public void resetBossBar() { public boolean checkCooldownAvailability(Quest quest) {
bossbar.removeAll(); return (finished.get(quest.getId()) + quest.getDelayMillis()) < System.currentTimeMillis();
} }
public long getDelayFeft(Quest quest) {
return Math.max(finished.get(quest.getId()) + quest.getDelayMillis() - System.currentTimeMillis(), 0);
}
public boolean checkParentAvailability(Quest quest) {
for (Quest parent : quest.getParents())
if (!hasFinished(parent))
return false;
return true;
}
public void updateBossBar() {
if (!hasCurrent() || !current.getProgress().getObjective().hasLore()) {
bossbar.setVisible(false);
return;
}
bossbar.setVisible(true);
bossbar.setColor(current.getProgress().getObjective().getBarColor());
bossbar.setTitle(current.getFormattedLore());
bossbar.setProgress((double) current.getObjectiveNumber() / current.getQuest().getObjectives().size());
}
public void resetBossBar() {
bossbar.removeAll();
}
} }

View File

@ -1,59 +1,61 @@
package net.Indyuce.mmocore.api.quest.objective; package net.Indyuce.mmocore.api.quest.objective;
import io.lumine.mythic.lib.api.MMOLineConfig;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import org.apache.commons.lang.Validate;
import org.bukkit.boss.BarColor;
import org.bukkit.configuration.ConfigurationSection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import org.apache.commons.lang.Validate;
import org.bukkit.boss.BarColor;
import org.bukkit.configuration.ConfigurationSection;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.api.quest.ObjectiveProgress;
import net.Indyuce.mmocore.api.quest.QuestProgress;
import net.Indyuce.mmocore.api.quest.trigger.Trigger;
import io.lumine.mythic.lib.api.MMOLineConfig;
public abstract class Objective { public abstract class Objective {
private final String id, lore; private final String id, lore;
private final BarColor barColor; private final BarColor barColor;
private final List<Trigger> triggers = new ArrayList<>(); private final List<Trigger> triggers = new ArrayList<>();
public Objective(ConfigurationSection config) { public Objective(ConfigurationSection config) {
this.id = config.getName(); this.id = config.getName();
this.lore = config.getString("lore"); this.lore = config.getString("lore");
Validate.notNull(lore, "Could not find objective lore"); Validate.notNull(config.getStringList("triggers"), "Could not load trigger list");
Validate.notNull(config.getStringList("triggers"), "Could not load trigger list");
String format = config.getString("bar-color", "PURPLE"); String format = config.getString("bar-color", "PURPLE");
barColor = BarColor.valueOf(format.toUpperCase().replace("-", "_").replace(" ", "_")); barColor = BarColor.valueOf(format.toUpperCase().replace("-", "_").replace(" ", "_"));
for (String key : config.getStringList("triggers")) for (String key : config.getStringList("triggers"))
try { try {
triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key))); triggers.add(MMOCore.plugin.loadManager.loadTrigger(new MMOLineConfig(key)));
} catch (IllegalArgumentException exception) { } catch (IllegalArgumentException exception) {
MMOCore.plugin.getLogger().log(Level.WARNING, MMOCore.plugin.getLogger().log(Level.WARNING,
"Could not load trigger '" + key + "' from objective '" + id + "': " + exception.getMessage()); "Could not load trigger '" + key + "' from objective '" + id + "': " + exception.getMessage());
} }
} }
public String getId() { public String getId() {
return id; return id;
} }
public BarColor getBarColor() { public BarColor getBarColor() {
return barColor; return barColor;
} }
public String getDefaultLore() { public boolean hasLore() {
return lore; return lore != null && !lore.isEmpty();
} }
public List<Trigger> getTriggers() { public String getDefaultLore() {
return triggers; return lore;
} }
public abstract ObjectiveProgress newProgress(QuestProgress questProgress); public List<Trigger> getTriggers() {
return triggers;
}
public abstract ObjectiveProgress newProgress(QuestProgress questProgress);
} }