Re-populate quester data asynchronously, fixes #1629 and #1636

This commit is contained in:
PikaMug 2021-03-09 23:08:33 -05:00
parent c1b8161630
commit 69f0c07f99
6 changed files with 90 additions and 68 deletions

View File

@ -392,13 +392,20 @@ public class Quest implements Comparable<Quest> {
}
if (targetLocation != null && targetLocation.getWorld() != null) {
if (targetLocation.getWorld().getName().equals(quester.getPlayer().getWorld().getName())) {
final QuestUpdateCompassEvent event = new QuestUpdateCompassEvent(this, quester, targetLocation);
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return false;
}
quester.getPlayer().setCompassTarget(targetLocation);
final Location lockedTarget = new Location(targetLocation.getWorld(), targetLocation.getX(),
targetLocation.getY(), targetLocation.getZ());
final QuestUpdateCompassEvent event = new QuestUpdateCompassEvent(this, quester, lockedTarget);
Bukkit.getScheduler().runTask(plugin, new Runnable() {
@Override
public void run() {
plugin.getServer().getPluginManager().callEvent(event);
if (event.isCancelled()) {
return;
}
quester.getPlayer().setCompassTarget(lockedTarget);
}
});
}
}
return targetLocation != null;

View File

@ -1292,7 +1292,7 @@ public class QuestData {
private int playersKilled = 0;
private long delayStartTime = 0;
private long delayTimeLeft = -1;
private boolean delayOver = true;
//private final boolean delayOver = true;
public int getCowsMilked() {
return cowsMilked;
@ -1344,7 +1344,7 @@ public class QuestData {
quester.updateJournal();
}
public boolean isDelayOver() {
/*public boolean isDelayOver() {
return delayOver;
}
@ -1352,5 +1352,5 @@ public class QuestData {
this.delayOver = delayOver;
if (doJournalUpdate)
quester.updateJournal();
}
}*/
}

View File

@ -3718,11 +3718,34 @@ public class Quester implements Comparable<Quester> {
/**
* Load data of the Quester from storage
*
* @deprecated Use {@link #hasData()}
* @return true if successful
*/
@Deprecated
public boolean loadData() {
return plugin.getStorage().loadQuesterData(id) != null;
}
/**
* Check whether the Quester has data saved to hard storage
*
* @return true if successful
*/
public boolean hasData() {
return plugin.getStorage().loadQuesterData(id) != null;
}
/**
* Check whether the Quester has base data in memory, indicating they have participated in quests
*
* @return false if empty
*/
public boolean hasBaseData() {
if (!currentQuests.isEmpty() || !questData.isEmpty() || !completedQuests.isEmpty()) {
return true;
}
return false;
}
/**
* Initiate the stage timer
@ -3756,7 +3779,7 @@ public class Quester implements Comparable<Quester> {
getQuestData(quest).setDelayTimeLeft(getCurrentStage(quest).delay - (System.currentTimeMillis()
- getQuestData(quest).getDelayStartTime()));
}
getQuestData(quest).setDelayOver(false);
//getQuestData(quest).setDelayOver(false);
}
/**
@ -3773,29 +3796,6 @@ public class Quester implements Comparable<Quester> {
}
}
/**
* Check whether the Quester has base data, indicating they have participated in quests
*
* @return false if empty
* @deprecated Use {@link #hasBaseData()}
*/
@Deprecated
public boolean hasData() {
return hasBaseData();
}
/**
* Check whether the Quester has base data, indicating they have participated in quests
*
* @return false if empty
*/
public boolean hasBaseData() {
if (!currentQuests.isEmpty() || !questData.isEmpty() || !completedQuests.isEmpty()) {
return true;
}
return false;
}
/**
* Check whether the provided quest is valid and, if not, inform the Quester
*

View File

@ -36,6 +36,7 @@ import java.util.Map.Entry;
import java.util.Optional;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@ -640,7 +641,7 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
+ conditions.size() + " Condition(s) and " + Lang.size() + " Phrase(s)");
for (final Player p : getServer().getOnlinePlayers()) {
final Quester quester = new Quester(Quests.this, p.getUniqueId());
if (quester.loadData() == false) {
if (!quester.hasData()) {
quester.saveData();
}
// Workaround for issues with the compass on fast join
@ -1534,9 +1535,10 @@ public class Quests extends JavaPlugin implements ConversationAbandonedListener
loadActions();
loadConditions();
for (final Quester quester : questers) {
quester.loadData();
for (final Quest q : quester.currentQuests.keySet()) {
quester.checkQuest(q);
final CompletableFuture<Quester> cf = getStorage().loadQuesterData(quester.getUUID());
final Quester loaded = cf.get();
for (final Quest q : loaded.currentQuests.keySet()) {
loaded.checkQuest(q);
}
}
loadModules();

View File

@ -17,6 +17,7 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentSkipListSet;
import org.bukkit.Bukkit;
@ -838,37 +839,49 @@ public class PlayerListener implements Listener {
@EventHandler
public void onPlayerJoin(final PlayerJoinEvent evt) {
if (plugin.canUseQuests(evt.getPlayer().getUniqueId())) {
final Quester quester = new Quester(plugin, evt.getPlayer().getUniqueId());
if (!quester.loadData() && plugin.getSettings().canGenFilesOnJoin()) {
quester.saveData();
final Quester noobCheck = new Quester(plugin, evt.getPlayer().getUniqueId());
if (plugin.getSettings().canGenFilesOnJoin() && !noobCheck.hasData()) {
noobCheck.saveData();
}
for (final Quest q : quester.getCompletedQuests()) {
if (q != null) {
if (!quester.getCompletedTimes().containsKey(q) && q.getPlanner().getCooldown() > -1) {
quester.getCompletedTimes().put(q, System.currentTimeMillis());
}
}
}
for (final Quest quest : quester.getCurrentQuests().keySet()) {
quester.checkQuest(quest);
}
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).getDelay() > -1 && !quester.getQuestData(quest).isDelayOver()) {
quester.startStageTimer(quest);
}
}
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
plugin.getServer().getScheduler().runTaskAsynchronously(plugin, new Runnable() {
@Override
public void run() {
if (quester.hasJournal()) {
quester.updateJournal();
}
if (quester.canUseCompass()) {
quester.resetCompass();
final CompletableFuture<Quester> cf = plugin.getStorage().loadQuesterData(evt.getPlayer().getUniqueId());
try {
final Quester quester = cf.get();
for (final Quest q : quester.getCompletedQuests()) {
if (q != null) {
if (!quester.getCompletedTimes().containsKey(q) && q.getPlanner().getCooldown() > -1) {
quester.getCompletedTimes().put(q, System.currentTimeMillis());
}
}
}
for (final Quest quest : quester.getCurrentQuests().keySet()) {
quester.checkQuest(quest);
}
for (final Quest quest : quester.getCurrentQuests().keySet()) {
if (quester.getCurrentStage(quest).getDelay() > -1 /*&& !quester.getQuestData(quest).isDelayOver()*/) {
quester.startStageTimer(quest);
}
}
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() {
@Override
public void run() {
if (quester.hasJournal()) {
quester.updateJournal();
}
if (quester.canUseCompass()) {
quester.resetCompass();
}
}
}, 40L);
} catch (final Exception e) {
e.printStackTrace();
}
}
}, 40L);
});
}
}

View File

@ -36,7 +36,7 @@ public class StageTimer implements Runnable {
if (quester.getQuestData(quest) == null) {
return;
}
if (quester.getQuestData(quest).isDelayOver()) {
//if (quester.getQuestData(quest).isDelayOver()) {
if (quester.getCurrentStage(quest).getFinishAction() != null) {
quester.getCurrentStage(quest).getFinishAction().fire(quester, quest);
}
@ -56,10 +56,10 @@ public class StageTimer implements Runnable {
+ stageNum + " after delay");
}
}
if (quester.getQuestData(quest) != null) {
/*if (quester.getQuestData(quest) != null) {
quester.getQuestData(quest).setDelayOver(true);
}
}*/
quester.updateJournal();
}
//}
}
}