Fixed quest GUI showing dupes

This commit is contained in:
Jules 2024-09-07 18:21:26 +02:00
parent 88760db078
commit 0e365c58c8

View File

@ -28,226 +28,227 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class QuestViewer extends EditableInventory { public class QuestViewer extends EditableInventory {
public QuestViewer() { public QuestViewer() {
super("quest-list"); super("quest-list");
} }
@Override @Override
public InventoryItem load(String function, ConfigurationSection config) { public InventoryItem load(String function, ConfigurationSection config) {
if (function.equals("quest")) if (function.equals("quest"))
return new QuestItem(config); return new QuestItem(config);
if (function.equals("previous")) if (function.equals("previous"))
return new SimplePlaceholderItem<QuestInventory>(config) { return new SimplePlaceholderItem<QuestInventory>(config) {
@Override @Override
public boolean canDisplay(QuestInventory inv) { public boolean canDisplay(QuestInventory inv) {
return inv.page > 0; return inv.page > 0;
} }
}; };
if (function.equals("next")) if (function.equals("next"))
return new SimplePlaceholderItem<QuestInventory>(config) { return new SimplePlaceholderItem<QuestInventory>(config) {
@Override @Override
public boolean canDisplay(QuestInventory inv) { public boolean canDisplay(QuestInventory inv) {
return inv.perPage * (inv.page + 1) < inv.quests.size(); return inv.perPage * (inv.page + 1) < inv.quests.size();
} }
}; };
return new SimplePlaceholderItem(config); return new SimplePlaceholderItem(config);
} }
public GeneratedInventory newInventory(PlayerData data) { public GeneratedInventory newInventory(PlayerData data) {
return new QuestInventory(data, this); return new QuestInventory(data, this);
} }
public class QuestItem extends SimplePlaceholderItem { public class QuestItem extends SimplePlaceholderItem {
private final SimplePlaceholderItem noQuest, locked; private final SimplePlaceholderItem noQuest, locked;
private final String mainHit, mainNotHit, professionHit, professionNotHit; private final String mainHit, mainNotHit, professionHit, professionNotHit;
private final SimpleDateFormat dateFormat; private final SimpleDateFormat dateFormat;
public QuestItem(ConfigurationSection config) { public QuestItem(ConfigurationSection config) {
super(config); super(config);
Validate.isTrue(config.contains("no-quest"), "Could not load config 'no-quest'"); Validate.isTrue(config.contains("no-quest"), "Could not load config 'no-quest'");
Validate.isTrue(config.contains("locked"), "Could not load config 'locked'"); Validate.isTrue(config.contains("locked"), "Could not load config 'locked'");
locked = new SimplePlaceholderItem(config.getConfigurationSection("locked")); locked = new SimplePlaceholderItem(config.getConfigurationSection("locked"));
noQuest = new SimplePlaceholderItem(config.getConfigurationSection("no-quest")); noQuest = new SimplePlaceholderItem(config.getConfigurationSection("no-quest"));
Validate.isTrue(config.contains("date-format"), "Could not find date-format"); Validate.isTrue(config.contains("date-format"), "Could not find date-format");
dateFormat = new SimpleDateFormat(config.getString("date-format")); dateFormat = new SimpleDateFormat(config.getString("date-format"));
Validate.notNull(mainHit = config.getString("level-requirement.main.hit"), "Could not load 'level-requirement.main.hit'"); Validate.notNull(mainHit = config.getString("level-requirement.main.hit"), "Could not load 'level-requirement.main.hit'");
Validate.notNull(mainNotHit = config.getString("level-requirement.main.not-hit"), "Could not load 'level-requirement.main.not-hit'"); Validate.notNull(mainNotHit = config.getString("level-requirement.main.not-hit"), "Could not load 'level-requirement.main.not-hit'");
Validate.notNull(professionHit = config.getString("level-requirement.profession.hit"), Validate.notNull(professionHit = config.getString("level-requirement.profession.hit"),
"Could not load 'level-requirement.profession.hit'"); "Could not load 'level-requirement.profession.hit'");
Validate.notNull(professionNotHit = config.getString("level-requirement.profession.not-hit"), Validate.notNull(professionNotHit = config.getString("level-requirement.profession.not-hit"),
"Could not load 'level-requirement.profession.not-hit'"); "Could not load 'level-requirement.profession.not-hit'");
} }
@Override @Override
public boolean hasDifferentDisplay() { public boolean hasDifferentDisplay() {
return true; return true;
} }
@Override @Override
public ItemStack display(GeneratedInventory inv, int n) { public ItemStack display(GeneratedInventory inv, int itemIndex) {
final QuestInventory list = (QuestInventory) inv;
final int index = list.page * list.perPage + itemIndex;
QuestInventory list = (QuestInventory) inv; if (index >= list.quests.size())
int index = list.page * list.perPage + n; return noQuest.display(inv, itemIndex);
if (index >= list.quests.size())
return noQuest.display(inv, n);
Quest quest = list.quests.get(index); Quest quest = list.quests.get(index);
if (quest.hasParent() && !inv.getPlayerData().getQuestData().checkParentAvailability(quest)) if (quest.hasParent() && !inv.getPlayerData().getQuestData().checkParentAvailability(quest))
return locked.display(inv, n); return locked.display(inv, itemIndex);
List<String> lore = new ArrayList<>(getLore()); List<String> lore = new ArrayList<>(getLore());
// Replace quest lore // Replace quest lore
index = lore.indexOf("{lore}"); int loreIndex = lore.indexOf("{lore}");
if (index >= 0) { if (loreIndex >= 0) {
lore.remove(index); lore.remove(loreIndex);
for (int j = 0; j < quest.getLore().size(); j++) for (int j = 0; j < quest.getLore().size(); j++)
lore.add(index + j, quest.getLore().get(j)); lore.add(loreIndex + j, quest.getLore().get(j));
} }
// Calculate lore for later // Calculate lore for later
int reqCount = quest.countLevelRestrictions(); int reqCount = quest.countLevelRestrictions();
boolean started = inv.getPlayerData().getQuestData().hasCurrent(quest), completed = inv.getPlayerData().getQuestData().hasFinished(quest), boolean started = inv.getPlayerData().getQuestData().hasCurrent(quest), completed = inv.getPlayerData().getQuestData().hasFinished(quest),
cooldown = completed && inv.getPlayerData().getQuestData().checkCooldownAvailability(quest); cooldown = completed && inv.getPlayerData().getQuestData().checkCooldownAvailability(quest);
lore.removeIf(next -> (next.startsWith("{level_req}") && reqCount < 1) lore.removeIf(next -> (next.startsWith("{level_req}") && reqCount < 1)
|| (next.startsWith("{started}") && !started) || (next.startsWith("{started}") && !started)
|| (next.startsWith("{!started}") && started) || (next.startsWith("{!started}") && started)
|| (next.startsWith("{completed}") && !completed) || (next.startsWith("{completed}") && !completed)
|| (next.startsWith("{completed_cannot_redo}") && !(completed && !quest.isRedoable())) || (next.startsWith("{completed_cannot_redo}") && !(completed && !quest.isRedoable()))
|| (next.startsWith("{completed_can_redo}") && !(cooldown && quest.isRedoable())) || (next.startsWith("{completed_can_redo}") && !(cooldown && quest.isRedoable()))
|| (next.startsWith("{completed_delay}") && !(completed && !cooldown))); || (next.startsWith("{completed_delay}") && !(completed && !cooldown)));
// Replace level requirements // Replace level requirements
index = lore.indexOf("{level_req}{level_requirements}"); loreIndex = lore.indexOf("{level_req}{level_requirements}");
if (index >= 0) { if (loreIndex >= 0) {
lore.remove(index); lore.remove(loreIndex);
int mainRequired = quest.getLevelRestriction(null); int mainRequired = quest.getLevelRestriction(null);
if (mainRequired > 0) if (mainRequired > 0)
lore.add(index, (inv.getPlayerData().getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired)); lore.add(loreIndex, (inv.getPlayerData().getLevel() >= mainRequired ? mainHit : mainNotHit).replace("{level}", "" + mainRequired));
for (Profession profession : quest.getLevelRestrictions()) { for (Profession profession : quest.getLevelRestrictions()) {
int required = quest.getLevelRestriction(profession); int required = quest.getLevelRestriction(profession);
lore.add(index + (mainRequired > 0 ? 1 : 0), lore.add(loreIndex + (mainRequired > 0 ? 1 : 0),
(inv.getPlayerData().getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit) (inv.getPlayerData().getCollectionSkills().getLevel(profession) >= required ? professionHit : professionNotHit)
.replace("{level}", "" + required).replace("{profession}", profession.getName())); .replace("{level}", "" + required).replace("{profession}", profession.getName()));
} }
} }
Placeholders holders = getPlaceholders(inv, n); Placeholders holders = getPlaceholders(inv, itemIndex);
for (int j = 0; j < lore.size(); j++) for (int j = 0; j < lore.size(); j++)
lore.set(j, ChatColor.GRAY + holders.apply(inv.getPlayer(), lore.get(j))); lore.set(j, ChatColor.GRAY + holders.apply(inv.getPlayer(), lore.get(j)));
// Generate item // Generate item
ItemStack item = super.display(inv, n); ItemStack item = super.display(inv, itemIndex);
ItemMeta meta = item.getItemMeta(); ItemMeta meta = item.getItemMeta();
meta.setLore(lore); meta.setLore(lore);
meta.getPersistentDataContainer().set(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING,quest.getId()); meta.getPersistentDataContainer().set(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING, quest.getId());
item.setItemMeta(meta); item.setItemMeta(meta);
return item; return item;
} }
@Override @Override
public Placeholders getPlaceholders(GeneratedInventory inv, int n) { public Placeholders getPlaceholders(GeneratedInventory inv, int itemIndex) {
Quest quest = ((QuestInventory) inv).quests.get(n); final QuestInventory list = (QuestInventory) inv;
final Quest quest = ((QuestInventory) inv).quests.get(list.page * list.perPage + itemIndex);
PlayerData data = inv.getPlayerData(); PlayerData data = inv.getPlayerData();
Placeholders holders = new Placeholders(); Placeholders holders = new Placeholders();
holders.register("name", quest.getName()); holders.register("name", quest.getName());
holders.register("total_level_req", quest.getLevelRestrictions().size() + (quest.getLevelRestriction(null) > 0 ? 1 : 0)); holders.register("total_level_req", quest.getLevelRestrictions().size() + (quest.getLevelRestriction(null) > 0 ? 1 : 0));
holders.register("current_level_req", (data.getLevel() >= quest.getLevelRestriction(null) ? 1 : 0) + quest.getLevelRestrictions().stream() holders.register("current_level_req", (data.getLevel() >= quest.getLevelRestriction(null) ? 1 : 0) + quest.getLevelRestrictions().stream()
.filter(type -> data.getCollectionSkills().getLevel(type) >= quest.getLevelRestriction(type)).collect(Collectors.toSet()).size()); .filter(type -> data.getCollectionSkills().getLevel(type) >= quest.getLevelRestriction(type)).collect(Collectors.toSet()).size());
if (data.getQuestData().hasCurrent(quest)) { if (data.getQuestData().hasCurrent(quest)) {
holders.register("objective", data.getQuestData().getCurrent().getFormattedLore()); holders.register("objective", data.getQuestData().getCurrent().getFormattedLore());
holders.register("progress", holders.register("progress",
(int) ((double) data.getQuestData().getCurrent().getObjectiveNumber() / quest.getObjectives().size() * 100.)); (int) ((double) data.getQuestData().getCurrent().getObjectiveNumber() / quest.getObjectives().size() * 100.));
} }
if (data.getQuestData().hasFinished(quest)) { if (data.getQuestData().hasFinished(quest)) {
holders.register("date", dateFormat.format(data.getQuestData().getFinishDate(quest))); holders.register("date", dateFormat.format(data.getQuestData().getFinishDate(quest)));
holders.register("delay", new DelayFormat(2).format(data.getQuestData().getDelayFeft(quest))); holders.register("delay", new DelayFormat(2).format(data.getQuestData().getDelayFeft(quest)));
} }
return holders; return holders;
} }
} }
public class QuestInventory extends GeneratedInventory { public class QuestInventory extends GeneratedInventory {
private final List<Quest> quests = new ArrayList<>(MMOCore.plugin.questManager.getAll()); private final List<Quest> quests = new ArrayList<>(MMOCore.plugin.questManager.getAll());
private final int perPage; private final int perPage;
private int page; private int page;
public QuestInventory(PlayerData playerData, EditableInventory editable) { public QuestInventory(PlayerData playerData, EditableInventory editable) {
super(playerData, editable); super(playerData, editable);
perPage = editable.getByFunction("quest").getSlots().size(); perPage = editable.getByFunction("quest").getSlots().size();
} }
@Override @Override
public String calculateName() { public String calculateName() {
return getName(); return getName();
} }
@Override @Override
public void whenClicked(InventoryClickContext context, InventoryItem item) { public void whenClicked(InventoryClickContext context, InventoryItem item) {
if (item.getFunction().equals("previous")) { if (item.getFunction().equals("previous")) {
page--; page--;
open(); open();
return; return;
} }
if (item.getFunction().equals("next")) { if (item.getFunction().equals("next")) {
page++; page++;
open(); open();
return; return;
} }
if (item.getFunction().equals("quest")) { if (item.getFunction().equals("quest")) {
String questId = context.getClickedItem().getItemMeta().getPersistentDataContainer() String questId = context.getClickedItem().getItemMeta().getPersistentDataContainer()
.get(new NamespacedKey(MMOCore.plugin,"quest_id"), PersistentDataType.STRING); .get(new NamespacedKey(MMOCore.plugin, "quest_id"), PersistentDataType.STRING);
if (questId==null||questId.equals("")) if (questId == null || questId.equals(""))
return; return;
Quest quest = MMOCore.plugin.questManager.get(questId); Quest quest = MMOCore.plugin.questManager.get(questId);
if (playerData.getQuestData().hasCurrent()) { if (playerData.getQuestData().hasCurrent()) {
// Check if the player is cancelling his ongoing quest // Check if the player is cancelling his ongoing quest
if (playerData.getQuestData().hasCurrent(quest)) { if (playerData.getQuestData().hasCurrent(quest)) {
if (context.getClickType() == ClickType.RIGHT) { if (context.getClickType() == ClickType.RIGHT) {
playerData.getQuestData().start(null); playerData.getQuestData().start(null);
MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(player); MMOCore.plugin.soundManager.getSound(SoundEvent.CANCEL_QUEST).playTo(player);
ConfigMessage.fromKey("cancel-quest").send(player); ConfigMessage.fromKey("cancel-quest").send(player);
open(); open();
} }
return; return;
} }
// The player cannot start a new quest if he is already doing one // The player cannot start a new quest if he is already doing one
ConfigMessage.fromKey("already-on-quest").send(player); ConfigMessage.fromKey("already-on-quest").send(player);
return; return;
} }
// Check for level requirements. // Check for level requirements.
int level; int level;
if (playerData.getLevel() < (level = quest.getLevelRestriction(null))) { if (playerData.getLevel() < (level = quest.getLevelRestriction(null))) {
ConfigMessage.fromKey("quest-level-restriction", "level", "Lvl", "count", "" + level).send(player); ConfigMessage.fromKey("quest-level-restriction", "level", "Lvl", "count", "" + level).send(player);
return; return;
} }
for (Profession profession : quest.getLevelRestrictions()) for (Profession profession : quest.getLevelRestrictions())
if (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) { if (playerData.getCollectionSkills().getLevel(profession) < (level = quest.getLevelRestriction(profession))) {
@ -256,27 +257,27 @@ public class QuestViewer extends EditableInventory {
return; return;
} }
if (playerData.getQuestData().hasFinished(quest)) { if (playerData.getQuestData().hasFinished(quest)) {
// If the player has already finished this quest, he can't start it again // If the player has already finished this quest, he can't start it again
if (!quest.isRedoable()) { if (!quest.isRedoable()) {
ConfigMessage.fromKey("cant-redo-quest").send(player); ConfigMessage.fromKey("cant-redo-quest").send(player);
return; return;
} }
// Has the player waited long enough // Has the player waited long enough
if (!playerData.getQuestData().checkCooldownAvailability(quest)) { if (!playerData.getQuestData().checkCooldownAvailability(quest)) {
ConfigMessage.fromKey("quest-cooldown", "delay", new DelayFormat(2).format(playerData.getQuestData().getDelayFeft(quest))).send(player); ConfigMessage.fromKey("quest-cooldown", "delay", new DelayFormat(2).format(playerData.getQuestData().getDelayFeft(quest))).send(player);
return; return;
} }
} }
// Eventually start the quest // Eventually start the quest
ConfigMessage.fromKey("start-quest", "quest", quest.getName()).send(player); ConfigMessage.fromKey("start-quest", "quest", quest.getName()).send(player);
MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player); MMOCore.plugin.soundManager.getSound(SoundEvent.START_QUEST).playTo(player);
playerData.getQuestData().start(quest); playerData.getQuestData().start(quest);
open(); open();
} }
} }
} }
} }