diff --git a/build.gradle b/build.gradle index 7e404930..f3d028dc 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ plugins { } group 'net.william278' -version "$ext.plugin_version-${versionMetadata()}" +version "$ext.plugin_version${versionMetadata()}" description "$ext.plugin_description" defaultTasks 'licenseFormat', 'build' @@ -145,8 +145,15 @@ logger.lifecycle("Building HuskSync ${version} by William278") @SuppressWarnings('GrMethodMayBeStatic') def versionMetadata() { + // Get if there is a tag for this commit + def tag = grgit.tag.list().find { it.commit.id == grgit.head().id } + if (tag != null) { + return '' + } + + // Otherwise, get the last commit hash and if it's a clean head if (grgit == null) { - return System.getenv("GITHUB_RUN_NUMBER") ? 'build.' + System.getenv("GITHUB_RUN_NUMBER") : 'unknown' + return '-' + System.getenv("GITHUB_RUN_NUMBER") ? 'build.' + System.getenv("GITHUB_RUN_NUMBER") : 'unknown' } - return grgit.head().abbreviatedId + (grgit.status().clean ? '' : '-indev') + return '-' + grgit.head().abbreviatedId + (grgit.status().clean ? '' : '-indev') } \ No newline at end of file diff --git a/bukkit/build.gradle b/bukkit/build.gradle index 91e2b5cf..5a6bc3dc 100644 --- a/bukkit/build.gradle +++ b/bukkit/build.gradle @@ -15,7 +15,7 @@ dependencies { compileOnly 'dev.dejvokep:boosted-yaml:1.3.1' compileOnly 'com.zaxxer:HikariCP:5.0.1' compileOnly 'redis.clients:jedis:' + jedis_version - compileOnly 'net.william278:DesertWell:1.1.1' + compileOnly 'net.william278:DesertWell:2.0.4' compileOnly 'net.william278:Annotaml:2.0.1' compileOnly 'net.william278:AdvancementAPI:97a9583413' } diff --git a/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java b/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java index 8872a011..b4852d77 100644 --- a/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java +++ b/bukkit/src/main/java/net/william278/husksync/BukkitHuskSync.java @@ -15,7 +15,7 @@ package net.william278.husksync; import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.william278.annotaml.Annotaml; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.Version; import net.william278.husksync.command.BukkitCommand; import net.william278.husksync.command.BukkitCommandType; import net.william278.husksync.command.Permission; @@ -294,7 +294,7 @@ public class BukkitHuskSync extends JavaPlugin implements HuskSync { @NotNull @Override public Version getMinecraftVersion() { - return Version.fromMinecraftVersionString(Bukkit.getBukkitVersion()); + return Version.fromString(Bukkit.getBukkitVersion()); } /** diff --git a/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java b/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java index fe577338..709ab351 100644 --- a/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java +++ b/bukkit/src/main/java/net/william278/husksync/listener/BukkitEventListener.java @@ -21,7 +21,6 @@ import net.william278.husksync.data.ItemData; import net.william278.husksync.player.BukkitPlayer; import net.william278.husksync.player.OnlineUser; import org.bukkit.Bukkit; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Projectile; import org.bukkit.event.EventHandler; diff --git a/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java b/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java index 8c96b63f..dcc9496b 100644 --- a/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java +++ b/bukkit/src/main/java/net/william278/husksync/player/BukkitPlayer.java @@ -14,14 +14,13 @@ package net.william278.husksync.player; import de.themoep.minedown.adventure.MineDown; -import de.themoep.minedown.adventure.MineDownParser; import dev.triumphteam.gui.builder.gui.StorageBuilder; import dev.triumphteam.gui.guis.Gui; import dev.triumphteam.gui.guis.StorageGui; import net.kyori.adventure.audience.Audience; import net.roxeez.advancement.display.FrameType; import net.william278.andjam.Toast; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.Version; import net.william278.husksync.BukkitHuskSync; import net.william278.husksync.config.Settings; import net.william278.husksync.data.*; @@ -50,15 +49,14 @@ import java.util.logging.Level; * Bukkit implementation of an {@link OnlineUser} */ public class BukkitPlayer extends OnlineUser { - - + + private final BukkitHuskSync plugin; private final Player player; - private final Audience audience; private BukkitPlayer(@NotNull Player player) { super(player.getUniqueId(), player.getName()); + this.plugin = BukkitHuskSync.getInstance(); this.player = player; - this.audience = BukkitHuskSync.getInstance().getAudiences().player(player); } @NotNull @@ -107,11 +105,11 @@ public class BukkitPlayer extends OnlineUser { if (statusData.health != currentHealth) { final double healthToSet = currentHealth > currentMaxHealth ? currentMaxHealth : statusData.health; final double maxHealth = currentMaxHealth; - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { try { player.setHealth(Math.min(healthToSet, maxHealth)); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set health of player " + player.getName() + " to " + healthToSet); } }); @@ -126,7 +124,7 @@ public class BukkitPlayer extends OnlineUser { } player.setHealthScaled(statusData.healthScale != 0D); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set health scale of player " + player.getName() + " to " + statusData.healthScale); } } @@ -144,11 +142,11 @@ public class BukkitPlayer extends OnlineUser { player.setExp(statusData.expProgress); } if (settings.getSynchronizationFeature(Settings.SynchronizationFeature.GAME_MODE)) { - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> + Bukkit.getScheduler().runTask(plugin, () -> player.setGameMode(GameMode.valueOf(statusData.gameMode))); } if (settings.getSynchronizationFeature(Settings.SynchronizationFeature.LOCATION)) { - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { if (statusData.isFlying) { player.setAllowFlight(true); player.setFlying(true); @@ -173,7 +171,7 @@ public class BukkitPlayer extends OnlineUser { public CompletableFuture setInventory(@NotNull ItemData itemData) { return BukkitSerializer.deserializeInventory(itemData.serializedItems).thenApplyAsync(contents -> { final CompletableFuture inventorySetFuture = new CompletableFuture<>(); - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { player.setItemOnCursor(null); player.getInventory().setContents(contents.getContents()); player.updateInventory(); @@ -197,7 +195,7 @@ public class BukkitPlayer extends OnlineUser { public CompletableFuture setEnderChest(@NotNull ItemData enderChestData) { return BukkitSerializer.deserializeItemStackArray(enderChestData.serializedItems).thenApplyAsync(contents -> { final CompletableFuture enderChestSetFuture = new CompletableFuture<>(); - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { player.getEnderChest().setContents(contents); enderChestSetFuture.complete(null); }); @@ -216,7 +214,7 @@ public class BukkitPlayer extends OnlineUser { return BukkitSerializer.deserializePotionEffectArray(potionEffectData.serializedPotionEffects) .thenApplyAsync(effects -> { final CompletableFuture potionEffectsSetFuture = new CompletableFuture<>(); - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { for (PotionEffect effect : player.getActivePotionEffects()) { player.removePotionEffect(effect.getType()); } @@ -254,7 +252,7 @@ public class BukkitPlayer extends OnlineUser { @Override public CompletableFuture setAdvancements(@NotNull List advancementData) { - return CompletableFuture.runAsync(() -> Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + return CompletableFuture.runAsync(() -> Bukkit.getScheduler().runTask(plugin, () -> { // Temporarily disable advancement announcing if needed boolean announceAdvancementUpdate = false; @@ -286,20 +284,20 @@ public class BukkitPlayer extends OnlineUser { record.completedCriteria.keySet().stream() .filter(criterion -> !playerProgress.getAwardedCriteria().contains(criterion)) .forEach(criterion -> { - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), + Bukkit.getScheduler().runTask(plugin, () -> player.getAdvancementProgress(advancement).awardCriteria(criterion)); correctExperience.set(true); }); // Revoke all criteria that the player does have but should not new ArrayList<>(playerProgress.getAwardedCriteria()).stream().filter(criterion -> !record.completedCriteria.containsKey(criterion)) - .forEach(criterion -> Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), + .forEach(criterion -> Bukkit.getScheduler().runTask(plugin, () -> player.getAdvancementProgress(advancement).revokeCriteria(criterion))); }, // Revoke the criteria as the player shouldn't have any () -> new ArrayList<>(playerProgress.getAwardedCriteria()).forEach(criterion -> - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), + Bukkit.getScheduler().runTask(plugin, () -> player.getAdvancementProgress(advancement).revokeCriteria(criterion)))); // Update the player's experience in case the advancement changed that @@ -311,7 +309,7 @@ public class BukkitPlayer extends OnlineUser { } // Re-enable announcing advancements (back on main thread again) - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { if (finalAnnounceAdvancementUpdate) { player.getWorld().setGameRule(GameRule.ANNOUNCE_ADVANCEMENTS, true); } @@ -381,7 +379,7 @@ public class BukkitPlayer extends OnlineUser { try { player.setStatistic(Statistic.valueOf(statistic), statisticsData.untypedStatistics.get(statistic)); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set generic statistic " + statistic + " for " + username); } } @@ -393,7 +391,7 @@ public class BukkitPlayer extends OnlineUser { player.setStatistic(Statistic.valueOf(statistic), Material.valueOf(blockMaterial), statisticsData.blockStatistics.get(statistic).get(blockMaterial)); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set " + blockMaterial + " statistic " + statistic + " for " + username); } } @@ -406,7 +404,7 @@ public class BukkitPlayer extends OnlineUser { player.setStatistic(Statistic.valueOf(statistic), Material.valueOf(itemMaterial), statisticsData.itemStatistics.get(statistic).get(itemMaterial)); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set " + itemMaterial + " statistic " + statistic + " for " + username); } } @@ -419,7 +417,7 @@ public class BukkitPlayer extends OnlineUser { player.setStatistic(Statistic.valueOf(statistic), EntityType.valueOf(entityType), statisticsData.entityStatistics.get(statistic).get(entityType)); } catch (IllegalArgumentException e) { - BukkitHuskSync.getInstance().getLogger().log(Level.WARNING, + plugin.getLogger().log(Level.WARNING, "Failed to set " + entityType + " statistic " + statistic + " for " + username); } } @@ -447,7 +445,7 @@ public class BukkitPlayer extends OnlineUser { .valueOf(locationData.worldEnvironment)).findFirst().ifPresent(bukkitWorld::set); } if (bukkitWorld.get() != null) { - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> { + Bukkit.getScheduler().runTask(plugin, () -> { player.teleport(new Location(bukkitWorld.get(), locationData.x, locationData.y, locationData.z, locationData.yaw, locationData.pitch), PlayerTeleportEvent.TeleportCause.PLUGIN); @@ -476,7 +474,7 @@ public class BukkitPlayer extends OnlineUser { }); return new PersistentDataContainerData(persistentDataMap); }).exceptionally(throwable -> { - BukkitHuskSync.getInstance().log(Level.WARNING, + plugin.log(Level.WARNING, "Could not read " + player.getName() + "'s persistent data map, skipping!"); throwable.printStackTrace(); return new PersistentDataContainerData(new HashMap<>()); @@ -494,19 +492,26 @@ public class BukkitPlayer extends OnlineUser { container.getTagType(keyString) .flatMap(BukkitPersistentTypeMapping::getMapping) .ifPresentOrElse(mapping -> mapping.setContainerValue(container, player, key), - () -> BukkitHuskSync.getInstance().log(Level.WARNING, + () -> plugin.log(Level.WARNING, "Could not set " + player.getName() + "'s persistent data key " + keyString + " as it has an invalid type. Skipping!")); } }); }).exceptionally(throwable -> { - BukkitHuskSync.getInstance().log(Level.WARNING, + plugin.log(Level.WARNING, "Could not write " + player.getName() + "'s persistent data map, skipping!"); throwable.printStackTrace(); return null; }); } + + @Override + @NotNull + public Audience getAudience() { + return plugin.getAudiences().player(player); + } + @Override public boolean isOffline() { try { @@ -520,7 +525,7 @@ public class BukkitPlayer extends OnlineUser { @NotNull @Override public Version getMinecraftVersion() { - return Version.fromMinecraftVersionString(Bukkit.getBukkitVersion()); + return Version.fromString(Bukkit.getBukkitVersion()); } @Override @@ -569,7 +574,7 @@ public class BukkitPlayer extends OnlineUser { }); // Display the GUI (synchronously; on the main server thread) - Bukkit.getScheduler().runTask(BukkitHuskSync.getInstance(), () -> gui.open(player)); + Bukkit.getScheduler().runTask(plugin, () -> gui.open(player)); }).exceptionally(throwable -> { // Handle exceptions updatedData.completeExceptionally(throwable); @@ -583,19 +588,12 @@ public class BukkitPlayer extends OnlineUser { return player.getHealth() <= 0; } - @Override - public void sendActionBar(@NotNull MineDown mineDown) { - audience.sendActionBar(mineDown - .disable(MineDownParser.Option.SIMPLE_FORMATTING) - .replace().toComponent()); - } - @Override public void sendToast(@NotNull MineDown title, @NotNull MineDown description, @NotNull String iconMaterial, @NotNull String backgroundType) { try { final Material material = Material.matchMaterial(iconMaterial); - Toast.builder(BukkitHuskSync.getInstance()) + Toast.builder(plugin) .setTitle(title.toComponent()) .setDescription(description.toComponent()) .setIcon(material != null ? material : Material.BARRIER) @@ -607,13 +605,6 @@ public class BukkitPlayer extends OnlineUser { } } - @Override - public void sendMessage(@NotNull MineDown mineDown) { - audience.sendMessage(mineDown - .disable(MineDownParser.Option.SIMPLE_FORMATTING) - .replace().toComponent()); - } - /** * Returns a {@link Player}'s maximum health, minus any health boost effects * @@ -635,7 +626,7 @@ public class BukkitPlayer extends OnlineUser { @Override public boolean isLocked() { - return BukkitHuskSync.getInstance().getLockedPlayers().contains(player.getUniqueId()); + return plugin.getLockedPlayers().contains(player.getUniqueId()); } @Override diff --git a/common/build.gradle b/common/build.gradle index 7bd4ee9e..16ba191d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -5,7 +5,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.10.1' implementation 'dev.dejvokep:boosted-yaml:1.3.1' implementation 'net.william278:Annotaml:2.0.1' - implementation 'net.william278:DesertWell:1.1.1' + implementation 'net.william278:DesertWell:2.0.4' implementation 'net.william278:PagineDown:1.1' implementation('com.zaxxer:HikariCP:5.0.1') { exclude module: 'slf4j-api' diff --git a/common/src/main/java/net/william278/husksync/HuskSync.java b/common/src/main/java/net/william278/husksync/HuskSync.java index 7974713c..e02b4683 100644 --- a/common/src/main/java/net/william278/husksync/HuskSync.java +++ b/common/src/main/java/net/william278/husksync/HuskSync.java @@ -13,8 +13,8 @@ package net.william278.husksync; -import net.william278.desertwell.UpdateChecker; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.UpdateChecker; +import net.william278.desertwell.util.Version; import net.william278.husksync.config.Locales; import net.william278.husksync.config.Settings; import net.william278.husksync.data.DataAdapter; @@ -166,14 +166,14 @@ public interface HuskSync { * @return a {@link CompletableFuture} returning the latest {@link Version} if the current one is out-of-date */ default CompletableFuture> getLatestVersionIfOutdated() { - final UpdateChecker updateChecker = UpdateChecker.create(getPluginVersion(), SPIGOT_RESOURCE_ID); - return updateChecker.isUpToDate().thenApply(upToDate -> { - if (upToDate) { - return Optional.empty(); - } else { - return Optional.of(updateChecker.getLatestVersion().join()); - } - }); + return UpdateChecker.builder() + .currentVersion(getPluginVersion()) + .endpoint(UpdateChecker.Endpoint.SPIGOT) + .resource(Integer.toString(SPIGOT_RESOURCE_ID)).build() + .check() + .thenApply(checked -> checked.isUpToDate() + ? Optional.empty() + : Optional.of(checked.getLatestVersion())); } /** diff --git a/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java b/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java index 3f73cbf2..04a10203 100644 --- a/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java +++ b/common/src/main/java/net/william278/husksync/command/HuskSyncCommand.java @@ -14,7 +14,9 @@ package net.william278.husksync.command; import de.themoep.minedown.adventure.MineDown; -import net.william278.desertwell.AboutMenu; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import net.william278.desertwell.about.AboutMenu; import net.william278.husksync.HuskSync; import net.william278.husksync.migrator.Migrator; import net.william278.husksync.player.OnlineUser; @@ -31,30 +33,32 @@ public class HuskSyncCommand extends CommandBase implements TabCompletable, Cons public HuskSyncCommand(@NotNull HuskSync implementor) { super("husksync", Permission.COMMAND_HUSKSYNC, implementor); - this.aboutMenu = AboutMenu.create("HuskSync") - .withDescription("A modern, cross-server player data synchronization system") - .withVersion(implementor.getPluginVersion()) - .addAttribution("Author", - AboutMenu.Credit.of("William278").withDescription("Click to visit website").withUrl("https://william278.net")) - .addAttribution("Contributors", - AboutMenu.Credit.of("HarvelsX").withDescription("Code"), - AboutMenu.Credit.of("HookWoods").withDescription("Code")) - .addAttribution("Translators", - AboutMenu.Credit.of("Namiu").withDescription("Japanese (ja-jp)"), - AboutMenu.Credit.of("anchelthe").withDescription("Spanish (es-es)"), - AboutMenu.Credit.of("Melonzio").withDescription("Spanish (es-es)"), - AboutMenu.Credit.of("Ceddix").withDescription("German (de-de)"), - AboutMenu.Credit.of("Pukejoy_1").withDescription("Bulgarian (bg-bg)"), - AboutMenu.Credit.of("mateusneresrb").withDescription("Brazilian Portuguese (pt-br)"), - AboutMenu.Credit.of("小蔡").withDescription("Traditional Chinese (zh-tw)"), - AboutMenu.Credit.of("Ghost-chu").withDescription("Simplified Chinese (zh-cn)"), - AboutMenu.Credit.of("DJelly4K").withDescription("Simplified Chinese (zh-cn)"), - AboutMenu.Credit.of("Thourgard").withDescription("Ukrainian (uk-ua)"), - AboutMenu.Credit.of("xF3d3").withDescription("Italian (it-it)")) - .addButtons( - AboutMenu.Link.of("https://william278.net/docs/husksync").withText("Documentation").withIcon("⛏"), - AboutMenu.Link.of("https://github.com/WiIIiam278/HuskSync/issues").withText("Issues").withIcon("❌").withColor("#ff9f0f"), - AboutMenu.Link.of("https://discord.gg/tVYhJfyDWG").withText("Discord").withIcon("⭐").withColor("#6773f5")); + this.aboutMenu = AboutMenu.builder() + .title(Component.text("HuskSync")) + .description(Component.text("A modern, cross-server player data synchronization system")) + .version(implementor.getPluginVersion()) + .credits("Author", + AboutMenu.Credit.of("William278").description("Click to visit website").url("https://william278.net")) + .credits("Contributors", + AboutMenu.Credit.of("HarvelsX").description("Code"), + AboutMenu.Credit.of("HookWoods").description("Code")) + .credits("Translators", + AboutMenu.Credit.of("Namiu").description("Japanese (ja-jp)"), + AboutMenu.Credit.of("anchelthe").description("Spanish (es-es)"), + AboutMenu.Credit.of("Melonzio").description("Spanish (es-es)"), + AboutMenu.Credit.of("Ceddix").description("German (de-de)"), + AboutMenu.Credit.of("Pukejoy_1").description("Bulgarian (bg-bg)"), + AboutMenu.Credit.of("mateusneresrb").description("Brazilian Portuguese (pt-br)"), + AboutMenu.Credit.of("小蔡").description("Traditional Chinese (zh-tw)"), + AboutMenu.Credit.of("Ghost-chu").description("Simplified Chinese (zh-cn)"), + AboutMenu.Credit.of("DJelly4K").description("Simplified Chinese (zh-cn)"), + AboutMenu.Credit.of("Thourgard").description("Ukrainian (uk-ua)"), + AboutMenu.Credit.of("xF3d3").description("Italian (it-it)")) + .buttons( + AboutMenu.Link.of("https://william278.net/docs/husksync").text("Documentation").icon("⛏"), + AboutMenu.Link.of("https://github.com/WiIIiam278/HuskSync/issues").text("Issues").icon("❌").color(TextColor.color(0xff9f0f)), + AboutMenu.Link.of("https://discord.gg/tVYhJfyDWG").text("Discord").icon("⭐").color(TextColor.color(0x6773f5))) + .build(); } @Override @@ -175,6 +179,6 @@ public class HuskSyncCommand extends CommandBase implements TabCompletable, Cons plugin.getLocales().getLocale("error_no_permission").ifPresent(player::sendMessage); return; } - player.sendMessage(aboutMenu.toMineDown()); + player.sendMessage(aboutMenu.toComponent()); } } diff --git a/common/src/main/java/net/william278/husksync/data/UserData.java b/common/src/main/java/net/william278/husksync/data/UserData.java index d228200c..f8978e7f 100644 --- a/common/src/main/java/net/william278/husksync/data/UserData.java +++ b/common/src/main/java/net/william278/husksync/data/UserData.java @@ -14,7 +14,7 @@ package net.william278.husksync.data; import com.google.gson.annotations.SerializedName; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.Version; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/net/william278/husksync/player/OnlineUser.java b/common/src/main/java/net/william278/husksync/player/OnlineUser.java index 1ad4cd54..435bf296 100644 --- a/common/src/main/java/net/william278/husksync/player/OnlineUser.java +++ b/common/src/main/java/net/william278/husksync/player/OnlineUser.java @@ -14,7 +14,10 @@ package net.william278.husksync.player; import de.themoep.minedown.adventure.MineDown; -import net.william278.desertwell.Version; +import de.themoep.minedown.adventure.MineDownParser; +import net.kyori.adventure.audience.Audience; +import net.kyori.adventure.text.Component; +import net.william278.desertwell.util.Version; import net.william278.husksync.HuskSync; import net.william278.husksync.config.Settings; import net.william278.husksync.data.*; @@ -192,19 +195,44 @@ public abstract class OnlineUser extends User { @NotNull public abstract Version getMinecraftVersion(); + /** + * Get the player's adventure {@link Audience} + * + * @return the player's {@link Audience} + */ + @NotNull + public abstract Audience getAudience(); + + /** + * Send a message to this player + * + * @param component the {@link Component} message to send + */ + public void sendMessage(@NotNull Component component) { + getAudience().sendMessage(component); + } + /** * Dispatch a MineDown-formatted message to this player * * @param mineDown the parsed {@link MineDown} to send */ - public abstract void sendMessage(@NotNull MineDown mineDown); + public void sendMessage(@NotNull MineDown mineDown) { + sendMessage(mineDown + .disable(MineDownParser.Option.SIMPLE_FORMATTING) + .replace().toComponent()); + } /** * Dispatch a MineDown-formatted action bar message to this player * * @param mineDown the parsed {@link MineDown} to send */ - public abstract void sendActionBar(@NotNull MineDown mineDown); + public void sendActionBar(@NotNull MineDown mineDown) { + getAudience().sendActionBar(mineDown + .disable(MineDownParser.Option.SIMPLE_FORMATTING) + .replace().toComponent()); + } /** * Dispatch a toast message to this player @@ -257,7 +285,7 @@ public abstract class OnlineUser extends User { public final CompletableFuture setData(@NotNull UserData data, @NotNull HuskSync plugin) { return CompletableFuture.supplyAsync(() -> { // Prevent synchronising user data from newer versions of Minecraft - if (Version.fromMinecraftVersionString(data.getMinecraftVersion()).compareTo(plugin.getMinecraftVersion()) > 0) { + if (Version.fromString(data.getMinecraftVersion()).compareTo(plugin.getMinecraftVersion()) > 0) { plugin.log(Level.SEVERE, "Cannot set data for " + username + " because the Minecraft version of their user data (" + data.getMinecraftVersion() + ") is newer than the server's Minecraft version (" + plugin.getMinecraftVersion() + ")."); diff --git a/common/src/test/java/net/william278/husksync/DummyHuskSync.java b/common/src/test/java/net/william278/husksync/DummyHuskSync.java index 17e6ae68..2bff0a57 100644 --- a/common/src/test/java/net/william278/husksync/DummyHuskSync.java +++ b/common/src/test/java/net/william278/husksync/DummyHuskSync.java @@ -13,7 +13,7 @@ package net.william278.husksync; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.Version; import net.william278.husksync.config.Locales; import net.william278.husksync.config.Settings; import net.william278.husksync.data.DataAdapter; diff --git a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java index 294680ac..12aa4bab 100644 --- a/common/src/test/java/net/william278/husksync/player/DummyPlayer.java +++ b/common/src/test/java/net/william278/husksync/player/DummyPlayer.java @@ -14,7 +14,7 @@ package net.william278.husksync.player; import de.themoep.minedown.adventure.MineDown; -import net.william278.desertwell.Version; +import net.william278.desertwell.util.Version; import net.william278.husksync.config.Settings; import net.william278.husksync.data.*; import org.jetbrains.annotations.NotNull; @@ -142,7 +142,7 @@ public class DummyPlayer extends OnlineUser { @NotNull @Override public Version getMinecraftVersion() { - return Version.fromMinecraftVersionString("1.19-beta123456"); + return Version.fromString("1.19-beta123456"); } @Override