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.Variant; 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.List; import java.util.stream.Collectors; public class BreedMobsQuest extends Quest { private final BreedMobsQuestObject breedMobsQuestObject; public BreedMobsQuest(Player player) throws Exception { super(player, 0, 0, QuestsConfig.BREED_MOB_QUEST.get(Utilities.randomOr0(QuestsConfig.BREED_MOB_QUEST.size() - 1)), -1, false); if (getVariant() instanceof BreedMobsQuestObject questObject) this.breedMobsQuestObject = questObject; else this.breedMobsQuestObject = null; if (this.breedMobsQuestObject == null) { Logger.warning("Tried to create breedMobQuest but unable to find variant: %s.", "unknown"); } } public BreedMobsQuest(Player player, int step1, int step2, String variant, int amount, boolean rewardReceived) throws Exception { super(player, step1, step2, QuestsConfig.BREED_MOB_QUEST.stream() .filter(object -> variant.equals(object.getInternalName())) .findAny().orElse(null), amount, rewardReceived); if (getVariant() instanceof BreedMobsQuestObject questObject) this.breedMobsQuestObject = questObject; else this.breedMobsQuestObject = null; if (breedMobsQuestObject == null) { Logger.warning("Tried to create breedMobQuest but unable to find variant: %.", variant); Logger.warning("Possible variants: %", QuestsConfig.BREED_MOB_QUEST.stream().map(Variant::getInternalName).collect(Collectors.joining(", "))); 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, amount, reward_received) " + "VALUES (?, ?, ?, ?, ?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE " + "quest = ?, quest_variant = ?, step_1_progress = ?, step_2_progress = ?, year_day = ?, amount = ?, reward_received = ?"; try (PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql)) { saveQuest(statement, getVariant()); } catch (SQLException exception) { Logger.throwing(BreedMobsQuest.class.getName(), "save", exception); } } @Override public TagResolver getTagResolvers() { TagResolver resolver = TagResolver.resolver( Placeholder.unparsed("mob", Utilities.formatName(breedMobsQuestObject.getEntityType().name())), Placeholder.parsed("step_1_progress", getStep1() == getAmount() ? "" + getStep1() + "" : "" + getStep1() + ""), Placeholder.parsed("step_1_total", String.valueOf(getAmount())), Placeholder.parsed("step_2_progress", getStep2() == getAmount() ? "" + getStep2() + "" : "" + getStep2() + ""), Placeholder.parsed("step_2_total", String.valueOf(getAmount())), Placeholder.unparsed("step_1", QuestsConfig.BREED_STEP_1), Placeholder.unparsed("step_2", QuestsConfig.BREED_STEP_2) ); Component turnInText = MiniMessage.miniMessage().deserialize(QuestsConfig.BREED_TURN_IN, resolver); return TagResolver.resolver( resolver, Placeholder.component("turn_in_text", turnInText) ); } @Override public void turnIn(Player player) { int maxToTurnIn = getMaxToTurnIn(); if (maxToTurnIn == 0) return; addStep2(maxToTurnIn); checkDone(player); } @Override public Component getDisplayName() { return MiniMessage.miniMessage().deserialize(QuestsConfig.BREED_MOB_QUEST_NAME); } @Override public List getRewardCommand() { return QuestsConfig.BREED_MOB_COMMANDS; } public void breed(LivingEntity entity) { if (isDone() || !entity.getType().equals(breedMobsQuestObject.getEntityType()) || getAmount() == getStep1()) return; addStep1(1); checkDone(); } public static List getSubTypes() { return QuestsConfig.BREED_MOB_QUEST.stream().map(Variant::getInternalName).collect(Collectors.toList()); } }