diff --git a/CrazyAdvancementAPI/plugin.yml b/CrazyAdvancementAPI/plugin.yml
index 4a9906a..722608c 100644
--- a/CrazyAdvancementAPI/plugin.yml
+++ b/CrazyAdvancementAPI/plugin.yml
@@ -1,6 +1,6 @@
main: eu.endercentral.crazy_advancements.CrazyAdvancements
name: CrazyAdvancementsAPI
-version: 1.13.11
+version: 1.14
api-version: 1.13
load: startup
author: ZockerAxel
diff --git a/CrazyAdvancementAPI/pom.xml b/CrazyAdvancementAPI/pom.xml
index 43c6aa6..177fe8a 100644
--- a/CrazyAdvancementAPI/pom.xml
+++ b/CrazyAdvancementAPI/pom.xml
@@ -4,7 +4,7 @@
eu.endercentral.crazy_advancements
CrazyAdvancementsAPI
- 1.13.11
+ 1.14
jar
CrazyAdvancementsAPI
diff --git a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/Advancement.java b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/Advancement.java
index 828c637..861fc34 100644
--- a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/Advancement.java
+++ b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/Advancement.java
@@ -49,6 +49,7 @@ public class Advancement {
private String nameKey;
private AdvancementDisplay display;
+ private SaveMethod saveMethod = SaveMethod.DEFAULT;
private transient Advancement parent;
@SerializedName("parent")
@@ -146,30 +147,9 @@ public Advancement getParent() {
*/
public void setCriteria(int criteria) {
this.criteria = criteria;
- Map advCriteria = new HashMap<>();
- String[][] advRequirements = new String[][] {};
-
- for(int i = 0; i < getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
- @Override
- public JsonObject a(LootSerializationContext arg0) {
- return null;
- }
-
- @Override
- public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
- }
- }));
- }
- saveCriteria(advCriteria);
-
- ArrayList fixedRequirements = new ArrayList<>();
- for(String name : advCriteria.keySet()) {
- fixedRequirements.add(new String[] {name});
- }
- advRequirements = Arrays.stream(fixedRequirements.toArray()).toArray(String[][]::new);
- saveCriteriaRequirements(advRequirements);
+ savedCriteria = null;
+ savedCriterionNames = null;
+ savedCriteriaRequirements = null;
}
/**
@@ -188,10 +168,33 @@ public NameKey getName() {
return name;
}
+ /**
+ * Get the Display
+ *
+ * @return The display
+ */
public AdvancementDisplay getDisplay() {
return display;
}
+ /**
+ * Set the Save/Load method
{@link SaveMethod.DEFAULT} - Criteria Values will be saved and loaded
{@link SaveMethod.NUMBER} - Criteria Number will be saved and loaded
+ *
+ * @param saveMethod The Save/Load Method
+ */
+ public void setSaveMethod(SaveMethod saveMethod) {
+ this.saveMethod = saveMethod;
+ }
+
+ /**
+ * Get the Save/Load Method that is currently in use
+ *
+ * @return The Save/Load Method
+ */
+ public SaveMethod getSaveMethod() {
+ return saveMethod;
+ }
+
/**
* Sets the Reward for completing the Advancement
*
@@ -507,6 +510,12 @@ public void setAwardedCriteria(Map> awardedCriteria) {
this.awardedCriteria = awardedCriteria;
}
+ @Warning(reason = "Only use if you know what you are doing!")
+ public void unsetAwardedCriteria(UUID uuid) {
+ if(this.awardedCriteria == null) this.awardedCriteria = new HashMap<>();
+ if(this.awardedCriteria.containsKey(uuid.toString())) this.awardedCriteria.remove(uuid.toString());
+ }
+
public AdvancementProgress getProgress(Player player) {
if(this.progress == null) progress = new HashMap<>();
return this.progress.containsKey(player.getUniqueId().toString()) ? this.progress.get(player.getUniqueId().toString()) : new AdvancementProgress();
diff --git a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/NameKey.java b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/NameKey.java
index 6957b25..af36a69 100644
--- a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/NameKey.java
+++ b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/NameKey.java
@@ -4,8 +4,8 @@
public class NameKey {
- private String namespace = "minecraft";
- private String key = "???";
+ private final String namespace;
+ private final String key;
private transient MinecraftKey mcKey;
@@ -21,11 +21,12 @@ public NameKey(String namespace, String key) {
/**
*
- * @param key The key inside the default namespace "minecraft" or a NameSpacedKey seperated by :
+ * @param key The key inside the default namespace "minecraft" or a NameSpacedKey seperated by a colon
*/
public NameKey(String key) {
String[] split = key.split(":");
if(split.length < 2) {
+ this.namespace = "minecraft";
this.key = key.toLowerCase();
} else {
this.namespace = split[0].toLowerCase();
diff --git a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/SaveMethod.java b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/SaveMethod.java
new file mode 100644
index 0000000..6c06b2a
--- /dev/null
+++ b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/SaveMethod.java
@@ -0,0 +1,7 @@
+package eu.endercentral.crazy_advancements;
+
+public enum SaveMethod {
+
+ DEFAULT, NUMBER;
+
+}
\ No newline at end of file
diff --git a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/manager/AdvancementManager.java b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/manager/AdvancementManager.java
index 68dd2da..ceb087f 100644
--- a/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/manager/AdvancementManager.java
+++ b/CrazyAdvancementAPI/src/eu/endercentral/crazy_advancements/manager/AdvancementManager.java
@@ -17,7 +17,6 @@
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
-import org.bukkit.OfflinePlayer;
import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
@@ -29,8 +28,10 @@
import com.google.gson.JsonParser;
import eu.endercentral.crazy_advancements.Advancement;
+import eu.endercentral.crazy_advancements.AdvancementVisibility;
import eu.endercentral.crazy_advancements.CrazyAdvancements;
import eu.endercentral.crazy_advancements.NameKey;
+import eu.endercentral.crazy_advancements.SaveMethod;
import eu.endercentral.crazy_advancements.events.AdvancementGrantEvent;
import eu.endercentral.crazy_advancements.events.AdvancementRevokeEvent;
import eu.endercentral.crazy_advancements.events.CriteriaGrantEvent;
@@ -59,6 +60,9 @@ public final class AdvancementManager {
private static HashMap accessible = new HashMap<>();
private boolean hiddenBoolean = false;
+ private String criterionPrefix = "criterion.";
+ private String criterionNamespace = "minecraft";
+ private String criterionKey = "impossible";
private static HashMap smallestY = new HashMap<>();
private static HashMap smallestX = new HashMap<>();
@@ -86,6 +90,78 @@ private static float getSmallestX(NameKey key) {
return smallestX.containsKey(key) ? smallestX.get(key) : 0;
}
+ /**
+ * Sets the boolean that is passed via the advancement packet when an advancement is hidden
Default: false
When set to true, hidden advancements that have not been granted yet, will have a line drawn to them even though they aren't displayed yet, when they should be visible (according to their {@link AdvancementVisibility})
Can be used to create an empty advancement tab where there are no advancements visible and no lines visible, when the tab only has a hidden advancement as a root
+ *
+ * @param hiddenBoolean The new hiddenBoolean
+ */
+ public void setHiddenBoolean(boolean hiddenBoolean) {
+ this.hiddenBoolean = hiddenBoolean;
+ }
+
+ /**
+ * Gets the boolean that is passed via the advancement packet when an advancement is hiddenFor legacy reasons, the default prefix is "criterion." as the advancement progress is stored by their criterion name, which consists of prefix + number
To reduce packet size and thus increase the max criteria number that can be used, the prefix can be set to an empty String
Only works for advancements that have not generated their criteria yet (use this method before adding advancements to it)
+ *
+ * @param criterionPrefix The new prefix that is used for criteria
+ */
+ public void setCriterionPrefix(String criterionPrefix) {
+ this.criterionPrefix = criterionPrefix;
+ }
+
+ /**
+ * Get the prefix that is used for criteria
+ *
+ * @return The prefix that is used for criteria
+ */
+ public String getCriterionPrefix() {
+ return criterionPrefix;
+ }
+
+ /**
+ * Set the namespace that is used for the Namespaced Key for criteria
Only works for advancements that have not generated their criteria yet (use this method before adding advancements to it)
+ *
+ * @param criterionNamespace The new namespace that is used for the Namespaced Key for criteria
+ */
+ public void setCriterionNamespace(String criterionNamespace) {
+ this.criterionNamespace = criterionNamespace;
+ }
+
+ /**
+ * Get the namespace that is used for the Namespaced Key for criteria
+ *
+ * @return The namespace that is used for the Namespaced Key for criteria
+ */
+ public String getCriterionNamespace() {
+ return criterionNamespace;
+ }
+
+ /**
+ * Sets the key that is used for the Namespaced Key for criteria
Only works for advancements that have not generated their criteria yet (use this method before adding advancements to it)
+ *
+ * @param criterionKey The new key that is used for the Namespaced Key for criteria
+ */
+ public void setCriterionKey(String criterionKey) {
+ this.criterionKey = criterionKey;
+ }
+
+ /**
+ * Get the key that is used for the Namespaced Key for criteria
+ *
+ * @return The key that is used for the Namespaced Key for criteria
+ */
+ public String getCriterionKey() {
+ return criterionKey;
+ }
+
private boolean announceAdvancementMessages = true;
private ArrayList players;
private ArrayList advancements = new ArrayList<>();
@@ -185,7 +261,7 @@ private void addPlayer(Player player, NameKey tab) {
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -193,7 +269,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -319,7 +395,7 @@ public void addAdvancement(eu.endercentral.crazy_advancements.Advancement... adv
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -327,7 +403,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -528,7 +604,7 @@ private void updateProgress(Player player, boolean alreadyGranted, boolean fireE
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -536,7 +612,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -634,7 +710,7 @@ public void updateVisibility(Player player, Advancement advancement) {
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -642,7 +718,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -832,7 +908,7 @@ protected void checkAwarded(Player player, Advancement advancement) {
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -840,7 +916,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -872,7 +948,7 @@ protected void checkAwarded(UUID uuid, Advancement advancement) {
if(advancement.getSavedCriteria() == null) {
for(int i = 0; i < advancement.getCriteria(); i++) {
- advCriteria.put("criterion." + i, new Criterion(new CriterionInstance() {
+ advCriteria.put(criterionPrefix + i, new Criterion(new CriterionInstance() {
@Override
public JsonObject a(LootSerializationContext arg0) {
return null;
@@ -880,7 +956,7 @@ public JsonObject a(LootSerializationContext arg0) {
@Override
public MinecraftKey a() {
- return new MinecraftKey("minecraft", "impossible");
+ return new MinecraftKey(criterionNamespace, criterionKey);
}
}));
}
@@ -907,8 +983,8 @@ public MinecraftKey a() {
}
private boolean isOnline(UUID uuid) {
- OfflinePlayer player = Bukkit.getOfflinePlayer(uuid);
- return player.isOnline();
+ Player player = Bukkit.getPlayer(uuid);
+ return player != null && player.isOnline();
}
/**
@@ -1293,16 +1369,18 @@ public String getProgressJSON(Player player) {
for(Advancement advancement : getAdvancements()) {
String nameKey = advancement.getName().toString();
+ SaveMethod saveMethod = advancement.getSaveMethod();
- List progress = prg.containsKey(nameKey) ? prg.get(nameKey) : new ArrayList<>();
- AdvancementProgress advPrg = advancement.getProgress(player);
- for(String criterion : advancement.getSavedCriteria().keySet()) {
- CriterionProgress critPrg = advPrg.getCriterionProgress(criterion);
- if(critPrg != null && critPrg.a()) {
- progress.add(criterion);
- }
+ if(saveMethod == SaveMethod.NUMBER) {
+ int criteriaProgress = getCriteriaProgress(player, advancement);
+ ArrayList progress = new ArrayList<>();
+ progress.add("NUM");//Indicator for Number Save Method
+ progress.add("" + criteriaProgress);
+ prg.put(nameKey, progress);
+ } else {
+ ArrayList progress = new ArrayList<>(advancement.getAwardedCriteria().get(player.getUniqueId().toString()));
+ prg.put(nameKey, progress);
}
- prg.put(nameKey, progress);
}
check();
@@ -1325,16 +1403,18 @@ public String getProgressJSON(Player player, String namespace) {
if(namespace.equalsIgnoreCase(anotherNamespace)) {
String nameKey = advancement.getName().toString();
+ SaveMethod saveMethod = advancement.getSaveMethod();
- List progress = prg.containsKey(nameKey) ? prg.get(nameKey) : new ArrayList<>();
- AdvancementProgress advPrg = advancement.getProgress(player);
- for(String criterion : advancement.getSavedCriteria().keySet()) {
- CriterionProgress critPrg = advPrg.getCriterionProgress(criterion);
- if(critPrg != null && critPrg.a()) {
- progress.add(criterion);
- }
+ if(saveMethod == SaveMethod.NUMBER) {
+ int criteriaProgress = getCriteriaProgress(player, advancement);
+ ArrayList progress = new ArrayList<>();
+ progress.add("NUM");//Indicator for Number Save Method
+ progress.add("" + criteriaProgress);
+ prg.put(nameKey, progress);
+ } else {
+ ArrayList progress = new ArrayList<>(advancement.getAwardedCriteria().get(player.getUniqueId().toString()));
+ prg.put(nameKey, progress);
}
- prg.put(nameKey, progress);
}
}
@@ -1389,9 +1469,31 @@ public void loadProgress(Player player, String namespace) {
if(prg.containsKey(nameKey)) {
List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(player, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
+ if(saveMethod == SaveMethod.DEFAULT) {
+ grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ }
}
}
}
@@ -1423,9 +1525,31 @@ public void loadProgress(Player player, Advancement... advancementsLoaded) {
if(prg.containsKey(nameKey)) {
List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(player, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
+ if(saveMethod == SaveMethod.DEFAULT) {
+ grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ }
}
}
}
@@ -1452,9 +1576,31 @@ public void loadCustomProgress(Player player, String json, Advancement... advanc
if(prg.containsKey(nameKey)) {
List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(player, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
+ if(saveMethod == SaveMethod.DEFAULT) {
+ grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ }
}
}
}
@@ -1475,9 +1621,31 @@ public void loadCustomProgress(Player player, String json) {
if(prg.containsKey(nameKey)) {
List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(player, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
+ if(saveMethod == SaveMethod.DEFAULT) {
+ grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ }
}
}
}
@@ -1500,9 +1668,31 @@ public void loadCustomProgress(Player player, String json, String namespace) {
if(prg.containsKey(nameKey)) {
List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(player, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
+ if(saveMethod == SaveMethod.DEFAULT) {
+ grantCriteria(player, advancement, loaded.toArray(new String[loaded.size()]));
+ }
}
}
}
@@ -1538,313 +1728,430 @@ private HashMap> getCustomProgress(String json) {
//Offline Save/Load
- /**
- *
- * @param uuid Player UUID to check
- * @return A JSON String representation of the progress for a player
- */
- public String getProgressJSON(UUID uuid) {
- HashMap> prg = new HashMap<>();
+ /**
+ *
+ * @param uuid Player UUID to check
+ * @return A JSON String representation of the progress for a player
+ */
+ public String getProgressJSON(UUID uuid) {
+ HashMap> prg = new HashMap<>();
+
+ for(Advancement advancement : getAdvancements()) {
+ String nameKey = advancement.getName().toString();
+ SaveMethod saveMethod = advancement.getSaveMethod();
- for(Advancement advancement : getAdvancements()) {
- String nameKey = advancement.getName().toString();
-
- List progress = prg.containsKey(nameKey) ? prg.get(nameKey) : new ArrayList<>();
- AdvancementProgress advPrg = advancement.getProgress(uuid);
- for(String criterion : advancement.getSavedCriteria().keySet()) {
- CriterionProgress critPrg = advPrg.getCriterionProgress(criterion);
- if(critPrg != null && critPrg.a()) {
- progress.add(criterion);
- }
- }
+ if(saveMethod == SaveMethod.NUMBER) {
+ int criteriaProgress = getCriteriaProgress(uuid, advancement);
+ ArrayList progress = new ArrayList<>();
+ progress.add("NUM");//Indicator for Number Save Method
+ progress.add("" + criteriaProgress);
+ prg.put(nameKey, progress);
+ } else {
+ ArrayList progress = new ArrayList<>(advancement.getAwardedCriteria().get(uuid.toString()));
prg.put(nameKey, progress);
}
-
- check();
- String json = gson.toJson(prg);
-
- return json;
}
- /**
- *
- * @param uuid Player UUID to check
- * @param namespace Namespace to check
- * @return A JSON String representation of the progress for a player in a specified namespace
- */
- public String getProgressJSON(UUID uuid, String namespace) {
- HashMap> prg = new HashMap<>();
+ check();
+ String json = gson.toJson(prg);
+
+ return json;
+ }
+
+ /**
+ *
+ * @param uuid Player UUID to check
+ * @param namespace Namespace to check
+ * @return A JSON String representation of the progress for a player in a specified namespace
+ */
+ public String getProgressJSON(UUID uuid, String namespace) {
+ HashMap> prg = new HashMap<>();
+
+ for(Advancement advancement : getAdvancements()) {
+ String anotherNamespace = advancement.getName().getNamespace();
- for(Advancement advancement : getAdvancements()) {
- String anotherNamespace = advancement.getName().getNamespace();
+ if(namespace.equalsIgnoreCase(anotherNamespace)) {
+ String nameKey = advancement.getName().toString();
+ SaveMethod saveMethod = advancement.getSaveMethod();
- if(namespace.equalsIgnoreCase(anotherNamespace)) {
- String nameKey = advancement.getName().toString();
-
- List progress = prg.containsKey(nameKey) ? prg.get(nameKey) : new ArrayList<>();
- AdvancementProgress advPrg = advancement.getProgress(uuid);
- for(String criterion : advancement.getSavedCriteria().keySet()) {
- CriterionProgress critPrg = advPrg.getCriterionProgress(criterion);
- if(critPrg != null && critPrg.a()) {
- progress.add(criterion);
- }
- }
+ if(saveMethod == SaveMethod.NUMBER) {
+ int criteriaProgress = getCriteriaProgress(uuid, advancement);
+ ArrayList progress = new ArrayList<>();
+ progress.add("NUM");//Indicator for Number Save Method
+ progress.add("" + criteriaProgress);
+ prg.put(nameKey, progress);
+ } else {
+ ArrayList progress = new ArrayList<>(advancement.getAwardedCriteria().get(uuid.toString()));
prg.put(nameKey, progress);
}
}
-
- check();
- String json = gson.toJson(prg);
-
- return json;
}
- /**
- * Saves the progress
- *
- * @param uuid Player UUID to check
- * @param namespace Namespace to check
- */
- public void saveProgress(UUID uuid, String namespace) {
- File saveFile = getSaveFile(uuid, namespace);
-
- String json = getProgressJSON(uuid, namespace);
-
- try {
- if(!saveFile.exists()) {
- saveFile.createNewFile();
- }
- FileWriter w = new FileWriter(saveFile);
- w.write(json);
- w.close();
- } catch (Exception e) {
- e.printStackTrace();
+ check();
+ String json = gson.toJson(prg);
+
+ return json;
+ }
+
+ /**
+ * Saves the progress
+ *
+ * @param uuid Player UUID to check
+ * @param namespace Namespace to check
+ */
+ public void saveProgress(UUID uuid, String namespace) {
+ File saveFile = getSaveFile(uuid, namespace);
+
+ String json = getProgressJSON(uuid, namespace);
+
+ try {
+ if(!saveFile.exists()) {
+ saveFile.createNewFile();
}
+ FileWriter w = new FileWriter(saveFile);
+ w.write(json);
+ w.close();
+ } catch (Exception e) {
+ e.printStackTrace();
}
+ }
+
+ //Load Progress
+
+ /**
+ * Loads the progress
+ * Recommended to only load progress for online players!
+ *
+ * @param uuid Player UUID to check
+ * @param namespace Namespace to check
+ */
+ @Deprecated
+ public void loadProgress(UUID uuid, String namespace) {
+ File saveFile = getSaveFile(uuid, namespace);
- //Load Progress
-
- /**
- * Loads the progress
- * Recommended to only load progress for online players!
- *
- * @param uuid Player UUID to check
- * @param namespace Namespace to check
- */
- @Deprecated
- public void loadProgress(UUID uuid, String namespace) {
- File saveFile = getSaveFile(uuid, namespace);
+ if(saveFile.exists() && saveFile.isFile()) {
+ HashMap> prg = getProgress(uuid, namespace);
- if(saveFile.exists() && saveFile.isFile()) {
- HashMap> prg = getProgress(uuid, namespace);
-
- for(Advancement advancement : advancements) {
- if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
- checkAwarded(uuid, advancement);
+ for(Advancement advancement : advancements) {
+ if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
+ checkAwarded(uuid, advancement);
+
+ String nameKey = advancement.getName().toString();
+
+ if(prg.containsKey(nameKey)) {
+ List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- String nameKey = advancement.getName().toString();
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(uuid, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
- if(prg.containsKey(nameKey)) {
- List loaded = prg.get(nameKey);
-
+ if(saveMethod == SaveMethod.DEFAULT) {
grantCriteria(uuid, advancement, loaded.toArray(new String[loaded.size()]));
-
}
}
}
}
}
+ }
+
+ /**
+ * Loads the progress
+ * Recommended to only load progress for online players!
+ *
+ * @param uuid Player UUID to check
+ * @param advancementsLoaded Array of advancements to check, all advancements which arent in the same namespace as the first one will be ignored
+ */
+ @Deprecated
+ public void loadProgress(UUID uuid, Advancement... advancementsLoaded) {
+ if(advancementsLoaded.length == 0) return;
+ List advancements = Arrays.asList(advancementsLoaded);
- /**
- * Loads the progress
- * Recommended to only load progress for online players!
- *
- * @param uuid Player UUID to check
- * @param advancementsLoaded Array of advancements to check, all advancements which arent in the same namespace as the first one will be ignored
- */
- @Deprecated
- public void loadProgress(UUID uuid, Advancement... advancementsLoaded) {
- if(advancementsLoaded.length == 0) return;
- List advancements = Arrays.asList(advancementsLoaded);
-
- String namespace = advancements.get(0).getName().getNamespace();
-
- File saveFile = getSaveFile(uuid, namespace);
+ String namespace = advancements.get(0).getName().getNamespace();
+
+ File saveFile = getSaveFile(uuid, namespace);
+
+ if(saveFile.exists() && saveFile.isFile()) {
+ HashMap> prg = getProgress(uuid, namespace);
- if(saveFile.exists() && saveFile.isFile()) {
- HashMap> prg = getProgress(uuid, namespace);
-
- for(Advancement advancement : advancements) {
- if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
- checkAwarded(uuid, advancement);
+ for(Advancement advancement : advancements) {
+ if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
+ checkAwarded(uuid, advancement);
+
+ String nameKey = advancement.getName().toString();
+
+ if(prg.containsKey(nameKey)) {
+ List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- String nameKey = advancement.getName().toString();
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(uuid, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
- if(prg.containsKey(nameKey)) {
- List loaded = prg.get(nameKey);
-
+ if(saveMethod == SaveMethod.DEFAULT) {
grantCriteria(uuid, advancement, loaded.toArray(new String[loaded.size()]));
-
}
}
}
}
}
+ }
+
+ /**
+ * Loads the progress with a custom JSON String
+ * Recommended to only load progress for online players!
+ *
+ * @param uuid Player UUID to check
+ * @param json JSON String to load from
+ * @param advancementsLoaded Array of advancements to check
+ */
+ @Deprecated
+ public void loadCustomProgress(UUID uuid, String json, Advancement... advancementsLoaded) {
+ if(advancementsLoaded.length == 0) return;
+ List advancements = Arrays.asList(advancementsLoaded);
+
+ HashMap> prg = getCustomProgress(json);
- /**
- * Loads the progress with a custom JSON String
- * Recommended to only load progress for online players!
- *
- * @param uuid Player UUID to check
- * @param json JSON String to load from
- * @param advancementsLoaded Array of advancements to check
- */
- @Deprecated
- public void loadCustomProgress(UUID uuid, String json, Advancement... advancementsLoaded) {
- if(advancementsLoaded.length == 0) return;
- List advancements = Arrays.asList(advancementsLoaded);
-
- HashMap> prg = getCustomProgress(json);
+ for(Advancement advancement : advancements) {
+ checkAwarded(uuid, advancement);
- for(Advancement advancement : advancements) {
- checkAwarded(uuid, advancement);
+ String nameKey = advancement.getName().toString();
+
+ if(prg.containsKey(nameKey)) {
+ List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- String nameKey = advancement.getName().toString();
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(uuid, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
- if(prg.containsKey(nameKey)) {
- List loaded = prg.get(nameKey);
-
+ if(saveMethod == SaveMethod.DEFAULT) {
grantCriteria(uuid, advancement, loaded.toArray(new String[loaded.size()]));
-
}
}
}
+ }
+
+ /**
+ * Loads the progress with a custom JSON String
+ * Recommended to only load progress for online players!
+ *
+ * @param uuid Player UUID to check
+ * @param json JSON String to load from
+ */
+ @Deprecated
+ public void loadCustomProgress(UUID uuid, String json) {
+ HashMap> prg = getCustomProgress(json);
- /**
- * Loads the progress with a custom JSON String
- * Recommended to only load progress for online players!
- *
- * @param uuid Player UUID to check
- * @param json JSON String to load from
- */
- @Deprecated
- public void loadCustomProgress(UUID uuid, String json) {
- HashMap> prg = getCustomProgress(json);
+ for(Advancement advancement : advancements) {
+ checkAwarded(uuid, advancement);
- for(Advancement advancement : advancements) {
- checkAwarded(uuid, advancement);
+ String nameKey = advancement.getName().toString();
+
+ if(prg.containsKey(nameKey)) {
+ List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- String nameKey = advancement.getName().toString();
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(uuid, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
- if(prg.containsKey(nameKey)) {
- List loaded = prg.get(nameKey);
-
+ if(saveMethod == SaveMethod.DEFAULT) {
grantCriteria(uuid, advancement, loaded.toArray(new String[loaded.size()]));
-
}
}
}
+ }
+
+ /**
+ * Loads the progress with a custom JSON String
+ * Recommended to only load progress for online players!
+ *
+ * @param uuid Player UUID to check
+ * @param json JSON String to load from
+ * @param namespace Namespace to check
+ */
+ @Deprecated
+ public void loadCustomProgress(UUID uuid, String json, String namespace) {
+ HashMap> prg = getCustomProgress(json);
- /**
- * Loads the progress with a custom JSON String
- * Recommended to only load progress for online players!
- *
- * @param uuid Player UUID to check
- * @param json JSON String to load from
- * @param namespace Namespace to check
- */
- @Deprecated
- public void loadCustomProgress(UUID uuid, String json, String namespace) {
- HashMap> prg = getCustomProgress(json);
-
- for(Advancement advancement : advancements) {
- if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
- checkAwarded(uuid, advancement);
+ for(Advancement advancement : advancements) {
+ if(advancement.getName().getNamespace().equalsIgnoreCase(namespace)) {
+ checkAwarded(uuid, advancement);
+
+ String nameKey = advancement.getName().toString();
+
+ if(prg.containsKey(nameKey)) {
+ List loaded = prg.get(nameKey);
+ SaveMethod saveMethod = advancement.getSaveMethod();
- String nameKey = advancement.getName().toString();
+ if(saveMethod == SaveMethod.NUMBER) {
+ if(loaded.size() == 2) {
+ if(loaded.get(0).equals("NUM")) {
+ try {
+ int progress = Integer.parseInt(loaded.get(1));
+ setCriteriaProgress(uuid, advancement, progress);
+ } catch (NumberFormatException e) {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ } else {
+ //Use Default Load Method
+ saveMethod = SaveMethod.DEFAULT;
+ }
+ }
- if(prg.containsKey(nameKey)) {
- List loaded = prg.get(nameKey);
-
+ if(saveMethod == SaveMethod.DEFAULT) {
grantCriteria(uuid, advancement, loaded.toArray(new String[loaded.size()]));
-
}
}
}
}
-
- //Unload Progress
-
- /**
- * Unloads the progress for all advancements in the manager
- * Does not work for Online Players!
- *
- * @param uuid Affected Player UUID
- */
- public void unloadProgress(UUID uuid) {
- if(isOnline(uuid)) {
- throw new UnloadProgressFailedException(uuid);
- } else {
- for(Advancement advancement : getAdvancements()) {
- advancement.unsetProgress(uuid);
- }
+ }
+
+ //Unload Progress
+
+ /**
+ * Unloads the progress for all advancements in the manager
+ * Does not work for Online Players!
+ *
+ * @param uuid Affected Player UUID
+ */
+ public void unloadProgress(UUID uuid) {
+ if(isOnline(uuid)) {
+ throw new UnloadProgressFailedException(uuid);
+ } else {
+ for(Advancement advancement : getAdvancements()) {
+ advancement.unsetProgress(uuid);
+ advancement.unsetAwardedCriteria(uuid);
}
}
-
- /**
- * Unloads the progress for all advancements in the manager with a specified namespace
- * Does not work for Online Players!
- *
- * @param uuid Affected Player UUID
- * @param namespace Specific Namespace
- */
- public void unloadProgress(UUID uuid, String namespace) {
- if(isOnline(uuid)) {
- throw new UnloadProgressFailedException(uuid);
- } else {
- for(Advancement advancement : getAdvancements(namespace)) {
- advancement.unsetProgress(uuid);
- }
+ }
+
+ /**
+ * Unloads the progress for all advancements in the manager with a specified namespace
+ * Does not work for Online Players!
+ *
+ * @param uuid Affected Player UUID
+ * @param namespace Specific Namespace
+ */
+ public void unloadProgress(UUID uuid, String namespace) {
+ if(isOnline(uuid)) {
+ throw new UnloadProgressFailedException(uuid);
+ } else {
+ for(Advancement advancement : getAdvancements(namespace)) {
+ advancement.unsetProgress(uuid);
+ advancement.unsetAwardedCriteria(uuid);
}
}
-
- /**
- * Unloads the progress for the given advancements
- * Does not work for Online Players!
- *
- * @param uuid Affected Player UUID
- * @param advancements Specific Advancements
- */
- public void unloadProgress(UUID uuid, Advancement... advancements) {
- if(isOnline(uuid)) {
- throw new UnloadProgressFailedException(uuid);
- } else {
- for(Advancement advancement : advancements) {
- advancement.unsetProgress(uuid);
- }
+ }
+
+ /**
+ * Unloads the progress for the given advancements
+ * Does not work for Online Players!
+ *
+ * @param uuid Affected Player UUID
+ * @param advancements Specific Advancements
+ */
+ public void unloadProgress(UUID uuid, Advancement... advancements) {
+ if(isOnline(uuid)) {
+ throw new UnloadProgressFailedException(uuid);
+ } else {
+ for(Advancement advancement : advancements) {
+ advancement.unsetProgress(uuid);
+ advancement.unsetAwardedCriteria(uuid);
}
}
+ }
+
+ private HashMap> getProgress(UUID uuid, String namespace) {
+ File saveFile = getSaveFile(uuid, namespace);
- private HashMap> getProgress(UUID uuid, String namespace) {
- File saveFile = getSaveFile(uuid, namespace);
+ try {
+ FileReader os = new FileReader(saveFile);
- try {
- FileReader os = new FileReader(saveFile);
-
- JsonParser parser = new JsonParser();
- JsonElement element = parser.parse(os);
- os.close();
-
- check();
-
- HashMap> progressList = gson.fromJson(element, progressListType);
-
- return progressList;
- } catch (Exception ex) {
- ex.printStackTrace();
- return new HashMap<>();
- }
+ JsonParser parser = new JsonParser();
+ JsonElement element = parser.parse(os);
+ os.close();
+
+ check();
+
+ HashMap> progressList = gson.fromJson(element, progressListType);
+
+ return progressList;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ return new HashMap<>();
}
+ }