From 59fc0a20e0f103b9000585489c3b640fac9e7687 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 05:04:32 +0000 Subject: [PATCH 1/4] Initial plan From cc1b5e1a94cd13d8640b934d12efb31705eaaea8 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 05:08:50 +0000 Subject: [PATCH 2/4] Revert CheckPhase.java to use user.sendMessage() directly instead of custom translate() with LegacyComponentSerializer Agent-Logs-Url: https://github.com/BentoBoxWorld/AOneBlock/sessions/3ae91a34-99b8-44ae-bdce-bc776883a2f9 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../aoneblock/listeners/CheckPhase.java | 45 ++++++------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java index 56e65ff..491ed4d 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java @@ -9,10 +9,6 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; -import net.kyori.adventure.title.Title; - import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; import world.bentobox.aoneblock.oneblocks.OneBlockPhase; @@ -48,20 +44,6 @@ public CheckPhase(AOneBlock addon, BlockListener blockListener) { } - /** - * Converts a BentoBox translation key into an Adventure {@link Component}. - * BentoBox's {@code getTranslation()} returns strings with § color codes already - * applied, so {@link LegacyComponentSerializer#legacySection()} is used here. - * - * @param user - the user whose locale is used - * @param key - BentoBox translation key - * @param vars - alternating placeholder key/value pairs - * @return the translated, colored Component - */ - private Component translate(User user, String key, String... vars) { - return LegacyComponentSerializer.legacySection().deserialize(user.getTranslation(key, vars)); - } - /** * Runs end phase commands, sets new phase and runs new phase commands * @@ -100,9 +82,7 @@ void setNewPhase(@Nullable Player player, @NonNull Island i, @NonNull OneBlockIs // Set the phase name is.setPhaseName(newPhaseName); if (user.isPlayer() && user.isOnline() && addon.inWorld(user.getWorld())) { - // Phase names are raw YAML strings — use legacyAmpersand to parse & color codes. - Component titleComponent = LegacyComponentSerializer.legacyAmpersand().deserialize(newPhaseName); - user.getPlayer().showTitle(Title.title(titleComponent, Component.empty())); + user.getPlayer().sendTitle(newPhaseName, null, -1, -1, -1); } // Run phase start commands Util.runCommands(user, @@ -147,10 +127,11 @@ private boolean checkRequirement(Requirement r, User user, Island i, OneBlockIsl } private boolean checkLevelRequirement(Requirement r, User user, Island i, World world) { + // Level checking logic return addon.getAddonByName("Level").map(l -> { if (((Level) l).getIslandLevel(world, i.getOwner()) < r.getLevel()) { - user.getPlayer().sendMessage(translate(user, "aoneblock.phase.insufficient-level", - TextVariables.NUMBER, String.valueOf(r.getLevel()))); + user.sendMessage("aoneblock.phase.insufficient-level", TextVariables.NUMBER, + String.valueOf(r.getLevel())); return true; } return false; @@ -158,10 +139,11 @@ private boolean checkLevelRequirement(Requirement r, User user, Island i, World } private boolean checkBankRequirement(Requirement r, User user, Island i) { + // Bank checking logic return addon.getAddonByName("Bank").map(l -> { if (((Bank) l).getBankManager().getBalance(i).getValue() < r.getBank()) { - user.getPlayer().sendMessage(translate(user, "aoneblock.phase.insufficient-bank-balance", - TextVariables.NUMBER, String.valueOf(r.getBank()))); + user.sendMessage("aoneblock.phase.insufficient-bank-balance", TextVariables.NUMBER, + String.valueOf(r.getBank())); return true; } return false; @@ -169,10 +151,11 @@ private boolean checkBankRequirement(Requirement r, User user, Island i) { } private boolean checkEcoRequirement(Requirement r, User user, World world) { + // Eco checking logic return addon.getPlugin().getVault().map(vaultHook -> { if (vaultHook.getBalance(user, world) < r.getEco()) { - user.getPlayer().sendMessage(translate(user, "aoneblock.phase.insufficient-funds", - TextVariables.NUMBER, vaultHook.format(r.getEco()))); + user.sendMessage("aoneblock.phase.insufficient-funds", TextVariables.NUMBER, + vaultHook.format(r.getEco())); return true; } return false; @@ -180,19 +163,19 @@ private boolean checkEcoRequirement(Requirement r, User user, World world) { } private boolean checkPermissionRequirement(Requirement r, User user) { + // Permission checking logic if (user != null && !user.hasPermission(r.getPermission())) { - user.getPlayer().sendMessage(translate(user, "aoneblock.phase.insufficient-permission", - TextVariables.NAME, r.getPermission())); + user.sendMessage("aoneblock.phase.insufficient-permission", TextVariables.NAME, r.getPermission()); return true; } return false; } private boolean checkCooldownRequirement(Requirement r, User player, OneBlockIslands is) { + // Cooldown checking logic long remainingTime = r.getCooldown() - (System.currentTimeMillis() - is.getLastPhaseChangeTime()) / 1000; if (remainingTime > 0) { - player.getPlayer().sendMessage(translate(player, "aoneblock.phase.cooldown", - TextVariables.NUMBER, String.valueOf(remainingTime))); + player.sendMessage("aoneblock.phase.cooldown", TextVariables.NUMBER, String.valueOf(remainingTime)); return true; } return false; From 5123896999534995793d48b66234125bac360d17 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 14:54:38 +0000 Subject: [PATCH 3/4] Fix broken tests: restore showTitle() Adventure API in CheckPhase (no LegacyComponentSerializer) Agent-Logs-Url: https://github.com/BentoBoxWorld/AOneBlock/sessions/e8854ea2-7b56-497a-ac76-533846ce7957 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../java/world/bentobox/aoneblock/listeners/CheckPhase.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java index 491ed4d..2ffbe45 100644 --- a/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java +++ b/src/main/java/world/bentobox/aoneblock/listeners/CheckPhase.java @@ -9,6 +9,9 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.title.Title; + import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; import world.bentobox.aoneblock.oneblocks.OneBlockPhase; @@ -82,7 +85,7 @@ void setNewPhase(@Nullable Player player, @NonNull Island i, @NonNull OneBlockIs // Set the phase name is.setPhaseName(newPhaseName); if (user.isPlayer() && user.isOnline() && addon.inWorld(user.getWorld())) { - user.getPlayer().sendTitle(newPhaseName, null, -1, -1, -1); + user.getPlayer().showTitle(Title.title(Component.text(newPhaseName), Component.empty())); } // Run phase start commands Util.runCommands(user, From 06a5bee1bf11ffd4e1d67907effb75d93365648c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 6 Apr 2026 19:23:10 +0000 Subject: [PATCH 4/4] Fix InfoListenerTest: verify via lm.get() instead of deprecated spigot.sendMessage() Agent-Logs-Url: https://github.com/BentoBoxWorld/AOneBlock/sessions/b792d2e9-3944-46fa-9f8e-2339f94967e8 Co-authored-by: tastybento <4407265+tastybento@users.noreply.github.com> --- .../aoneblock/listeners/InfoListenerTest.java | 43 +++---------------- 1 file changed, 5 insertions(+), 38 deletions(-) diff --git a/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java b/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java index 7a6dde6..dc78679 100644 --- a/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java +++ b/src/test/java/world/bentobox/aoneblock/listeners/InfoListenerTest.java @@ -1,25 +1,22 @@ package world.bentobox.aoneblock.listeners; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.mockito.Mockito.atLeast; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.util.List; import java.util.UUID; import org.bukkit.entity.Player; -import org.bukkit.entity.Player.Spigot; import org.eclipse.jdt.annotation.NonNull; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; -import net.md_5.bungee.api.chat.TextComponent; import world.bentobox.aoneblock.AOneBlock; import world.bentobox.aoneblock.CommonTestSetup; import world.bentobox.aoneblock.dataobjects.OneBlockIslands; @@ -41,8 +38,6 @@ public class InfoListenerTest extends CommonTestSetup { private InfoListener il; @Mock private @NonNull OneBlockIslands is; - @Mock - private Spigot spigot; private static final UUID ID = UUID.randomUUID(); @@ -110,17 +105,9 @@ void testInfoListener() { void testOnInfo() { IslandInfoEvent e = new IslandInfoEvent(island, ID, false, location, addon); il.onInfo(e); - checkSpigotMessage("aoneblock.commands.info.count"); + verify(lm).get(any(User.class), eq("aoneblock.commands.info.count")); } - /** - * Check that spigot sent the message - * @param message - message to check - */ - public void checkSpigotMessage(String expectedMessage) { - checkSpigotMessage(expectedMessage, 1); - } - /** * Test method for {@link world.bentobox.aoneblock.listeners.InfoListener#onInfo(world.bentobox.bentobox.api.events.island.IslandInfoEvent)}. */ @@ -128,27 +115,7 @@ public void checkSpigotMessage(String expectedMessage) { void testOnInfoOtherAddon() { IslandInfoEvent e = new IslandInfoEvent(island, ID, false, location, mock(Addon.class)); il.onInfo(e); - checkSpigotMessage("aoneblock.commands.info.count", 0); - } - - public void checkSpigotMessage(String expectedMessage, int expectedOccurrences) { - // Capture the argument passed to spigot().sendMessage(...) if messages are sent - ArgumentCaptor captor = ArgumentCaptor.forClass(TextComponent.class); - - // Verify that sendMessage() was called at least 0 times (capture any sent messages) - verify(spigot, atLeast(0)).sendMessage(captor.capture()); - - // Get all captured TextComponents - List capturedMessages = captor.getAllValues(); - - // Count the number of occurrences of the expectedMessage in the captured messages - long actualOccurrences = capturedMessages.stream().map(component -> component.toLegacyText()) // Convert each TextComponent to plain text - .filter(messageText -> messageText.contains(expectedMessage)) // Check if the message contains the expected text - .count(); // Count how many times the expected message appears - - // Assert that the number of occurrences matches the expectedOccurrences - assertEquals(expectedOccurrences, - actualOccurrences, "Expected message occurrence mismatch: " + expectedMessage); + verify(lm, never()).get(any(User.class), eq("aoneblock.commands.info.count")); } }