From 0ab9a750c450b5bd9cd6e8831fd738d02db15264 Mon Sep 17 00:00:00 2001 From: 4Ply Date: Sun, 12 Jan 2025 18:31:06 +0200 Subject: [PATCH] Disable advancement announcements when processing player advancements for the first time --- .../trackedout/citadel/InventoryManager.kt | 77 ++++++++++++------- 1 file changed, 49 insertions(+), 28 deletions(-) diff --git a/src/main/kotlin/org/trackedout/citadel/InventoryManager.kt b/src/main/kotlin/org/trackedout/citadel/InventoryManager.kt index a79be97..f053532 100644 --- a/src/main/kotlin/org/trackedout/citadel/InventoryManager.kt +++ b/src/main/kotlin/org/trackedout/citadel/InventoryManager.kt @@ -1,5 +1,6 @@ package org.trackedout.citadel +import org.bukkit.GameRule import org.bukkit.Material import org.bukkit.NamespacedKey import org.bukkit.advancement.Advancement @@ -228,40 +229,60 @@ class InventoryManager( limit = 10000, ) - scores.results!! - .asSequence() - .filter { it.key!!.startsWith(advancementFilter) } - .map { it.copy(key = it.key?.substring(advancementFilter.length)) } - .filter { it.key!!.isNotBlank() && it.key!!.contains("#") } - .filter { it.key!!.contains("hidden") || it.key!!.contains("visible") } - .filter { it.value!!.toInt() > 0 } - .toList() - .forEach { score -> - // e.g. competitive-advancement-do2#hidden/survival/win_50_times#given_by_commands - val split = score.key!!.split("#") - var namespace = "do2" - var key = split[0] - var criterion = split[1] - - if (split.size == 3) { - namespace = split[0] - key = split[1] - criterion = split[2] + plugin.runOnNextTick { + try { + // If this is the first time the player has logged in, we don't want to spam everyone with advancements + server.getAdvancement(NamespacedKey("do2", "visible/cards/get_deck_box"))?.let { advancement: Advancement -> + player.getAdvancementProgress(advancement).let { progress -> + if (!progress.isDone) { + plugin.logger.info("Preventing advancement spam") + player.world.setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, false) + } + } } - server.getAdvancement(NamespacedKey(namespace, key))?.let { advancement: Advancement -> - player.getAdvancementProgress(advancement).let { progress -> - if (progress.isDone || progress.awardedCriteria.contains(criterion)) { - plugin.logger.info("$playerName already has advancement ${key}#${criterion}") - } else { - plugin.runOnNextTick { - progress.awardCriteria(criterion) - plugin.logger.info("Granted advancement ${key}#${criterion} to $playerName") + scores.results!! + .asSequence() + .filter { it.key!!.startsWith(advancementFilter) } + .map { it.copy(key = it.key?.substring(advancementFilter.length)) } + .filter { it.key!!.isNotBlank() && it.key!!.contains("#") } + .filter { it.key!!.contains("hidden") || it.key!!.contains("visible") } + .filter { it.value!!.toInt() > 0 } + .toList() + .forEach { score -> + // e.g. competitive-advancement-do2#hidden/survival/win_50_times#given_by_commands + val split = score.key!!.split("#") + var namespace = "do2" + var key = split[0] + var criterion = split[1] + + if (split.size == 3) { + namespace = split[0] + key = split[1] + criterion = split[2] + } + + server.getAdvancement(NamespacedKey(namespace, key))?.let { advancement: Advancement -> + player.getAdvancementProgress(advancement).let { progress -> + if (progress.isDone || progress.awardedCriteria.contains(criterion)) { + plugin.logger.info("$playerName already has advancement ${key}#${criterion}") + } else { + progress.awardCriteria(criterion) + plugin.logger.info("Granted advancement ${key}#${criterion} to $playerName") + } } } } - } + + player.world.setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, true) + } catch (e: Exception) { + e.printStackTrace() + player.sendRedMessage( + "An error occurred when attempting to apply your data from dunga-dunga, " + + "and your advancement data could not be imported." + ) } + } } catch (e: Exception) { e.printStackTrace()