1
0
mirror of https://github.com/Zrips/Jobs.git synced 2024-11-29 05:55:27 +01:00

Quest detailed progress being reset after plugin reload fix

This commit is contained in:
Zrips 2022-08-08 12:51:46 +03:00
parent dfab76b273
commit 7c7b269e7d
3 changed files with 265 additions and 224 deletions

View File

@ -58,188 +58,188 @@ public class JobItems {
private int untilLevel = Integer.MAX_VALUE;
public JobItems(String node, CMIMaterial mat, int amount, String name, List<String> lore, Map<Enchantment, Integer> enchants, BoostMultiplier boostMultiplier, List<Job> jobs) {
this(node, mat, amount, name, lore, enchants, boostMultiplier, jobs, null, null);
this(node, mat, amount, name, lore, enchants, boostMultiplier, jobs, null, null);
}
public JobItems(String node, CMIMaterial mat, int amount, String name, List<String> lore, Map<Enchantment, Integer> enchants, BoostMultiplier boostMultiplier, List<Job> jobs,
Object potion, Color leatherColor) {
if (mat == null) {
mat = CMIMaterial.STONE;
}
Object potion, Color leatherColor) {
if (mat == null) {
mat = CMIMaterial.STONE;
}
if (enchants != null) {
this.enchants.putAll(enchants);
}
if (enchants != null) {
this.enchants.putAll(enchants);
}
this.node = node;
this.node = node;
if (boostMultiplier != null) {
this.boostMultiplier = boostMultiplier;
}
if (boostMultiplier != null) {
this.boostMultiplier = boostMultiplier;
}
setJobs(jobs);
setJobs(jobs);
ItemMeta meta = (item = mat.newItemStack()).getItemMeta();
if (potion != null && meta instanceof PotionMeta && CMIMaterial.isPotion(mat.getMaterial())) {
PotionMeta potionMeta = (PotionMeta) meta;
ItemMeta meta = (item = mat.newItemStack()).getItemMeta();
if (potion != null && meta instanceof PotionMeta && CMIMaterial.isPotion(mat.getMaterial())) {
PotionMeta potionMeta = (PotionMeta) meta;
if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) {
potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion);
} else if (potion instanceof org.bukkit.potion.Potion) {
PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType();
if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) {
potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion);
} else if (potion instanceof org.bukkit.potion.Potion) {
PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType();
if (effectType != null) {
potionMeta.setMainEffect(effectType);
}
}
if (effectType != null) {
potionMeta.setMainEffect(effectType);
}
}
meta = potionMeta;
} else if (leatherColor != null && meta instanceof LeatherArmorMeta && CMIMaterial.isLeatherArmor(mat.getMaterial())) {
LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta;
armorMeta.setColor(this.leatherColor = leatherColor);
meta = armorMeta;
}
meta = potionMeta;
} else if (leatherColor != null && meta instanceof LeatherArmorMeta && CMIMaterial.isLeatherArmor(mat.getMaterial())) {
LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta;
armorMeta.setColor(this.leatherColor = leatherColor);
meta = armorMeta;
}
if (meta != null) {
if (name != null)
meta.setDisplayName(CMIChatColor.translate(name));
if (meta != null) {
if (name != null)
meta.setDisplayName(CMIChatColor.translate(name));
if (lore != null)
meta.setLore(lore);
if (lore != null)
meta.setLore(lore);
if (enchants != null) {
if (mat == CMIMaterial.ENCHANTED_BOOK) {
EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta;
for (Entry<Enchantment, Integer> oneEnch : enchants.entrySet()) {
bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true);
}
} else {
for (Entry<Enchantment, Integer> oneEnchant : enchants.entrySet()) {
meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true);
}
}
}
if (enchants != null) {
if (mat == CMIMaterial.ENCHANTED_BOOK) {
EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta;
for (Entry<Enchantment, Integer> oneEnch : enchants.entrySet()) {
bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true);
}
} else {
for (Entry<Enchantment, Integer> oneEnchant : enchants.entrySet()) {
meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true);
}
}
}
item.setItemMeta(meta);
}
item.setItemMeta(meta);
}
item.setAmount(amount);
CMINBT nbt = new CMINBT(item);
item = (ItemStack) nbt.setString("JobsItemBoost", node);
item.setAmount(amount);
CMINBT nbt = new CMINBT(item);
item = (ItemStack) nbt.setString("JobsItemBoost", node);
}
public String getNode() {
return node;
return node;
}
public ItemStack getItemStack(Player player) {
if (player == null)
return item;
if (player == null)
return item;
ItemStack item = this.item.clone();
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return item;
}
ItemStack item = this.item.clone();
ItemMeta meta = item.getItemMeta();
if (meta == null) {
return item;
}
if (potion != null && CMIMaterial.isPotion(item.getType()) && meta instanceof PotionMeta) {
PotionMeta potionMeta = (PotionMeta) meta;
if (potion != null && CMIMaterial.isPotion(item.getType()) && meta instanceof PotionMeta) {
PotionMeta potionMeta = (PotionMeta) meta;
if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) {
potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion);
} else if (potion instanceof org.bukkit.potion.Potion) {
PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType();
if (Version.isCurrentEqualOrHigher(Version.v1_10_R1) && potion instanceof org.bukkit.potion.PotionData) {
potionMeta.setBasePotionData((org.bukkit.potion.PotionData) potion);
} else if (potion instanceof org.bukkit.potion.Potion) {
PotionEffectType effectType = ((org.bukkit.potion.Potion) potion).getType().getEffectType();
if (effectType != null) {
potionMeta.setMainEffect(effectType);
}
}
if (effectType != null) {
potionMeta.setMainEffect(effectType);
}
}
meta = potionMeta;
} else if (leatherColor != null && CMIMaterial.isLeatherArmor(item.getType()) && meta instanceof LeatherArmorMeta) {
LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta;
armorMeta.setColor(leatherColor);
meta = armorMeta;
}
meta = potionMeta;
} else if (leatherColor != null && CMIMaterial.isLeatherArmor(item.getType()) && meta instanceof LeatherArmorMeta) {
LeatherArmorMeta armorMeta = (LeatherArmorMeta) meta;
armorMeta.setColor(leatherColor);
meta = armorMeta;
}
if (meta.hasDisplayName())
meta.setDisplayName(CMIChatColor.translate(meta.getDisplayName().replace("[player]", player.getName())));
if (meta.hasDisplayName())
meta.setDisplayName(CMIChatColor.translate(meta.getDisplayName().replace("[player]", player.getName())));
if (meta.hasLore()) {
List<String> translatedLore = meta.getLore();
if (meta.hasLore()) {
List<String> translatedLore = meta.getLore();
for (int a = 0; a < translatedLore.size(); a++) {
translatedLore.set(a, CMIChatColor.translate(translatedLore.get(a).replace("[player]", player.getName())));
}
for (int a = 0; a < translatedLore.size(); a++) {
translatedLore.set(a, CMIChatColor.translate(translatedLore.get(a).replace("[player]", player.getName())));
}
meta.setLore(translatedLore);
}
meta.setLore(translatedLore);
}
if (enchants != null) {
if (item.getType() == CMIMaterial.ENCHANTED_BOOK.getMaterial()) {
EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta;
for (Entry<Enchantment, Integer> oneEnch : enchants.entrySet()) {
bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true);
}
} else {
for (Entry<Enchantment, Integer> oneEnchant : enchants.entrySet()) {
meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true);
}
}
}
if (enchants != null) {
if (item.getType() == CMIMaterial.ENCHANTED_BOOK.getMaterial()) {
EnchantmentStorageMeta bookMeta = (EnchantmentStorageMeta) meta;
for (Entry<Enchantment, Integer> oneEnch : enchants.entrySet()) {
bookMeta.addStoredEnchant(oneEnch.getKey(), oneEnch.getValue(), true);
}
} else {
for (Entry<Enchantment, Integer> oneEnchant : enchants.entrySet()) {
meta.addEnchant(oneEnchant.getKey(), oneEnchant.getValue(), true);
}
}
}
item.setItemMeta(meta);
return item;
item.setItemMeta(meta);
return item;
}
public BoostMultiplier getBoost() {
return boostMultiplier.clone();
return boostMultiplier.clone();
}
public BoostMultiplier getBoost(JobProgression job) {
if (job == null || !jobs.contains(job.getJob()) || job.getLevel() < getFromLevel() || job.getLevel() > getUntilLevel())
return new BoostMultiplier();
if (job == null || !jobs.contains(job.getJob()) || job.getLevel() < getFromLevel() || job.getLevel() > getUntilLevel())
return new BoostMultiplier();
return boostMultiplier.clone();
return boostMultiplier.clone();
}
public List<Job> getJobs() {
return jobs;
return jobs;
}
public void setJobs(List<Job> jobs) {
this.jobs.clear();
this.jobs.clear();
if (jobs != null) {
this.jobs.addAll(jobs);
}
if (jobs != null) {
this.jobs.addAll(jobs);
}
}
public Map<Enchantment, Integer> getEnchants() {
return enchants;
return enchants;
}
public int getFromLevel() {
return fromLevel;
return fromLevel;
}
public void setFromLevel(int fromLevel) {
this.fromLevel = fromLevel;
this.fromLevel = fromLevel;
}
public int getUntilLevel() {
return untilLevel;
return untilLevel;
}
public void setUntilLevel(int untilLevel) {
this.untilLevel = untilLevel;
this.untilLevel = untilLevel;
}
public String getLegacyKey() {
return legacyKey;
return legacyKey;
}
public void setLegacyKey(String legacyKey) {
this.legacyKey = legacyKey;
this.legacyKey = legacyKey;
}
}

View File

@ -9,50 +9,54 @@ public class QuestObjective {
private ActionType action = null;
public QuestObjective(ActionType action, int id, String meta, String name, int amount) {
this.action = action;
this.id = id;
this.meta = meta;
this.name = name;
this.amount = amount;
this.action = action;
this.id = id;
this.meta = meta;
this.name = name;
this.amount = amount;
}
public int getTargetId() {
return id;
return id;
}
public void setTargetId(int id) {
this.id = id;
this.id = id;
}
public String getTargetMeta() {
return meta;
return meta;
}
public void setTargetMeta(String meta) {
this.meta = meta;
this.meta = meta;
}
public String getTargetName() {
return name;
return name;
}
public void setTargetName(String name) {
this.name = name;
this.name = name;
}
public int getAmount() {
return amount;
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
this.amount = amount;
}
public ActionType getAction() {
return action;
return action;
}
public void setAction(ActionType action) {
this.action = action;
this.action = action;
}
public boolean same(QuestObjective obj) {
return obj.id == this.id && obj.meta.equals(this.meta) && obj.name.equals(this.name) && obj.amount == this.amount && obj.action == this.action;
}
}

View File

@ -24,168 +24,205 @@ public class QuestProgression {
private final Map<QuestObjective, Integer> done = new HashMap<>();
public QuestProgression(Quest quest) {
this.quest = quest;
this.quest = quest;
validUntil = quest.getValidUntil();
validUntil = quest.getValidUntil();
}
public Quest getQuest() {
if (quest == null)
return null;
if (quest == null)
return null;
Job job = quest.getJob();
return job == null ? null : job.getQuest(quest.getConfigName());
Job job = quest.getJob();
return job == null ? null : job.getQuest(quest.getConfigName());
}
public void setQuest(Quest quest) {
this.quest = quest;
this.quest = quest;
}
public int getTotalAmountNeeded() {
int amountNeeded = 0;
for (Map<String, QuestObjective> oneA : quest.getObjectives().values()) {
for (QuestObjective one : oneA.values()) {
amountNeeded += one.getAmount();
}
}
return amountNeeded;
int amountNeeded = 0;
for (Map<String, QuestObjective> oneA : quest.getObjectives().values()) {
for (QuestObjective one : oneA.values()) {
amountNeeded += one.getAmount();
}
}
return amountNeeded;
}
public void reset() {
validUntil = quest.getValidUntil();
givenReward = false;
done.clear();
validUntil = quest.getValidUntil();
givenReward = false;
done.clear();
}
public int getTotalAmountDone() {
int amountDone = 0;
for (Integer one : done.values()) {
amountDone += one;
}
int amountDone = 0;
for (Integer one : done.values()) {
amountDone += one;
}
return amountDone;
return amountDone;
}
public int getAmountDone(QuestObjective objective) {
return done.getOrDefault(objective, 0);
Integer result = done.get(objective);
if (result != null)
return result;
// We might need to readd questObjectives in case config file got reloaded and new objective objects have been created which no longer match previous cache
Map<String, QuestObjective> objectives = quest.getJob().getQuest(quest.getConfigName()).getObjectives().get(objective.getAction());
QuestObjective globalObj = null;
QuestObjective replaceableObj = null;
for (QuestObjective one : objectives.values()) {
if (!one.same(objective))
continue;
globalObj = one;
break;
}
for (QuestObjective one : done.keySet()) {
if (!one.same(objective))
continue;
replaceableObj = one;
break;
}
if (globalObj == null || replaceableObj == null)
return 0;
Integer record = done.get(replaceableObj);
if (record == null)
return 0;
done.remove(replaceableObj);
done.put(globalObj, record);
return record;
}
public void setAmountDone(QuestObjective objective, int amountDone) {
if (quest.hasObjective(objective)) {
done.put(objective, amountDone);
}
if (quest.hasObjective(objective)) {
done.put(objective, amountDone);
}
}
public long getValidUntil() {
return validUntil;
return validUntil;
}
public void setValidUntil(long validUntil) {
this.validUntil = validUntil;
this.validUntil = validUntil;
}
public boolean isValid() {
return !isEnded();
return !isEnded();
}
public boolean isEnded() {
return validUntil < System.currentTimeMillis();
return validUntil < System.currentTimeMillis();
}
public boolean isCompleted() {
for (Map<String, QuestObjective> oneA : quest.getObjectives().values()) {
for (QuestObjective one : oneA.values()) {
Integer amountDone = done.get(one);
if (amountDone == null || amountDone < one.getAmount())
return false;
}
}
return true;
for (Map<String, QuestObjective> oneA : quest.getObjectives().values()) {
for (QuestObjective one : oneA.values()) {
Integer amountDone = done.get(one);
if (amountDone == null || amountDone < one.getAmount())
return false;
}
}
return true;
}
public void processQuest(JobsPlayer jPlayer, ActionInfo action) {
if (quest.isStopped() || !quest.hasAction(action.getType()))
return;
if (quest.isStopped() || !quest.hasAction(action.getType()))
return;
Map<String, QuestObjective> byAction = quest.getObjectives().get(action.getType());
QuestObjective objective = objectiveForAction(action);
Map<String, QuestObjective> byAction = quest.getObjectives().get(action.getType());
QuestObjective objective = objectiveForAction(action);
if (byAction != null && objective == null)
return;
if (byAction != null && objective == null)
return;
org.bukkit.entity.Player player = jPlayer.getPlayer();
org.bukkit.entity.Player player = jPlayer.getPlayer();
for (String area : quest.getRestrictedAreas()) {
for (Entry<String, RestrictedArea> a : Jobs.getRestrictedAreaManager().getRestrictedAreas().entrySet()) {
if (a.getKey().equalsIgnoreCase(area) && a.getValue().inRestrictedArea(player.getLocation())) {
return;
}
}
}
for (String area : quest.getRestrictedAreas()) {
for (Entry<String, RestrictedArea> a : Jobs.getRestrictedAreaManager().getRestrictedAreas().entrySet()) {
if (a.getKey().equalsIgnoreCase(area) && a.getValue().inRestrictedArea(player.getLocation())) {
return;
}
}
}
Job questJob = quest.getJob();
if (questJob != null) {
int maxQuest = jPlayer.getPlayerMaxQuest(questJob.getName());
if (maxQuest > 0 && jPlayer.getDoneQuests() >= maxQuest) {
return;
}
}
Job questJob = quest.getJob();
if (questJob != null) {
int maxQuest = jPlayer.getPlayerMaxQuest(questJob.getName());
if (maxQuest > 0 && jPlayer.getDoneQuests() >= maxQuest) {
return;
}
}
if (!isCompleted() &&
objective != null) {
Integer old = done.getOrDefault(objective, 0);
done.put(objective, old < objective.getAmount() ? old + 1 : objective.getAmount());
}
if (!isCompleted() &&
objective != null) {
Integer old = done.getOrDefault(objective, 0);
done.put(objective, old < objective.getAmount() ? old + 1 : objective.getAmount());
}
jPlayer.setSaved(false);
jPlayer.setSaved(false);
if (!isCompleted() || !player.isOnline() || givenReward)
return;
if (!isCompleted() || !player.isOnline() || givenReward)
return;
givenReward = true;
givenReward = true;
jPlayer.addDoneQuest(questJob);
jPlayer.addDoneQuest(questJob);
for (String one : quest.getRewardCmds()) {
ServerCommandEvent ev = new ServerCommandEvent(Bukkit.getConsoleSender(), one.replace("[playerName]", player.getName()));
Bukkit.getPluginManager().callEvent(ev);
if (!ev.isCancelled()) {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), ev.getCommand().startsWith("/") ? ev.getCommand().substring(1) : ev.getCommand());
}
}
for (String one : quest.getRewardCmds()) {
ServerCommandEvent ev = new ServerCommandEvent(Bukkit.getConsoleSender(), one.replace("[playerName]", player.getName()));
Bukkit.getPluginManager().callEvent(ev);
if (!ev.isCancelled()) {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), ev.getCommand().startsWith("/") ? ev.getCommand().substring(1) : ev.getCommand());
}
}
}
public boolean isGivenReward() {
return givenReward;
return givenReward;
}
public void setGivenReward(boolean givenReward) {
this.givenReward = givenReward;
this.givenReward = givenReward;
}
private static boolean objectiveKeyMatches(String objectiveKey, ActionInfo actionInfo) {
if (actionInfo instanceof EnchantActionInfo) {
return Util.enchantMatchesActionInfo(objectiveKey, (EnchantActionInfo) actionInfo);
}
if (actionInfo instanceof EnchantActionInfo) {
return Util.enchantMatchesActionInfo(objectiveKey, (EnchantActionInfo) actionInfo);
}
return (objectiveKey.equalsIgnoreCase(actionInfo.getNameWithSub()) ||
objectiveKey.equalsIgnoreCase(actionInfo.getName()));
return (objectiveKey.equalsIgnoreCase(actionInfo.getNameWithSub()) ||
objectiveKey.equalsIgnoreCase(actionInfo.getName()));
}
private QuestObjective objectiveForAction(ActionInfo actionInfo) {
Map<String, QuestObjective> byAction = quest.getObjectives().get(actionInfo.getType());
if (byAction == null) {
return null;
}
Map<String, QuestObjective> byAction = quest.getObjectives().get(actionInfo.getType());
if (byAction == null) {
return null;
}
for (Map.Entry<String, QuestObjective> objectiveEntry : byAction.entrySet()) {
String objectiveKey = objectiveEntry.getKey();
for (Map.Entry<String, QuestObjective> objectiveEntry : byAction.entrySet()) {
String objectiveKey = objectiveEntry.getKey();
if (objectiveKeyMatches(objectiveKey, actionInfo)) {
return objectiveEntry.getValue();
}
}
if (objectiveKeyMatches(objectiveKey, actionInfo)) {
return objectiveEntry.getValue();
}
}
return null;
return null;
}
}