Added 3 more quests

Prevented killing the npc
Made more things configurable
Moved things to the right config
This commit is contained in:
2022-06-03 00:34:02 +02:00
parent 39900153d8
commit c0cb9cae98
24 changed files with 770 additions and 60 deletions
@@ -2,6 +2,10 @@ package com.alttd.altitudequests.objects;
import com.alttd.altitudequests.AQuest;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.MessagesConfig;
import com.alttd.altitudequests.objects.quests.BreedMobsQuest;
import com.alttd.altitudequests.objects.quests.CollectDropsQuest;
import com.alttd.altitudequests.objects.quests.KillMobsQuest;
import com.alttd.altitudequests.objects.quests.MineQuest;
import com.alttd.altitudequests.util.Logger;
import com.alttd.altitudequests.util.Utilities;
@@ -25,10 +29,11 @@ public abstract class Quest {
private static Quest weeklyQuest = null;
private static final List<Class<? extends Quest>> possibleQuests = new ArrayList<>();
//TODO add all data every quest needs
static {
possibleQuests.add(MineQuest.class);
possibleQuests.add(KillMobsQuest.class);
possibleQuests.add(CollectDropsQuest.class);
possibleQuests.add(BreedMobsQuest.class);
}
private final UUID uuid;
@@ -74,7 +79,7 @@ public abstract class Quest {
}
private static HashSet<UUID> queriedUsers = new HashSet<>();
public static void tryLoadDailyQuest(UUID uuid) { //TODO set up a way to listen to the response and load stuff
public static void tryLoadDailyQuest(UUID uuid) {
if (queriedUsers.contains(uuid) || dailyQuests.containsKey(uuid))
return;
queriedUsers.add(uuid);
@@ -108,16 +113,18 @@ public abstract class Quest {
}
public static boolean loadDailyQuest(String quest, String quest_variant, int step_1_progress, int step_2_progress, UUID uuid) {
Optional<Class<? extends Quest>> any = possibleQuests.stream().filter(q -> q.getSimpleName().equals(quest)).findAny();
Optional<Class<? extends Quest>> any = possibleQuests.stream()
.filter(q -> q.getSimpleName().equals(quest))
.findAny();
if (any.isEmpty()) {
//TODO error
Logger.warning("Unable to find % quest giving up loading the quest for %", quest, uuid.toString());
return false;
}
Class<? extends Quest> aClass = any.get();
Constructor<? extends Quest> constructor;
try {
constructor = aClass.getConstructor(String.class, int.class, int.class, UUID.class);
Quest quest1 = constructor.newInstance(quest_variant, step_1_progress, step_2_progress, uuid);
constructor = aClass.getConstructor(UUID.class, int.class, int.class, String.class);
Quest quest1 = constructor.newInstance(uuid, step_1_progress, step_2_progress, quest_variant);
dailyQuests.put(uuid, quest1);
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace();
@@ -134,7 +141,7 @@ public abstract class Quest {
new BukkitRunnable() {
@Override
public void run() {
Bukkit.getServer().sendMessage(MiniMessage.miniMessage().deserialize(Config.RESETTING_QUESTS));
Bukkit.getServer().sendMessage(MiniMessage.miniMessage().deserialize(MessagesConfig.RESETTING_QUESTS));
dailyQuests.clear();
for (Player player : Bukkit.getOnlinePlayers()) {
createDailyQuest(player);
@@ -0,0 +1,117 @@
package com.alttd.altitudequests.objects.quests;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.QuestsConfig;
import com.alttd.altitudequests.database.Database;
import com.alttd.altitudequests.objects.Quest;
import com.alttd.altitudequests.objects.variants.BreedMobsQuestObject;
import com.alttd.altitudequests.util.Logger;
import com.alttd.altitudequests.util.Utilities;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;
public class BreedMobsQuest extends Quest {
private final BreedMobsQuestObject breedMobsQuestObject;
public BreedMobsQuest(UUID uuid) {
super(uuid, 0, 0,
QuestsConfig.BREED_MOB_QUEST.get(Utilities.randomOr0(QuestsConfig.BREED_MOB_QUEST.size() - 1)));
if (getVariant() instanceof BreedMobsQuestObject breedMobsQuestObject)
this.breedMobsQuestObject = breedMobsQuestObject;
else
this.breedMobsQuestObject = null;
if (breedMobsQuestObject == null) {
Logger.warning("Tried to create breedMobQuest but unable to find variant: %.", "unknown");
return;
}
}
public BreedMobsQuest(UUID uuid, int step1, int step2, String variant) {
super(uuid, step1, step2, QuestsConfig.BREED_MOB_QUEST.stream()
.filter(object -> variant.equals(object.getInternalName()))
.findAny().orElse(null));
if (getVariant() instanceof BreedMobsQuestObject breedMobsQuestObject)
this.breedMobsQuestObject = breedMobsQuestObject;
else
this.breedMobsQuestObject = null;
if (breedMobsQuestObject == null) {
Logger.warning("Tried to create breedMobQuest but unable to find variant: %.", variant);
return;
}
checkDone();
}
@Override
public void save() {
String sql = "INSERT INTO generic_quest_progress " +
"(year_day, uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
"VALUES (?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?, year_day = ?";
try {
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
int yearDay = Utilities.getYearDay();
if (Config.DEBUG)
Logger.info("Saving user for year day %.", String.valueOf(yearDay));
statement.setInt(1, yearDay);
statement.setString(2, getUuid().toString());
statement.setString(3, this.getClass().getSimpleName());
statement.setString(4, breedMobsQuestObject.getInternalName());
statement.setInt(5, getStep1());
statement.setInt(6, getStep2());
statement.setString(7, this.getClass().getSimpleName());
statement.setString(8, breedMobsQuestObject.getInternalName());
statement.setInt(9, getStep1());
statement.setInt(10, getStep2());
statement.setInt(11, yearDay);
statement.execute();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@Override
public TagResolver getTagResolvers() {
return TagResolver.resolver(
Placeholder.unparsed("mob", breedMobsQuestObject.getEntityType().name()),
Placeholder.parsed("step_1_progress", getStep1() == breedMobsQuestObject.getAmount() ?
"<green>" + getStep1() + "</green>" : "<red>" + getStep1() + "</red>"),
Placeholder.parsed("step_1_total", String.valueOf(breedMobsQuestObject.getAmount())),
Placeholder.parsed("step_2_progress", getStep2() == breedMobsQuestObject.getAmount() ?
"<green>" + getStep2() + "</green>" : "<red>" + getStep2() + "</red>"),
Placeholder.parsed("step_2_total", String.valueOf(breedMobsQuestObject.getAmount()))
);
}
@Override
public int turnIn(Player player) {
int maxToTurnIn = getMaxToTurnIn();
if (maxToTurnIn == 0)
return 0;
addStep2(maxToTurnIn);
checkDone(player);
return maxToTurnIn;
}
@Override
public Component getDisplayName() {
return MiniMessage.miniMessage().deserialize(QuestsConfig.BREED_MOB_QUEST_NAME);
}
public void breed(LivingEntity entity) {
if (isDone() || !entity.getType().equals(breedMobsQuestObject.getEntityType()))
return;
addStep1(1);
checkDone();
}
}
@@ -0,0 +1,147 @@
package com.alttd.altitudequests.objects.quests;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.QuestsConfig;
import com.alttd.altitudequests.database.Database;
import com.alttd.altitudequests.objects.Quest;
import com.alttd.altitudequests.objects.variants.CollectDropsQuestObject;
import com.alttd.altitudequests.util.Logger;
import com.alttd.altitudequests.util.Utilities;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.PlayerInventory;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
public class CollectDropsQuest extends Quest {
private final CollectDropsQuestObject collectDropsQuestObject;
public CollectDropsQuest(UUID uuid) {
super(uuid, 0, 0,
QuestsConfig.COLLECT_DROPS_QUEST.get(Utilities.randomOr0(QuestsConfig.COLLECT_DROPS_QUEST.size() - 1)));
if (getVariant() instanceof CollectDropsQuestObject collectDropsQuestObject)
this.collectDropsQuestObject = collectDropsQuestObject;
else
this.collectDropsQuestObject = null;
if (collectDropsQuestObject == null) {
Logger.warning("Tried to create collectDropsQuest but unable to find variant: %.", "unknown");
return;
}
}
public CollectDropsQuest(UUID uuid, int step1, int step2, String variant) {
super(uuid, step1, step2, QuestsConfig.COLLECT_DROPS_QUEST.stream()
.filter(object -> variant.equals(object.getInternalName()))
.findAny().orElse(null));
if (getVariant() instanceof CollectDropsQuestObject collectDropsQuestObject)
this.collectDropsQuestObject = collectDropsQuestObject;
else
this.collectDropsQuestObject = null;
if (collectDropsQuestObject == null) {
Logger.warning("Tried to create collectDropsQuest but unable to find variant: %.", variant);
return;
}
checkDone();
}
@Override
public void save() {
String sql = "INSERT INTO generic_quest_progress " +
"(year_day, uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
"VALUES (?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?, year_day = ?";
try {
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
int yearDay = Utilities.getYearDay();
if (Config.DEBUG)
Logger.info("Saving user for year day %.", String.valueOf(yearDay));
statement.setInt(1, yearDay);
statement.setString(2, getUuid().toString());
statement.setString(3, this.getClass().getSimpleName());
statement.setString(4, collectDropsQuestObject.getInternalName());
statement.setInt(5, getStep1());
statement.setInt(6, getStep2());
statement.setString(7, this.getClass().getSimpleName());
statement.setString(8, collectDropsQuestObject.getInternalName());
statement.setInt(9, getStep1());
statement.setInt(10, getStep2());
statement.setInt(11, yearDay);
statement.execute();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@Override
public TagResolver getTagResolvers() {
return TagResolver.resolver(
Placeholder.unparsed("item", collectDropsQuestObject.getMaterial().name()),
Placeholder.parsed("step_1_progress", getStep1() == collectDropsQuestObject.getAmount() ?
"<green>" + getStep1() + "</green>" : "<red>" + getStep1() + "</red>"),
Placeholder.parsed("step_1_total", String.valueOf(collectDropsQuestObject.getAmount())),
Placeholder.parsed("step_2_progress", getStep2() == collectDropsQuestObject.getAmount() ?
"<green>" + getStep2() + "</green>" : "<red>" + getStep2() + "</red>"),
Placeholder.parsed("step_2_total", String.valueOf(collectDropsQuestObject.getAmount()))
);
}
@Override
public int turnIn(Player player) {
PlayerInventory inventory = player.getInventory();
int maxToTurnIn = getMaxToTurnIn();
if (maxToTurnIn == 0)
return 0;
var ref = new Object() {
int tmpAmount = maxToTurnIn;
};
Arrays.stream(inventory.getContents())
.filter(Objects::nonNull)
.filter(itemStack -> itemStack.getType().equals(collectDropsQuestObject.getMaterial()))
.forEach(itemStack -> {
if (ref.tmpAmount == 0)
return;
if (itemStack.getAmount() > ref.tmpAmount) {
itemStack.setAmount(itemStack.getAmount() - ref.tmpAmount);
ref.tmpAmount = 0;
} else {
ref.tmpAmount -= itemStack.getAmount();
itemStack.setAmount(0);
}
});
int totalTurnedIn = maxToTurnIn - ref.tmpAmount;
addStep2(totalTurnedIn);
checkDone(player);
return totalTurnedIn;
}
@Override
public Component getDisplayName() {
return MiniMessage.miniMessage().deserialize(QuestsConfig.COLLECT_DROPS_QUEST_NAME);
}
public void collectDrops(List<ItemStack> drops) {
if (isDone())
return;
int total = drops.stream()
.filter(itemStack -> itemStack.getType().equals(collectDropsQuestObject.getMaterial()))
.mapToInt(ItemStack::getAmount)
.sum();
if (total == 0)
return;
addStep1(total);
checkDone();
}
}
@@ -0,0 +1,117 @@
package com.alttd.altitudequests.objects.quests;
import com.alttd.altitudequests.config.Config;
import com.alttd.altitudequests.config.QuestsConfig;
import com.alttd.altitudequests.database.Database;
import com.alttd.altitudequests.objects.Quest;
import com.alttd.altitudequests.objects.variants.KillMobsQuestObject;
import com.alttd.altitudequests.util.Logger;
import com.alttd.altitudequests.util.Utilities;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.minimessage.MiniMessage;
import net.kyori.adventure.text.minimessage.tag.resolver.Placeholder;
import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.UUID;
public class KillMobsQuest extends Quest {
private final KillMobsQuestObject killMobsQuestObject;
public KillMobsQuest(UUID uuid) {
super(uuid, 0, 0,
QuestsConfig.KILL_MOB_QUEST.get(Utilities.randomOr0(QuestsConfig.KILL_MOB_QUEST.size() - 1)));
if (getVariant() instanceof KillMobsQuestObject killMobsQuestObject)
this.killMobsQuestObject = killMobsQuestObject;
else
this.killMobsQuestObject = null;
if (killMobsQuestObject == null) {
Logger.warning("Tried to create killMobsQuest but unable to find variant: %.", "unknown");
return;
}
}
public KillMobsQuest(UUID uuid, int step1, int step2, String variant) {
super(uuid, step1, step2, QuestsConfig.KILL_MOB_QUEST.stream()
.filter(object -> variant.equals(object.getInternalName()))
.findAny().orElse(null));
if (getVariant() instanceof KillMobsQuestObject killMobsQuestObject)
this.killMobsQuestObject = killMobsQuestObject;
else
this.killMobsQuestObject = null;
if (killMobsQuestObject == null) {
Logger.warning("Tried to create killMobsQuest but unable to find variant: %.", variant);
return;
}
checkDone();
}
@Override
public void save() {
String sql = "INSERT INTO generic_quest_progress " +
"(year_day, uuid, quest, quest_variant, step_1_progress, step_2_progress) " +
"VALUES (?, ?, ?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE " +
"quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?, year_day = ?";
try {
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
int yearDay = Utilities.getYearDay();
if (Config.DEBUG)
Logger.info("Saving user for year day %.", String.valueOf(yearDay));
statement.setInt(1, yearDay);
statement.setString(2, getUuid().toString());
statement.setString(3, this.getClass().getSimpleName());
statement.setString(4, killMobsQuestObject.getInternalName());
statement.setInt(5, getStep1());
statement.setInt(6, getStep2());
statement.setString(7, this.getClass().getSimpleName());
statement.setString(8, killMobsQuestObject.getInternalName());
statement.setInt(9, getStep1());
statement.setInt(10, getStep2());
statement.setInt(11, yearDay);
statement.execute();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
@Override
public TagResolver getTagResolvers() {
return TagResolver.resolver(
Placeholder.unparsed("mob", killMobsQuestObject.getEntityType().name()),
Placeholder.parsed("step_1_progress", getStep1() == killMobsQuestObject.getAmount() ?
"<green>" + getStep1() + "</green>" : "<red>" + getStep1() + "</red>"),
Placeholder.parsed("step_1_total", String.valueOf(killMobsQuestObject.getAmount())),
Placeholder.parsed("step_2_progress", getStep2() == killMobsQuestObject.getAmount() ?
"<green>" + getStep2() + "</green>" : "<red>" + getStep2() + "</red>"),
Placeholder.parsed("step_2_total", String.valueOf(killMobsQuestObject.getAmount()))
);
}
@Override
public int turnIn(Player player) {
int maxToTurnIn = getMaxToTurnIn();
if (maxToTurnIn == 0)
return 0;
addStep2(maxToTurnIn);
checkDone(player);
return maxToTurnIn;
}
@Override
public Component getDisplayName() {
return MiniMessage.miniMessage().deserialize(QuestsConfig.KILL_MOB_QUEST_NAME);
}
public void kill(LivingEntity entity) {
if (isDone() || !entity.getType().equals(killMobsQuestObject.getEntityType()) || !entity.hasAI())
return;
addStep1(1);
checkDone();
}
}
@@ -29,24 +29,24 @@ public class MineQuest extends Quest {
if (getVariant() instanceof MineQuestObject mineQuestObject)
this.mineQuestObject = mineQuestObject;
else
this.mineQuestObject = null;
mineQuestObject = null;
if (mineQuestObject == null) {
Logger.warning("Tried to create MineQuest but unable to find variant: %.", "unknown");
return; //TODO error
return;
}
}
public MineQuest(String variantInternalName, int mined, int turnedIn, UUID uuid) {
public MineQuest(UUID uuid, int mined, int turnedIn, String variant) {
super(uuid, mined, turnedIn, QuestsConfig.MINE_QUESTS.stream()
.filter(object -> variantInternalName.equals(object.getInternalName()))
.filter(object -> variant.equals(object.getInternalName()))
.findAny().orElse(null));
if (getVariant() instanceof MineQuestObject mineQuestObject)
this.mineQuestObject = mineQuestObject;
else
this.mineQuestObject = null;
if (mineQuestObject == null) {
Logger.warning("Tried to create MineQuest but unable to find variant: %.", variantInternalName);
return; //TODO error
Logger.warning("Tried to create MineQuest but unable to find variant: %.", variant);
return;
}
checkDone();
}
@@ -65,11 +65,11 @@ public class MineQuest extends Quest {
Logger.info("Saving user for year day %.", String.valueOf(yearDay));
statement.setInt(1, yearDay);
statement.setString(2, getUuid().toString());
statement.setString(3, MineQuest.class.getSimpleName());
statement.setString(3, this.getClass().getSimpleName());
statement.setString(4, mineQuestObject.getInternalName());
statement.setInt(5, getStep1());
statement.setInt(6, getStep2());
statement.setString(7, MineQuest.class.getSimpleName());
statement.setString(7, this.getClass().getSimpleName());
statement.setString(8, mineQuestObject.getInternalName());
statement.setInt(9, getStep1());
statement.setInt(10, getStep2());
@@ -0,0 +1,21 @@
package com.alttd.altitudequests.objects.variants;
import com.alttd.altitudequests.objects.Variant;
import org.bukkit.entity.EntityType;
import java.util.List;
public class BreedMobsQuestObject extends Variant {
private final EntityType entityType;
public BreedMobsQuestObject(String internalName, String name, EntityType entityType, int amount,
List<String> questPages, List<String> donePages) {
super(internalName, name, amount, questPages, donePages);
this.entityType = entityType;
}
public EntityType getEntityType() {
return entityType;
}
}
@@ -0,0 +1,20 @@
package com.alttd.altitudequests.objects.variants;
import com.alttd.altitudequests.objects.Variant;
import org.bukkit.Material;
import java.util.List;
public class CollectDropsQuestObject extends Variant {
private final Material material;
public CollectDropsQuestObject(String internalName, String name, Material item, int amount, List<String> questPages, List<String> donePages) {
super(internalName, name, amount, questPages, donePages);
this.material = item;
}
public Material getMaterial() {
return material;
}
}
@@ -0,0 +1,21 @@
package com.alttd.altitudequests.objects.variants;
import com.alttd.altitudequests.objects.Variant;
import org.bukkit.entity.EntityType;
import java.util.List;
public class KillMobsQuestObject extends Variant {
private final EntityType entityType;
public KillMobsQuestObject(String internalName, String name, EntityType entityType, int amount,
List<String> questPages, List<String> donePages) {
super(internalName, name, amount, questPages, donePages);
this.entityType = entityType;
}
public EntityType getEntityType() {
return entityType;
}
}