Skip to content

Commit

Permalink
Rewrite trackQuestForPlayer method, so it notifies player about the s…
Browse files Browse the repository at this point in the history
…ame quest only once
  • Loading branch information
Krakenied committed Jul 7, 2024
1 parent ebfb6f1 commit e7eb111
Showing 1 changed file with 41 additions and 22 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.TimeUnit;

Expand Down Expand Up @@ -369,32 +370,50 @@ public boolean expireQuestForPlayer(QPlayer qPlayer, Quest quest) {
}

@Override
public void trackQuestForPlayer(QPlayer qPlayer, Quest quest) {
Player player = Bukkit.getPlayer(qPlayer.getPlayerUUID());
public void trackQuestForPlayer(final @NotNull QPlayer qPlayer, final @Nullable Quest quest) {
final String trackedQuestId = qPlayer.getPlayerPreferences().getTrackedQuestId();
final String questId = quest != null ? quest.getId() : null;

if (!Objects.equals(questId, trackedQuestId)) {
qPlayer.getPlayerPreferences().setTrackedQuestId(questId); // always update it
} else {
return; // no need to send messages or call events again
}

final Player player = this.plugin.getServer().getPlayer(qPlayer.getPlayerUUID());
if (player == null) {
return; // we can't even send a message or call an event without the player
}

if (quest == null) {
String currentTrackedQuestId = qPlayer.getPlayerPreferences().getTrackedQuestId();
qPlayer.getPlayerPreferences().setTrackedQuestId(null);
if (player != null) {
Bukkit.getPluginManager().callEvent(new PlayerStopTrackQuestEvent(player, qPlayer));
Quest currentTrackedQuest;
if (currentTrackedQuestId != null && (currentTrackedQuest = plugin.getQuestManager().getQuestById(currentTrackedQuestId)) != null) {
QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(currentTrackedQuest);
String displayName = qItemStack.getName();
String displayNameStripped = Chat.legacyStrip(displayName);
Messages.QUEST_TRACK.send(player, "{quest}", displayNameStripped, "{questcolored}", displayName);
}
}
} else if (qPlayer.hasStartedQuest(quest)) {
QItemStack qItemStack = plugin.getQItemStackRegistry().getQuestItemStack(quest);
String displayName = qItemStack.getName();
String displayNameStripped = Chat.legacyStrip(displayName);
qPlayer.getPlayerPreferences().setTrackedQuestId(quest.getId());
if (player != null) {
Bukkit.getPluginManager().callEvent(new PlayerStartTrackQuestEvent(player, qPlayer));
Messages.QUEST_TRACK.send(player, "{quest}", displayNameStripped, "{questcolored}", displayName);
this.plugin.getServer().getPluginManager().callEvent(new PlayerStopTrackQuestEvent(player, qPlayer));

// we can assume that trackedQuestId != null because of the Objects#equals check above
final Quest trackedQuest = this.plugin.getQuestManager().getQuestById(trackedQuestId);

// it can be still null if the quest was removed
if (trackedQuest != null) {
final QItemStack item = this.plugin.getQItemStackRegistry().getQuestItemStack(trackedQuest);
final String displayName = item.getName();
final String displayNameStripped = Chat.legacyStrip(displayName);
Messages.QUEST_TRACK.send(player, "{questcolored}", displayName, "{quest}", displayNameStripped);
}

// return and handle quest != null case
return;
}

// we don't want to notify player about start of a quest which hasn't been started
if (!qPlayer.hasStartedQuest(quest)) {
return;
}

this.plugin.getServer().getPluginManager().callEvent(new PlayerStartTrackQuestEvent(player, qPlayer));

final QItemStack item = this.plugin.getQItemStackRegistry().getQuestItemStack(quest);
final String displayName = item.getName();
final String displayNameStripped = Chat.legacyStrip(displayName);
Messages.QUEST_TRACK.send(player, "{questcolored}", displayName, "{quest}", displayNameStripped);
}

private Set<Quest> getStartedQuestsForPlayer(QPlayer qPlayer) {
Expand Down

0 comments on commit e7eb111

Please sign in to comment.