Made daily quests object synchronized

This commit is contained in:
Teriuihi 2022-09-05 19:28:22 +02:00
parent 724c9b01a8
commit 49bce78498

View File

@ -30,7 +30,7 @@ import java.util.stream.Collectors;
public abstract class Quest { public abstract class Quest {
private static final HashMap<UUID, Quest> dailyQuests = new HashMap<>(); private static final HashMap<UUID, Quest> dailyQuests = new HashMap<>();
private static Quest weeklyQuest = null; // private static Quest weeklyQuest = null;
private static final List<Class<? extends Quest>> possibleQuests = new ArrayList<>(); private static final List<Class<? extends Quest>> possibleQuests = new ArrayList<>();
static { static {
@ -48,6 +48,30 @@ public abstract class Quest {
private boolean rewardReceived; private boolean rewardReceived;
private final int amount; private final int amount;
public static synchronized void putDailyQuest(UUID uuid, Quest quest) {
dailyQuests.put(uuid, quest);
}
public static synchronized Quest removeDailyQuest(UUID uuid) {
return dailyQuests.remove(uuid);
}
public static synchronized Quest getDailyQuest(UUID uuid) {
return dailyQuests.getOrDefault(uuid, null);
}
public static synchronized boolean dailyQuestContainsKey(UUID uuid) {
return dailyQuests.containsKey(uuid);
}
public static synchronized Collection<Quest> getLoadedDailyQuests() {
return dailyQuests.values();
}
public static synchronized void clearDailyQuests() {
dailyQuests.clear();
}
public Quest(UUID uuid, int step1, int step2, Variant variant, int amount, boolean rewardReceived) { public Quest(UUID uuid, int step1, int step2, Variant variant, int amount, boolean rewardReceived) {
this.uuid = uuid; this.uuid = uuid;
this.step1 = step1; this.step1 = step1;
@ -91,7 +115,7 @@ public abstract class Quest {
Class<? extends Quest> questClass = possibleQuests.get(Utilities.randomOr0(possibleQuests.size() - 1)); Class<? extends Quest> questClass = possibleQuests.get(Utilities.randomOr0(possibleQuests.size() - 1));
try { try {
Constructor<? extends Quest> constructor = questClass.getDeclaredConstructor(UUID.class); Constructor<? extends Quest> constructor = questClass.getDeclaredConstructor(UUID.class);
dailyQuests.put(player.getUniqueId(), constructor.newInstance(player.getUniqueId())); putDailyQuest(player.getUniqueId(), constructor.newInstance(player.getUniqueId()));
} catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) { } catch (InvocationTargetException | IllegalAccessException | InstantiationException | NoSuchMethodException e) {
player.sendMiniMessage("<red>Unable to create quest, contact an admin</red>", null); player.sendMiniMessage("<red>Unable to create quest, contact an admin</red>", null);
e.printStackTrace(); e.printStackTrace();
@ -99,22 +123,17 @@ public abstract class Quest {
} }
} }
public static Quest getDailyQuest(UUID uuid) { // public static void setActiveWeeklyQuest(Quest newQuest) {
if (!dailyQuests.containsKey(uuid)) { // Quest.weeklyQuest = newQuest;
return null; // }
}
return dailyQuests.get(uuid);
}
public static void setActiveWeeklyQuest(Quest newQuest) { // private static final HashSet<UUID> queriedUsers = new HashSet<>();
Quest.weeklyQuest = newQuest;
}
private static final HashSet<UUID> queriedUsers = new HashSet<>();
public static void tryLoadDailyQuest(UUID uuid) { public static void tryLoadDailyQuest(UUID uuid) {
if (queriedUsers.contains(uuid) || dailyQuests.containsKey(uuid)) // if (queriedUsers.contains(uuid))
// return;
if (dailyQuestContainsKey(uuid))
return; return;
queriedUsers.add(uuid); // queriedUsers.add(uuid);
new BukkitRunnable() { new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
@ -131,15 +150,15 @@ public abstract class Quest {
} }
public static void unloadUser(UUID uuid) { //Pls only run async public static void unloadUser(UUID uuid) { //Pls only run async
queriedUsers.remove(uuid); // queriedUsers.remove(uuid);
Quest quest = dailyQuests.remove(uuid); Quest quest = removeDailyQuest(uuid);
if (quest == null) if (quest == null)
return; return;
quest.save(); quest.save();
} }
public static void saveAll() { public static void saveAll() {
for (Quest quest : dailyQuests.values()) { for (Quest quest : getLoadedDailyQuests()) {
quest.save(); quest.save();
} }
} }
@ -167,7 +186,7 @@ public abstract class Quest {
} }
constructor = aClass.getConstructor(UUID.class, int.class, int.class, String.class, int.class, boolean.class); constructor = aClass.getConstructor(UUID.class, int.class, int.class, String.class, int.class, boolean.class);
Quest quest1 = constructor.newInstance(uuid, step_1_progress, step_2_progress, quest_variant, amount, turnedIn); Quest quest1 = constructor.newInstance(uuid, step_1_progress, step_2_progress, quest_variant, amount, turnedIn);
dailyQuests.put(uuid, quest1); putDailyQuest(uuid, quest1);
} catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) { } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
e.printStackTrace(); e.printStackTrace();
return false; return false;
@ -184,7 +203,7 @@ public abstract class Quest {
@Override @Override
public void run() { public void run() {
Bukkit.getServer().sendMessage(MiniMessage.miniMessage().deserialize(MessagesConfig.RESETTING_QUESTS)); Bukkit.getServer().sendMessage(MiniMessage.miniMessage().deserialize(MessagesConfig.RESETTING_QUESTS));
dailyQuests.clear(); clearDailyQuests();
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
createDailyQuest(player); createDailyQuest(player);
} }
@ -237,17 +256,20 @@ public abstract class Quest {
try { try {
String sql = "INSERT INTO quest_log " + String sql = "INSERT INTO quest_log " +
"(uuid, year, month, day) " + "(uuid, year, month, day) " +
"VALUES (?, ?, ?, ?)"; "VALUES (?, ?, ?, ?) " +
"ON DUPLICATE KEY UPDATE uuid = ?";
PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql); PreparedStatement statement = Database.getDatabase().getConnection().prepareStatement(sql);
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date()); calendar.setTime(new Date());
statement.setString(1, uuid.toString()); String uuidString = uuid.toString();
statement.setString(1, uuidString);
statement.setInt(2, calendar.get(Calendar.YEAR)); statement.setInt(2, calendar.get(Calendar.YEAR));
statement.setInt(3, calendar.get(Calendar.MONTH)); statement.setInt(3, calendar.get(Calendar.MONTH));
statement.setInt(4, calendar.get(Calendar.DAY_OF_MONTH)); statement.setInt(4, calendar.get(Calendar.DAY_OF_MONTH));
statement.setString(5, uuidString);
statement.executeUpdate(); statement.executeUpdate();
if (Config.DEBUG) if (Config.DEBUG)
Logger.info("% finished their quest", uuid.toString()); Logger.info("% finished their quest", uuidString);
} catch (SQLException e) { } catch (SQLException e) {
e.printStackTrace(); e.printStackTrace();
Logger.severe("Error while trying to create quest log table"); Logger.severe("Error while trying to create quest log table");