Cancel timer does not auto-fail quest, fixes #2113

This commit is contained in:
PikaMug 2023-06-01 23:41:43 -04:00
parent 8d4b39c9d7
commit 56a75acc37
6 changed files with 20 additions and 45 deletions

View File

@ -1075,6 +1075,12 @@ public class Quest implements IQuest {
if (preEvent.isCancelled()) {
return;
}
for (final Map.Entry<Integer, IQuest> entry : quester.getTimers().entrySet()) {
if (entry.getValue().getId().equals(getId())) {
plugin.getServer().getScheduler().cancelTask(entry.getKey());
quester.getTimers().remove(entry.getKey());
}
}
final Player player = quester.getPlayer();
if (!ignoreFailAction) {
final IStage stage = quester.getCurrentStage(this);

View File

@ -29,8 +29,10 @@ import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
public class Action implements IAction {
@ -419,44 +421,19 @@ public class Action implements IAction {
player.sendMessage(ChatColor.GREEN + Lang.get(player, "timerStart")
.replace("<time>", ChatColor.RED + MiscUtil.getTime(timer * 1000L) + ChatColor.GREEN)
.replace("<quest>", ChatColor.GOLD + quest.getName() + ChatColor.GREEN));
if (timer > 60) {
quester.getTimers().put(new ActionTimer(quester, quest, 60, false)
.runTaskLater(plugin, (timer - 60) * 20L).getTaskId(), quest);
final List<Integer> toNotify = Arrays.asList(60, 30, 10, 5, 4, 3, 2, 1);
for (final int seconds : toNotify) {
if (timer > seconds) {
quester.getTimers().put(new ActionTimer(quester, quest, seconds)
.runTaskLater(plugin, (timer - seconds) * 20L).getTaskId(), quest);
}
}
if (timer > 30) {
quester.getTimers().put(new ActionTimer(quester, quest, 30, false)
.runTaskLater(plugin, (timer - 30) * 20L).getTaskId(), quest);
}
if (timer > 10) {
quester.getTimers().put(new ActionTimer(quester, quest, 10, false)
.runTaskLater(plugin, (timer - 10) * 20L).getTaskId(), quest);
}
if (timer > 5) {
quester.getTimers().put(new ActionTimer(quester, quest, 5, false)
.runTaskLater(plugin, (timer - 5) * 20L).getTaskId(), quest);
}
if (timer > 4) {
quester.getTimers().put(new ActionTimer(quester, quest, 4, false)
.runTaskLater(plugin, (timer - 4) * 20L).getTaskId(), quest);
}
if (timer > 3) {
quester.getTimers().put(new ActionTimer(quester, quest, 3, false)
.runTaskLater(plugin, (timer - 3) * 20L).getTaskId(), quest);
}
if (timer > 2) {
quester.getTimers().put(new ActionTimer(quester, quest, 2, false)
.runTaskLater(plugin, (timer - 2) * 20L).getTaskId(), quest);
}
if (timer > 1) {
quester.getTimers().put(new ActionTimer(quester, quest, 1, false)
.runTaskLater(plugin, (timer - 1) * 20L).getTaskId(), quest);
}
quester.getTimers().put(new ActionTimer(quester, quest, 0, true)
quester.getTimers().put(new ActionTimer(quester, quest, 0)
.runTaskLater(plugin, timer * 20L).getTaskId(), quest);
}
if (cancelTimer) {
for (final Map.Entry<Integer, IQuest> entry : quester.getTimers().entrySet()) {
if (entry.getValue().getName().equals(quest.getName())) {
if (entry.getValue().getId().equals(quest.getId())) {
plugin.getServer().getScheduler().cancelTask(entry.getKey());
quester.getTimers().remove(entry.getKey());
}

View File

@ -935,13 +935,6 @@ public class PlayerListener implements Listener {
currentStage.getDisconnectAction().fire(quester, quest);
}
}
for (final Integer timerId : quester.getTimers().keySet()) {
plugin.getServer().getScheduler().cancelTask(timerId);
if (quester.getTimers().containsKey(timerId)) {
quester.getTimers().get(timerId).failQuest(quester);
quester.removeTimer(timerId);
}
}
if (!plugin.getSettings().canGenFilesOnJoin()) {
if (quester.hasBaseData()) {
quester.saveData();

View File

@ -24,19 +24,17 @@ public class ActionTimer extends BukkitRunnable {
private final IQuester quester;
private final IQuest quest;
private final int time;
private final boolean last;
public ActionTimer(final IQuester quester, final IQuest quest, final int time, final boolean last) {
public ActionTimer(final IQuester quester, final IQuest quest, final int time) {
this.quester = quester;
this.quest = quest;
this.time = time;
this.last = last;
}
@Override
public void run() {
quester.removeTimer(getTaskId());
if (last) {
if (time < 1) {
quest.failQuest(quester, false);
quester.updateJournal();
} else {

View File

@ -22,6 +22,7 @@ actions:
timer: 40
CancelTimer:
cancel-timer: true
fail-quest: true
RunCommand:
message: "<red>Answer to life, the universe, and everything?"
commands:

View File

@ -83,7 +83,7 @@ quests:
break-block-durability:
- 0
start-event: TimerStart
finish-event: CancelTimer
disconnect-event: CancelTimer
rewards:
items:
- name-GOLD_INGOT:amount-1