From 02a27f3df75e92fd3dac04efc8207156c47fe5e8 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 1 Jan 2021 15:35:38 -0800 Subject: [PATCH 01/22] Version 1.15.6 --- pom.xml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 30aa0d5..69d7cdf 100644 --- a/pom.xml +++ b/pom.xml @@ -256,15 +256,19 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.1.1 - public + 8 + private false -Xdoclint:none + + attach-javadocs + install jar From 86612b72e36f32412480c8b51290e471f91ebc9e Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 1 Jan 2021 15:36:14 -0800 Subject: [PATCH 02/22] Move warp panel creation async and reworked test class. --- .../bentobox/warps/SignCacheManager.java | 6 +- .../bentobox/warps/WarpPanelManager.java | 72 +++-- .../bentobox/warps/WarpPanelManagerTest.java | 260 ++++++++++++------ 3 files changed, 228 insertions(+), 110 deletions(-) diff --git a/src/main/java/world/bentobox/warps/SignCacheManager.java b/src/main/java/world/bentobox/warps/SignCacheManager.java index 8e971d2..4a75271 100644 --- a/src/main/java/world/bentobox/warps/SignCacheManager.java +++ b/src/main/java/world/bentobox/warps/SignCacheManager.java @@ -70,11 +70,13 @@ public class SignCacheManager { * Removes sign text from the cache * @param world - world * @param key - uuid of owner + * @return true if item is removed from cache */ - void removeWarp(World world, UUID key) { + boolean removeWarp(World world, UUID key) { if (cachedSigns.containsKey(world)) { - cachedSigns.get(world).remove(key); + return cachedSigns.get(world).remove(key) != null; } + return false; } } diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 95984c7..92bf279 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Random; import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.inventory.ItemStack; @@ -63,33 +64,65 @@ public class WarpPanelManager { * @param index - page to show - 0 is first */ public void showWarpPanel(World world, User user, int index) { + + PanelBuilder panelBuilder = new PanelBuilder() + .user(user) + .name(user.getTranslation("warps.title") + " " + (index + 1)); + + Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> { + buildPanel(panelBuilder, user, index, world); + Bukkit.getScheduler().runTask(addon.getPlugin(), () -> panelBuilder.build()); + }); + + } + + void buildPanel(PanelBuilder panelBuilder, User user, int index, World world) { List warps = new ArrayList<>(addon.getWarpSignsManager().getSortedWarps(world)); - UUID randomWarp = null; - // Add random UUID - if (!warps.isEmpty() && addon.getSettings().isRandomAllowed()) { - randomWarp = warps.get(new Random().nextInt(warps.size())); - warps.add(0, randomWarp); - } + // Build the main body + int i = buildMainBody(panelBuilder, user, index, world, warps, getRandomWarp(warps)); + // Add navigation + addNavigation(panelBuilder, user, world, i, index, warps.size()); + + } + + int buildMainBody(PanelBuilder panelBuilder, User user, int index, World world, List warps, boolean randomWarp) { if (index < 0) { index = 0; } else if (index > (warps.size() / PANEL_MAX_SIZE)) { index = warps.size() / PANEL_MAX_SIZE; } - PanelBuilder panelBuilder = new PanelBuilder() - .user(user) - .name(user.getTranslation("warps.title") + " " + (index + 1)); int i = index * PANEL_MAX_SIZE; for (; i < (index * PANEL_MAX_SIZE + PANEL_MAX_SIZE) && i < warps.size(); i++) { - if (i == 0 && randomWarp != null) { - panelBuilder.item(getRandomButton(world, user, randomWarp)); + if (randomWarp && i == 0) { + panelBuilder.item(getRandomButton(world, user, warps.get(i))); } else { panelBuilder.item(getPanelItem(world, warps.get(i))); } } - final int panelNum = index; - // Add signs - if (i < warps.size()) { + return i; + } + + private boolean getRandomWarp(List warps) { + // Add random warp + if (!warps.isEmpty() && addon.getSettings().isRandomAllowed()) { + warps.add(0, warps.get(new Random().nextInt(warps.size()))); + return true; + } + return false; + } + + /** + * Add Next and Previous icons to navigate + * @param panelBuilder - the panel builder + * @param user - user + * @param world - world + * @param numOfItems - number of items shown so far including in previous panels + * @param panelNum - panel number (page) + * @param totalNum - total number of items in the list + */ + void addNavigation(PanelBuilder panelBuilder, User user, World world, int numOfItems, int panelNum, int totalNum) { + if (numOfItems < totalNum) { // Next panelBuilder.item(new PanelItemBuilder() .name(user.getTranslation("warps.next")) @@ -100,7 +133,7 @@ public class WarpPanelManager { return true; }).build()); } - if (i > PANEL_MAX_SIZE) { + if (numOfItems > PANEL_MAX_SIZE) { // Previous panelBuilder.item(new PanelItemBuilder() .name(user.getTranslation("warps.previous")) @@ -111,20 +144,21 @@ public class WarpPanelManager { return true; }).build()); } - panelBuilder.build(); + } /** * Removes sign text from the cache * @param world - world * @param key - uuid of owner + * @return true if the item was removed from the cache */ - public void removeWarp(World world, UUID key) { - signCacheManager.removeWarp(world, key); + public boolean removeWarp(World world, UUID key) { + return signCacheManager.removeWarp(world, key); } public void saveCache() { - signCacheManager.saveCache(); + signCacheManager.saveCache(); } } diff --git a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java index 0521627..30d74ff 100644 --- a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java @@ -4,7 +4,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -21,13 +24,12 @@ import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemFactory; -import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitScheduler; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; @@ -37,6 +39,7 @@ import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.modules.junit4.PowerMockRunner; import world.bentobox.bentobox.BentoBox; +import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.AbstractDatabaseHandler; import world.bentobox.bentobox.database.DatabaseSetup; @@ -68,7 +71,13 @@ public class WarpPanelManagerTest { private Settings settings; @Mock private static AbstractDatabaseHandler handler; - + @Mock + private BukkitScheduler scheduler; + private List list; + + // Class under test + private WarpPanelManager wpm; + @SuppressWarnings("unchecked") @BeforeClass public static void beforeClass() { @@ -88,7 +97,7 @@ public class WarpPanelManagerTest { public void setUp() throws Exception { when(addon.getWarpSignsManager()).thenReturn(wsm); // Fill with 200 fake warps (I'm banking on them all being different, but there could be a clash) - List list = new ArrayList<>(); + list = new ArrayList<>(); for (int i = 0; i< 200; i++) { list.add(UUID.randomUUID()); } @@ -100,7 +109,7 @@ public class WarpPanelManagerTest { // User and player when(user.getPlayer()).thenReturn(player); - when(user.getTranslation(Mockito.any())).thenAnswer(new Answer() { + when(user.getTranslation(any())).thenAnswer(new Answer() { @Override public String answer(InvocationOnMock invocation) throws Throwable { @@ -116,16 +125,17 @@ public class WarpPanelManagerTest { when(addon.getPlugin()).thenReturn(plugin); // Bukkit - PowerMockito.mockStatic(Bukkit.class); + PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); ItemFactory itemF = mock(ItemFactory.class); ItemMeta imeta = mock(ItemMeta.class); when(itemF.getItemMeta(any())).thenReturn(imeta); when(Bukkit.getItemFactory()).thenReturn(itemF); + when(Bukkit.getScheduler()).thenReturn(scheduler); // Inventory when(top.getSize()).thenReturn(9); - when(Bukkit.createInventory(any(), Mockito.anyInt(), any())).thenReturn(top); + when(Bukkit.createInventory(any(), anyInt(), any())).thenReturn(top); when(settings.getIcon()).thenReturn("SIGN"); when(addon.getSettings()).thenReturn(settings); @@ -148,79 +158,9 @@ public class WarpPanelManagerTest { when(sc.getSignText()).thenReturn(Collections.singletonList("[welcome]")); when(sc.getType()).thenReturn(sign_type); when(wsm.getSignInfo(any(), any())).thenReturn(sc); - } - /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. - */ - @Test - public void testShowWarpPanelFirst() { - ArgumentCaptor argument = ArgumentCaptor.forClass(ItemStack.class); - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 0); - verify(player).openInventory(Mockito.eq(top)); - // Just next sign - verify(top, Mockito.times(53)).setItem(Mockito.anyInt(),argument.capture()); - assertEquals(Material.STONE, argument.getAllValues().get(52).getType()); - } - - /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. - */ - @Test - public void testShowWarpPanelFirstRandom() { - when(settings.isRandomAllowed()).thenReturn(true); - ArgumentCaptor argument = ArgumentCaptor.forClass(ItemStack.class); - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 0); - verify(player).openInventory(Mockito.eq(top)); - // Check crystal - verify(top, Mockito.atLeastOnce()).setItem(anyInt(), argument.capture()); - assertEquals(Material.END_CRYSTAL, argument.getAllValues().get(0).getType()); - } - - /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. - */ - @Test - public void testShowWarpPanelNoRandom() { - when(settings.isRandomAllowed()).thenReturn(false); - ArgumentCaptor argument = ArgumentCaptor.forClass(ItemStack.class); - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 0); - verify(player).openInventory(Mockito.eq(top)); - // Check crystal - verify(top, Mockito.atLeastOnce()).setItem(anyInt(), argument.capture()); - assertFalse(argument.getAllValues().get(0).getType().equals(Material.END_CRYSTAL)); - } - - /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. - */ - @Test - public void testShowWarpPanelMiddle() { - ArgumentCaptor argument = ArgumentCaptor.forClass(ItemStack.class); - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 1); - verify(player).openInventory(Mockito.eq(top)); - // includes previous and next signs - verify(top, Mockito.times(54)).setItem(Mockito.anyInt(), argument.capture()); - assertEquals(Material.STONE, argument.getAllValues().get(52).getType()); - assertEquals(Material.COBBLESTONE, argument.getAllValues().get(53).getType()); - } - - /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. - */ - @Test - public void testShowWarpPanelLast() { - ArgumentCaptor argument = ArgumentCaptor.forClass(ItemStack.class); - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 3); - verify(player).openInventory(Mockito.eq(top)); - // Final amount, just previous sign - verify(top, Mockito.times(46)).setItem(Mockito.anyInt(), argument.capture()); - assertEquals(Material.COBBLESTONE, argument.getAllValues().get(45).getType()); + // Class under test + wpm = new WarpPanelManager(addon); } /** @@ -228,13 +168,14 @@ public class WarpPanelManagerTest { */ @Test public void testShowWarpPanelTestCache() { - WarpPanelManager wpm = new WarpPanelManager(addon); + PanelBuilder pb = mock(PanelBuilder.class); // Do 45 initial lookups of sign text - wpm.showWarpPanel(world, user, 3); + wpm.buildPanel(pb, user, 3, world); + // Get the panel again - wpm.showWarpPanel(world, user, 3); + wpm.buildPanel(pb, user, 3, world); // Should only check this 45 times because the sign text is cached - verify(wsm, Mockito.times(45)).getSignInfo(any(), any()); + verify(wsm, times(45)).getSignInfo(any(), any()); } @@ -243,14 +184,155 @@ public class WarpPanelManagerTest { */ @Test public void testRemoveWarp() { - WarpPanelManager wpm = new WarpPanelManager(addon); - wpm.showWarpPanel(world, user, 3); - wpm.showWarpPanel(world, user, 3); - wpm.removeWarp(world, uuid); - wpm.showWarpPanel(world, user, 3); + assertFalse(wpm.removeWarp(world, UUID.randomUUID())); + } + + /** + * Test method for {@link WarpPanelManager#buildPanel(PanelBuilder, User, int, World)} + */ + @Test + public void testBuildPanel() { + PanelBuilder pb = mock(PanelBuilder.class); + wpm.buildPanel(pb, user, 3, world); // Removing the UUID should force a refresh and therefore 46 lookups - verify(wsm, Mockito.times(46)).getSignInfo(any(), any()); + verify(wsm, times(45)).getSignInfo(any(), any()); } + /** + * Test method for {@link WarpPanelManager#addNavigation(PanelBuilder, User, World, int, int, int)} + */ + @Test + public void testAddNavigationNoNav() { + PanelBuilder pb = mock(PanelBuilder.class); + wpm.addNavigation(pb, user, world, 0, 0, 0); + verify(pb, never()).item(any()); + } + + /** + * Test method for {@link WarpPanelManager#addNavigation(PanelBuilder, User, World, int, int, int)} + */ + @Test + public void testAddNavigationNoNavNext() { + PanelBuilder pb = mock(PanelBuilder.class); + wpm.addNavigation(pb, user, world, 0, 0, 100); + verify(pb).item(any()); + verify(user).getTranslation(eq("warps.next")); + } + + /** + * Test method for {@link WarpPanelManager#addNavigation(PanelBuilder, User, World, int, int, int)} + */ + @Test + public void testAddNavigationNoNavPrev() { + PanelBuilder pb = mock(PanelBuilder.class); + wpm.addNavigation(pb, user, world, 60, 2, 20); + verify(pb).item(any()); + verify(user).getTranslation(eq("warps.previous")); + } + + /** + * Test method for {@link WarpPanelManager#addNavigation(PanelBuilder, User, World, int, int, int)} + */ + @Test + public void testAddNavigationNoNavNextAndPrev() { + PanelBuilder pb = mock(PanelBuilder.class); + wpm.addNavigation(pb, user, world, 60, 2, 100); + verify(pb, times(2)).item(any()); + verify(user).getTranslation(eq("warps.previous")); + verify(user).getTranslation(eq("warps.next")); + } + + + private int mainBod(int page, int j, boolean random) { + PanelBuilder pb = mock(PanelBuilder.class); + int r = wpm.buildMainBody(pb, user, page, world, list, random); + verify(pb, times(j)).item(any()); + if (random && page <= 0) { + verify(user).getTranslation(eq("warps.random")); + } else { + verify(user, never()).getTranslation(eq("warps.random")); + } + return r; + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyNoRandomPage0() { + assertEquals(52, mainBod(0, 52, false)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyNoRandomPage1() { + assertEquals(104, mainBod(1, 52, false)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyNoRandomPage2() { + assertEquals(156, mainBod(2, 52, false)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyNoRandomPage3() { + assertEquals(201, mainBod(3, 45, false)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyNoRandomPageMinus1() { + assertEquals(52, mainBod(-1, 52, false)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyRandomPage0() { + assertEquals(52, mainBod(0, 52, true)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyRandomPage1() { + assertEquals(104, mainBod(1, 52, true)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyRandomPage2() { + assertEquals(156, mainBod(2, 52, true)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyRandomPage3() { + assertEquals(201, mainBod(3, 45, true)); + } + + /** + * Test method for {@link WarpPanelManager#buildMainBody(PanelBuilder, User, int, World, List, boolean)} + */ + @Test + public void testBuildMainBodyRandomPageMinus1() { + assertEquals(52, mainBod(-1, 52, true)); + } } From 4817c2c9131ca8cc8daaeec8ca662ae7f26d2821 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 3 Jan 2021 17:54:05 -0800 Subject: [PATCH 03/22] Version 1.11.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 69d7cdf..83ecb89 100644 --- a/pom.xml +++ b/pom.xml @@ -66,7 +66,7 @@ -LOCAL - 1.10.2 + 1.11.0 From c882ca3288302aa5cfdd84e27efecf92bae1ed93 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 3 Jan 2021 17:54:33 -0800 Subject: [PATCH 04/22] Added owner to WarpRemoveEvent https://github.com/BentoBoxWorld/Warps/issues/91 --- .../bentobox/warps/WarpSignsManager.java | 11 ++++++ .../bentobox/warps/event/WarpRemoveEvent.java | 38 +++++++++++++------ .../warps/listeners/WarpSignsListener.java | 35 ++++++++++------- 3 files changed, 59 insertions(+), 25 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 87ddae1..d408638 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -10,6 +10,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; +import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.UUID; @@ -128,6 +129,16 @@ public class WarpSignsManager { return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().equals(location)) .findFirst().map(en -> plugin.getPlayers().getName(en.getKey())).orElse(""); } + + /** + * Get the optional UUID of the warp owner by location + * @param location to search + * @return Optional UUID of warp owner or empty if there is none + */ + public Optional getWarpOwnerUUID(Location location) { + return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().equals(location)) + .findFirst().map(Map.Entry::getKey); + } /** * Get sorted list of warps with most recent players listed first diff --git a/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java b/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java index 54837f0..ccbd369 100644 --- a/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpRemoveEvent.java @@ -5,8 +5,8 @@ import java.util.UUID; import org.bukkit.Location; import org.bukkit.event.Event; import org.bukkit.event.HandlerList; - -import world.bentobox.warps.Warp; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; /** * This event is fired when a Warp is removed (when a warp sign is broken) @@ -18,32 +18,48 @@ import world.bentobox.warps.Warp; public class WarpRemoveEvent extends Event{ private static final HandlerList handlers = new HandlerList(); - private Location warpLoc; - private UUID remover; + private final Location warpLoc; + private final UUID remover; + private final UUID owner; /** - * @param plugin - BSkyBlock plugin objects - * @param warpLoc - * @param remover + * @param warpLoc - Warp location + * @param remover - UUID of remover + * @param owner - UUID of warp owner - rarely, may be null */ - public WarpRemoveEvent(Warp plugin, Location warpLoc, UUID remover){ + public WarpRemoveEvent(@NonNull Location warpLoc, UUID remover, @Nullable UUID owner){ this.warpLoc = warpLoc; this.remover = remover; + this.owner = owner; } /** * Get the location of the removed Warp * @return removed warp's location */ - public Location getWarpLocation(){return this.warpLoc;} + @NonNull + public Location getWarpLocation(){ + return this.warpLoc; + } /** * Get who has removed the warp * @return the warp's remover */ - public UUID getRemover(){return this.remover;} + @NonNull + public UUID getRemover(){ + return this.remover; + } - @Override + /** + * @return the owner + */ + @Nullable + protected UUID getOwner() { + return owner; + } + + @Override public HandlerList getHandlers() { return handlers; } diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index f16f48c..e0800f6 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -5,7 +5,11 @@ import java.util.Iterator; import java.util.Map; import java.util.UUID; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Tag; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; @@ -14,9 +18,10 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.SignChangeEvent; - import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.scheduler.BukkitRunnable; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.events.addon.AddonEvent; import world.bentobox.bentobox.api.events.team.TeamKickEvent; @@ -99,21 +104,21 @@ public class WarpSignsListener implements Listener { boolean inWorld = addon.getPlugin().getIWM().inWorld(b.getWorld()); // Signs only // FIXME: When we drop support for 1.13, switch to Tag.SIGNS - if (!e.getBlock().getType().name().contains("SIGN") + if (!b.getType().name().contains("SIGN") || (inWorld && !addon.inRegisteredWorld(b.getWorld())) - || (!inWorld && !addon.getSettings().isAllowInOtherWorlds()) ) { + || (!inWorld && !addon.getSettings().isAllowInOtherWorlds()) + || !isWarpSign(b)) { return; } User user = User.getInstance(e.getPlayer()); - if (isWarpSign(b)) { - if (isPlayersSign(e.getPlayer(), b, inWorld)) { - addon.getWarpSignsManager().removeWarp(b.getLocation()); - Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(addon, b.getLocation(), user.getUniqueId())); - } else { - // Someone else's sign - not allowed - user.sendMessage("warps.error.no-remove"); - e.setCancelled(true); - } + UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(b.getLocation()).orElse(null); + if (isPlayersSign(e.getPlayer(), b, inWorld)) { + addon.getWarpSignsManager().removeWarp(b.getLocation()); + Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(b.getLocation(), user.getUniqueId(), owner)); + } else { + // Someone else's sign - not allowed + user.sendMessage("warps.error.no-remove"); + e.setCancelled(true); } } @@ -175,7 +180,9 @@ public class WarpSignsListener implements Listener { oldSign.update(true, false); user.sendMessage("warps.deactivate"); addon.getWarpSignsManager().removeWarp(oldSignBlock.getWorld(), user.getUniqueId()); - Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(addon, oldSign.getLocation(), user.getUniqueId())); + @Nullable + UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(oldSignLoc).orElse(null); + Bukkit.getPluginManager().callEvent(new WarpRemoveEvent(oldSign.getLocation(), user.getUniqueId(), owner)); } } // Set up the new warp sign From 2506d2ac9ed26808f66904984e9f77f40b79ebe4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 8 Jan 2021 22:14:03 -0800 Subject: [PATCH 05/22] Deprecated and removed WarpListEvent Cannot be fired because this part of the code needs to run async. https://github.com/BentoBoxWorld/Warps/issues/93 --- .../bentobox/warps/WarpSignsManager.java | 12 +++------- .../bentobox/warps/event/WarpListEvent.java | 22 +++---------------- 2 files changed, 6 insertions(+), 28 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index d408638..51009ba 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -38,7 +38,6 @@ import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.lists.Flags; import world.bentobox.bentobox.util.Util; import world.bentobox.warps.event.WarpInitiateEvent; -import world.bentobox.warps.event.WarpListEvent; import world.bentobox.warps.objects.WarpsData; /** @@ -129,7 +128,7 @@ public class WarpSignsManager { return getWarpMap(location.getWorld()).entrySet().stream().filter(en -> en.getValue().equals(location)) .findFirst().map(en -> plugin.getPlayers().getName(en.getKey())).orElse(""); } - + /** * Get the optional UUID of the warp owner by location * @param location to search @@ -165,11 +164,6 @@ public class WarpSignsManager { if (list.size() > MAX_WARPS) { list.subList(0, MAX_WARPS).clear(); } - // Fire event - WarpListEvent event = new WarpListEvent(addon, list); - Bukkit.getPluginManager().callEvent(event); - // Get the result of any changes by listeners - list = event.getWarps(); return list; } @@ -262,7 +256,7 @@ public class WarpSignsManager { if (getWarpMap(world).containsKey(uuid)) { popSign(getWarpMap(world).get(uuid)); getWarpMap(world).remove(uuid); - + } // Remove sign from warp panel cache addon.getWarpPanelManager().removeWarp(world, uuid); @@ -353,7 +347,7 @@ public class WarpSignsManager { user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); - } + } if (!warpOwner.equals(user)) { warpOwner.sendMessage("warps.player-warped", "[name]", user.getName()); } diff --git a/src/main/java/world/bentobox/warps/event/WarpListEvent.java b/src/main/java/world/bentobox/warps/event/WarpListEvent.java index 869750c..8384034 100644 --- a/src/main/java/world/bentobox/warps/event/WarpListEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpListEvent.java @@ -1,20 +1,3 @@ -/******************************************************************************* - * This file is part of ASkyBlock. - * - * ASkyBlock is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * ASkyBlock is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with ASkyBlock. If not, see . - *******************************************************************************/ - package world.bentobox.warps.event; import java.util.List; @@ -30,10 +13,11 @@ import world.bentobox.warps.Warp; * the API updateWarpPanel method is called. * A listener to this event can reorder or rewrite the warp list by using setWarps. * This new order will then be used in the warp panel. - * + * * @author tastybento - * + * @deprecated this event is not fired any more because the task is async */ +@Deprecated public class WarpListEvent extends Event { private static final HandlerList handlers = new HandlerList(); private List warps; From dcd5bd1514db828da186a5cbcfa7eaa58707ee93 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 9 Jan 2021 10:38:47 -0800 Subject: [PATCH 06/22] Run offlinePlayer code async to avoid blocking IO --- .../bentobox/warps/WarpPanelManager.java | 28 ++++++++++--------- .../bentobox/warps/WarpSignsManager.java | 14 ++++++++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 92bf279..3e71a54 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -1,11 +1,10 @@ package world.bentobox.warps; -import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.UUID; +import java.util.concurrent.CompletableFuture; -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.inventory.ItemStack; @@ -69,20 +68,23 @@ public class WarpPanelManager { .user(user) .name(user.getTranslation("warps.title") + " " + (index + 1)); - Bukkit.getScheduler().runTaskAsynchronously(addon.getPlugin(), () -> { - buildPanel(panelBuilder, user, index, world); - Bukkit.getScheduler().runTask(addon.getPlugin(), () -> panelBuilder.build()); - }); - + buildPanel(panelBuilder, user, index, world).thenRun(() -> panelBuilder.build()); } - void buildPanel(PanelBuilder panelBuilder, User user, int index, World world) { - List warps = new ArrayList<>(addon.getWarpSignsManager().getSortedWarps(world)); - // Build the main body - int i = buildMainBody(panelBuilder, user, index, world, warps, getRandomWarp(warps)); - // Add navigation - addNavigation(panelBuilder, user, world, i, index, warps.size()); + CompletableFuture buildPanel(PanelBuilder panelBuilder, User user, int index, World world) { + CompletableFuture r = new CompletableFuture<>(); + processSigns(r, panelBuilder, user, index, world); + return r; + } + void processSigns(CompletableFuture r, PanelBuilder panelBuilder, User user, int index, World world) { + addon.getWarpSignsManager().getSortedWarps(world).thenAccept(warps -> { + // Build the main body + int i = buildMainBody(panelBuilder, user, index, world, warps, getRandomWarp(warps)); + // Add navigation + addNavigation(panelBuilder, user, world, i, index, warps.size()); + r.complete(null); + }); } int buildMainBody(PanelBuilder panelBuilder, User user, int index, World world, List warps, boolean randomWarp) { diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 51009ba..2c92582 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -14,6 +14,7 @@ import java.util.Optional; import java.util.Set; import java.util.TreeMap; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; import org.bukkit.Bukkit; @@ -143,8 +144,13 @@ public class WarpSignsManager { * Get sorted list of warps with most recent players listed first * @return UUID list */ - @NonNull - public List getSortedWarps(@NonNull World world) { + public CompletableFuture> getSortedWarps(@NonNull World world) { + CompletableFuture> r = new CompletableFuture<>(); + Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> processWarpMap(r, world)); + return r; + } + + private void processWarpMap(CompletableFuture> r, @NonNull World world) { // Remove any null locations - this can happen if an admin changes the name of the world and signs point to old locations getWarpMap(world).values().removeIf(Objects::isNull); // Bigger value of time means a more recent login @@ -164,7 +170,9 @@ public class WarpSignsManager { if (list.size() > MAX_WARPS) { list.subList(0, MAX_WARPS).clear(); } - return list; + // Return to main thread + Bukkit.getScheduler().runTask(plugin, () -> r.complete(list)); + } /** From 4ad5d864ab37f2ef35e1722e423635e36ba61823 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 9 Jan 2021 11:19:35 -0800 Subject: [PATCH 07/22] Use SignCacheItem Indicate whether it is real or not. --- .../world/bentobox/warps/SignCacheItem.java | 17 ++++ .../bentobox/warps/SignCacheManager.java | 44 +++++------ .../bentobox/warps/WarpPanelManager.java | 21 +++-- .../bentobox/warps/WarpSignsManager.java | 79 ++++++++++--------- 4 files changed, 96 insertions(+), 65 deletions(-) diff --git a/src/main/java/world/bentobox/warps/SignCacheItem.java b/src/main/java/world/bentobox/warps/SignCacheItem.java index fb938bb..48e9056 100644 --- a/src/main/java/world/bentobox/warps/SignCacheItem.java +++ b/src/main/java/world/bentobox/warps/SignCacheItem.java @@ -12,6 +12,7 @@ import com.google.gson.annotations.Expose; * */ public class SignCacheItem { + @Expose private final List signText; @Expose @@ -24,6 +25,15 @@ public class SignCacheItem { this.signText = signText; this.type = type; } + + /** + * This sign is not real + */ + public SignCacheItem() { + this.signText = null; + this.type = null; + } + /** * @return the signText */ @@ -36,5 +46,12 @@ public class SignCacheItem { public Material getType() { return type; } + /** + * @return the isReal + */ + public boolean isReal() { + return getType() != null; + } + } \ No newline at end of file diff --git a/src/main/java/world/bentobox/warps/SignCacheManager.java b/src/main/java/world/bentobox/warps/SignCacheManager.java index 4a75271..9dabab5 100644 --- a/src/main/java/world/bentobox/warps/SignCacheManager.java +++ b/src/main/java/world/bentobox/warps/SignCacheManager.java @@ -1,14 +1,15 @@ package world.bentobox.warps; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.World; +import org.eclipse.jdt.annotation.NonNull; +import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.database.Database; import world.bentobox.warps.objects.SignCache; @@ -29,6 +30,7 @@ public class SignCacheManager { handler.loadObjects().forEach(w -> { World world = Bukkit.getWorld(w.getUniqueId()); if (world != null) { + w.getSigns().values().removeIf(sci -> sci.getType().equals(Material.AIR)); cachedSigns.put(world, w.getSigns()); } }); @@ -38,32 +40,30 @@ public class SignCacheManager { cachedSigns.forEach((w, m) -> handler.saveObjectAsync(new SignCache(w, m))); } - Material getSignIcon(World world, UUID warpOwner) { - // Add the worlds if we haven't seen this before - cachedSigns.putIfAbsent(world, new HashMap<>()); - if (cachedSigns.get(world).containsKey(warpOwner)) { - return cachedSigns.get(world).get(warpOwner).getType(); - } - // Not in cache - SignCacheItem sc = addon.getWarpSignsManager().getSignInfo(world, warpOwner); - cachedSigns.get(world).put(warpOwner, sc); - return sc.getType(); - } - /** - * Gets sign text and cache it - * @param playerUUID - * @return sign text in a list + * Get the sign item from cache or get it from the world if it is not in the cache + * @param world - world + * @param warpOwner - warp owner + * @return SignCacheItem */ - List getSign(World world, UUID playerUUID) { + @NonNull + SignCacheItem getSignItem(World world, UUID warpOwner) { // Add the worlds if we haven't seen this before cachedSigns.putIfAbsent(world, new HashMap<>()); - if (cachedSigns.get(world).containsKey(playerUUID)) { - return cachedSigns.get(world).get(playerUUID).getSignText(); + // Get from cache if available + if (cachedSigns.get(world).containsKey(warpOwner)) { + return cachedSigns.get(world).get(warpOwner); } - SignCacheItem result = addon.getWarpSignsManager().getSignInfo(world, playerUUID); - cachedSigns.get(world).put(playerUUID, result); - return result.getSignText(); + // Generate and add to cache + SignCacheItem result = addon.getWarpSignsManager().getSignInfo(world, warpOwner); + if (result.isReal()) { + BentoBox.getInstance().logDebug("Warp is real - caching"); + cachedSigns.get(world).put(warpOwner, result); + } else { + BentoBox.getInstance().logDebug("Warp is not real - removing"); + addon.getWarpSignsManager().removeWarp(world, warpOwner); + } + return result; } /** diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 3e71a54..2dd6ffd 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -8,7 +8,9 @@ import java.util.concurrent.CompletableFuture; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.inventory.ItemStack; +import org.eclipse.jdt.annotation.NonNull; +import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; @@ -26,12 +28,13 @@ public class WarpPanelManager { signCacheManager = new SignCacheManager(addon); } - private PanelItem getPanelItem(World world, UUID warpOwner) { + private PanelItem getPanelItem(World world, UUID warpOwner, SignCacheItem sign) { + PanelItemBuilder pib = new PanelItemBuilder() .name(addon.getSettings().getNameFormat() + addon.getPlugin().getPlayers().getName(warpOwner)) - .description(signCacheManager.getSign(world, warpOwner)) + .description(sign.getSignText()) .clickHandler((panel, clicker, click, slot) -> hander(world, clicker, warpOwner)); - Material icon = signCacheManager.getSignIcon(world, warpOwner); + Material icon = sign.getType(); if (icon.equals(Material.PLAYER_HEAD)) { return pib.icon(addon.getPlayers().getName(warpOwner)).build(); } else { @@ -96,10 +99,18 @@ public class WarpPanelManager { int i = index * PANEL_MAX_SIZE; for (; i < (index * PANEL_MAX_SIZE + PANEL_MAX_SIZE) && i < warps.size(); i++) { + UUID warpOwner = warps.get(i); if (randomWarp && i == 0) { - panelBuilder.item(getRandomButton(world, user, warps.get(i))); + panelBuilder.item(getRandomButton(world, user, warpOwner)); } else { - panelBuilder.item(getPanelItem(world, warps.get(i))); + @NonNull + SignCacheItem sign = signCacheManager.getSignItem(world, warpOwner); + if (sign.isReal()) { + BentoBox.getInstance().logDebug("Sign is real - adding to panel"); + panelBuilder.item(getPanelItem(world, warpOwner, sign)); + } else { + BentoBox.getInstance().logDebug("Sign is not real - not adding to panel"); + } } } return i; diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 2c92582..33336aa 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -3,7 +3,6 @@ package world.bentobox.warps; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -291,44 +290,48 @@ public class WarpSignsManager { List result = new ArrayList<>(); //get the sign info Location signLocation = getWarp(world, uuid); - if (signLocation != null && signLocation.getBlock().getType().name().contains("SIGN")) { - Sign sign = (Sign)signLocation.getBlock().getState(); - result.addAll(Arrays.asList(sign.getLines())); - // Clean up - remove the [WELCOME] line - result.remove(0); - // Remove any trailing blank lines - result.removeIf(String::isEmpty); - // Set the initial color per lore setting - for (int i = 0; i< result.size(); i++) { - result.set(i, ChatColor.translateAlternateColorCodes('&', addon.getSettings().getLoreFormat()) + result.get(i)); - } - // Get the sign type - - String prefix = plugin.getIWM().getAddon(world).map(Addon::getPermissionPrefix).orElse(""); - - Material icon; - - if (!prefix.isEmpty()) - { - icon = Material.matchMaterial( - this.getPermissionValue(User.getInstance(uuid), - prefix + "island.warp", - this.addon.getSettings().getIcon())); - } - else - { - icon = Material.matchMaterial(this.addon.getSettings().getIcon()); - } - - if (icon == null || icon.name().contains("SIGN")) { - return new SignCacheItem(result, Material.valueOf(sign.getType().name().replace("WALL_", ""))); - } else { - return new SignCacheItem(result, icon); - } - } else { - addon.getWarpSignsManager().removeWarp(world, uuid); + if (signLocation == null) { + plugin.logDebug("Null warp found"); + return new SignCacheItem(); } - return new SignCacheItem(Collections.emptyList(), Material.AIR); + if (!signLocation.getBlock().getType().name().contains("SIGN")) { + plugin.logDebug("Sign block is not"); + return new SignCacheItem(); + } + plugin.logDebug("Sign block is a sign"); + Sign sign = (Sign)signLocation.getBlock().getState(); + result.addAll(Arrays.asList(sign.getLines())); + // Clean up - remove the [WELCOME] line + result.remove(0); + // Remove any trailing blank lines + result.removeIf(String::isEmpty); + // Set the initial color per lore setting + for (int i = 0; i< result.size(); i++) { + result.set(i, ChatColor.translateAlternateColorCodes('&', addon.getSettings().getLoreFormat()) + result.get(i)); + } + // Get the sign type + + String prefix = plugin.getIWM().getAddon(world).map(Addon::getPermissionPrefix).orElse(""); + + Material icon; + + if (!prefix.isEmpty()) + { + icon = Material.matchMaterial( + this.getPermissionValue(User.getInstance(uuid), + prefix + "island.warp", + this.addon.getSettings().getIcon())); + } + else + { + icon = Material.matchMaterial(this.addon.getSettings().getIcon()); + } + + if (icon == null || icon.name().contains("SIGN")) { + return new SignCacheItem(result, Material.valueOf(sign.getType().name().replace("WALL_", ""))); + } + return new SignCacheItem(result, icon); + } /** From 82bd4c8b312ade66a73dc3e8e065f0a3aed7b54c Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 9 Jan 2021 11:37:41 -0800 Subject: [PATCH 08/22] Shows GUI correctly --- src/main/java/world/bentobox/warps/SignCacheManager.java | 1 + src/main/java/world/bentobox/warps/WarpPanelManager.java | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/warps/SignCacheManager.java b/src/main/java/world/bentobox/warps/SignCacheManager.java index 9dabab5..bf24e5b 100644 --- a/src/main/java/world/bentobox/warps/SignCacheManager.java +++ b/src/main/java/world/bentobox/warps/SignCacheManager.java @@ -61,6 +61,7 @@ public class SignCacheManager { cachedSigns.get(world).put(warpOwner, result); } else { BentoBox.getInstance().logDebug("Warp is not real - removing"); + cachedSigns.get(world).remove(warpOwner); addon.getWarpSignsManager().removeWarp(world, warpOwner); } return result; diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 2dd6ffd..0bf22a2 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -98,7 +98,7 @@ public class WarpPanelManager { } int i = index * PANEL_MAX_SIZE; - for (; i < (index * PANEL_MAX_SIZE + PANEL_MAX_SIZE) && i < warps.size(); i++) { + for (; panelBuilder.getItems().size() < PANEL_MAX_SIZE && i < warps.size(); i++) { UUID warpOwner = warps.get(i); if (randomWarp && i == 0) { panelBuilder.item(getRandomButton(world, user, warpOwner)); @@ -135,6 +135,7 @@ public class WarpPanelManager { * @param totalNum - total number of items in the list */ void addNavigation(PanelBuilder panelBuilder, User user, World world, int numOfItems, int panelNum, int totalNum) { + BentoBox.getInstance().logDebug("numOfItlems = " + numOfItems + " panel Num " + panelNum + " total Num " + totalNum); if (numOfItems < totalNum) { // Next panelBuilder.item(new PanelItemBuilder() @@ -146,7 +147,7 @@ public class WarpPanelManager { return true; }).build()); } - if (numOfItems > PANEL_MAX_SIZE) { + if (panelNum > 0 && numOfItems > PANEL_MAX_SIZE) { // Previous panelBuilder.item(new PanelItemBuilder() .name(user.getTranslation("warps.previous")) From 7fbe4b5b88446977bd80f4dd36466f792ced9d13 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 9 Jan 2021 15:33:27 -0800 Subject: [PATCH 09/22] Fixes sync errors and blank warps https://github.com/BentoBoxWorld/Warps/issues/93 https://github.com/BentoBoxWorld/Warps/issues/92 https://github.com/BentoBoxWorld/Warps/issues/75 --- .../bentobox/warps/SignCacheManager.java | 5 +- src/main/java/world/bentobox/warps/Warp.java | 7 +- .../bentobox/warps/WarpPanelManager.java | 95 +++++++++++-------- .../bentobox/warps/WarpSignsManager.java | 22 +++-- .../bentobox/warps/commands/WarpsCommand.java | 2 +- .../bentobox/warps/objects/WarpsData.java | 1 + .../bentobox/warps/WarpPanelManagerTest.java | 52 +++++----- .../bentobox/warps/WarpSignsManagerTest.java | 84 +++++++++------- 8 files changed, 146 insertions(+), 122 deletions(-) diff --git a/src/main/java/world/bentobox/warps/SignCacheManager.java b/src/main/java/world/bentobox/warps/SignCacheManager.java index bf24e5b..49e73db 100644 --- a/src/main/java/world/bentobox/warps/SignCacheManager.java +++ b/src/main/java/world/bentobox/warps/SignCacheManager.java @@ -9,7 +9,6 @@ import org.bukkit.Material; import org.bukkit.World; import org.eclipse.jdt.annotation.NonNull; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.database.Database; import world.bentobox.warps.objects.SignCache; @@ -27,6 +26,7 @@ public class SignCacheManager { } private void loadCache() { + cachedSigns.clear(); handler.loadObjects().forEach(w -> { World world = Bukkit.getWorld(w.getUniqueId()); if (world != null) { @@ -57,12 +57,9 @@ public class SignCacheManager { // Generate and add to cache SignCacheItem result = addon.getWarpSignsManager().getSignInfo(world, warpOwner); if (result.isReal()) { - BentoBox.getInstance().logDebug("Warp is real - caching"); cachedSigns.get(world).put(warpOwner, result); } else { - BentoBox.getInstance().logDebug("Warp is not real - removing"); cachedSigns.get(world).remove(warpOwner); - addon.getWarpSignsManager().removeWarp(world, warpOwner); } return result; } diff --git a/src/main/java/world/bentobox/warps/Warp.java b/src/main/java/world/bentobox/warps/Warp.java index 3ffceac..7d19c89 100644 --- a/src/main/java/world/bentobox/warps/Warp.java +++ b/src/main/java/world/bentobox/warps/Warp.java @@ -104,7 +104,7 @@ public class Warp extends Addon { this.warpSignsManager.saveWarpList(); this.loadSettings(); - this.getLogger().info("WelcomeWarp addon reloaded."); + this.getLogger().info("Warps addon reloaded."); } } @@ -149,10 +149,9 @@ public class Warp extends Addon { @Override public void onDisable(){ // Save the warps - if (warpSignsManager != null) + if (warpSignsManager != null) { warpSignsManager.saveWarpList(); - if (warpPanelManager != null) - warpPanelManager.saveCache(); + } } diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 0bf22a2..762eaf1 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -1,5 +1,6 @@ package world.bentobox.warps; +import java.util.Iterator; import java.util.List; import java.util.Random; import java.util.UUID; @@ -10,7 +11,6 @@ import org.bukkit.World; import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.NonNull; -import world.bentobox.bentobox.BentoBox; import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.builders.PanelBuilder; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; @@ -52,7 +52,6 @@ public class WarpPanelManager { } private PanelItem getRandomButton(World world, User user, UUID warpOwner) { - ///give @p minecraft:player_head{display:{Name:"{\"text\":\"Question Mark\"}"},SkullOwner:"MHF_Question"} 1 return new PanelItemBuilder() .name(addon.getSettings().getNameFormat() + user.getTranslation("warps.random")) .clickHandler((panel, clicker, click, slot) -> hander(world, clicker, warpOwner)) @@ -82,40 +81,27 @@ public class WarpPanelManager { void processSigns(CompletableFuture r, PanelBuilder panelBuilder, User user, int index, World world) { addon.getWarpSignsManager().getSortedWarps(world).thenAccept(warps -> { + // Cache and clean the signs + Iterator it = warps.iterator(); + while(it.hasNext()) { + UUID warpOwner = it.next(); + @NonNull + SignCacheItem sign = signCacheManager.getSignItem(world, warpOwner); + if (!sign.isReal()) { + it.remove(); + addon.getWarpSignsManager().removeWarpFromMap(world, warpOwner); + } + } + // Add random warp + getRandomWarp(warps); // Build the main body - int i = buildMainBody(panelBuilder, user, index, world, warps, getRandomWarp(warps)); + int i = buildMainBody(panelBuilder, user, index, world, warps); // Add navigation addNavigation(panelBuilder, user, world, i, index, warps.size()); r.complete(null); }); } - int buildMainBody(PanelBuilder panelBuilder, User user, int index, World world, List warps, boolean randomWarp) { - if (index < 0) { - index = 0; - } else if (index > (warps.size() / PANEL_MAX_SIZE)) { - index = warps.size() / PANEL_MAX_SIZE; - } - - int i = index * PANEL_MAX_SIZE; - for (; panelBuilder.getItems().size() < PANEL_MAX_SIZE && i < warps.size(); i++) { - UUID warpOwner = warps.get(i); - if (randomWarp && i == 0) { - panelBuilder.item(getRandomButton(world, user, warpOwner)); - } else { - @NonNull - SignCacheItem sign = signCacheManager.getSignItem(world, warpOwner); - if (sign.isReal()) { - BentoBox.getInstance().logDebug("Sign is real - adding to panel"); - panelBuilder.item(getPanelItem(world, warpOwner, sign)); - } else { - BentoBox.getInstance().logDebug("Sign is not real - not adding to panel"); - } - } - } - return i; - } - private boolean getRandomWarp(List warps) { // Add random warp if (!warps.isEmpty() && addon.getSettings().isRandomAllowed()) { @@ -125,6 +111,31 @@ public class WarpPanelManager { return false; } + int buildMainBody(PanelBuilder panelBuilder, User user, int index, World world, List warps) { + if (index < 0) { + index = 0; + } else if (index > (warps.size() / PANEL_MAX_SIZE)) { + index = warps.size() / PANEL_MAX_SIZE; + } + + int i = index * PANEL_MAX_SIZE; + for (; panelBuilder.getItems().size() < PANEL_MAX_SIZE && i < warps.size(); i++) { + UUID warpOwner = warps.get(i); + if (addon.getSettings().isRandomAllowed() && i == 0) { + panelBuilder.item(getRandomButton(world, user, warpOwner)); + } else { + @NonNull + SignCacheItem sign = signCacheManager.getSignItem(world, warpOwner); + if (sign.isReal()) { + panelBuilder.item(getPanelItem(world, warpOwner, sign)); + } else { + addon.getWarpSignsManager().removeWarpFromMap(world, warpOwner); + } + } + } + return i; + } + /** * Add Next and Previous icons to navigate * @param panelBuilder - the panel builder @@ -135,18 +146,7 @@ public class WarpPanelManager { * @param totalNum - total number of items in the list */ void addNavigation(PanelBuilder panelBuilder, User user, World world, int numOfItems, int panelNum, int totalNum) { - BentoBox.getInstance().logDebug("numOfItlems = " + numOfItems + " panel Num " + panelNum + " total Num " + totalNum); - if (numOfItems < totalNum) { - // Next - panelBuilder.item(new PanelItemBuilder() - .name(user.getTranslation("warps.next")) - .icon(new ItemStack(Material.STONE)) - .clickHandler((panel, clicker, click, slot) -> { - user.closeInventory(); - showWarpPanel(world, user, panelNum+1); - return true; - }).build()); - } + // Previous if (panelNum > 0 && numOfItems > PANEL_MAX_SIZE) { // Previous panelBuilder.item(new PanelItemBuilder() @@ -158,7 +158,18 @@ public class WarpPanelManager { return true; }).build()); } - + // Next + if (numOfItems < totalNum) { + // Next + panelBuilder.item(new PanelItemBuilder() + .name(user.getTranslation("warps.next")) + .icon(new ItemStack(Material.STONE)) + .clickHandler((panel, clicker, click, slot) -> { + user.closeInventory(); + showWarpPanel(world, user, panelNum+1); + return true; + }).build()); + } } /** diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 33336aa..d4d2c18 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -75,6 +75,7 @@ public class WarpSignsManager { public WarpSignsManager(Warp addon, BentoBox plugin) { this.addon = addon; this.plugin = plugin; + this.worldsWarpList = new HashMap<>(); // Set up the database handler // Note that these are saved by the BentoBox database handler = new Database<>(addon, WarpsData.class); @@ -149,7 +150,7 @@ public class WarpSignsManager { return r; } - private void processWarpMap(CompletableFuture> r, @NonNull World world) { + List processWarpMap(CompletableFuture> r, @NonNull World world) { // Remove any null locations - this can happen if an admin changes the name of the world and signs point to old locations getWarpMap(world).values().removeIf(Objects::isNull); // Bigger value of time means a more recent login @@ -171,7 +172,7 @@ public class WarpSignsManager { } // Return to main thread Bukkit.getScheduler().runTask(plugin, () -> r.complete(list)); - + return list; } /** @@ -270,6 +271,15 @@ public class WarpSignsManager { saveWarpList(); } + /** + * Remove the warp from the warp map + * @param world - world + * @param uuid - uuid of owner + */ + public void removeWarpFromMap(World world, UUID uuid) { + getWarpMap(world).remove(uuid); + } + /** * Saves the warp lists to the database */ @@ -290,15 +300,9 @@ public class WarpSignsManager { List result = new ArrayList<>(); //get the sign info Location signLocation = getWarp(world, uuid); - if (signLocation == null) { - plugin.logDebug("Null warp found"); + if (signLocation == null || !signLocation.getBlock().getType().name().contains("SIGN")) { return new SignCacheItem(); } - if (!signLocation.getBlock().getType().name().contains("SIGN")) { - plugin.logDebug("Sign block is not"); - return new SignCacheItem(); - } - plugin.logDebug("Sign block is a sign"); Sign sign = (Sign)signLocation.getBlock().getState(); result.addAll(Arrays.asList(sign.getLines())); // Clean up - remove the [WELCOME] line diff --git a/src/main/java/world/bentobox/warps/commands/WarpsCommand.java b/src/main/java/world/bentobox/warps/commands/WarpsCommand.java index 5e5b86e..da01090 100644 --- a/src/main/java/world/bentobox/warps/commands/WarpsCommand.java +++ b/src/main/java/world/bentobox/warps/commands/WarpsCommand.java @@ -4,9 +4,9 @@ import java.util.List; import org.bukkit.World; -import world.bentobox.warps.Warp; import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.user.User; +import world.bentobox.warps.Warp; /** * Handles the warps command diff --git a/src/main/java/world/bentobox/warps/objects/WarpsData.java b/src/main/java/world/bentobox/warps/objects/WarpsData.java index db85455..1b6dd9f 100644 --- a/src/main/java/world/bentobox/warps/objects/WarpsData.java +++ b/src/main/java/world/bentobox/warps/objects/WarpsData.java @@ -50,6 +50,7 @@ public class WarpsData implements DataObject { * @return this class filled with data */ public WarpsData save(Map> worldsWarpList) { + getWarpSigns().clear(); worldsWarpList.values().forEach(world -> world.forEach((uuid,location) -> warpSigns.put(location, uuid))); return this; } diff --git a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java index 30d74ff..0bfb057 100644 --- a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import java.util.concurrent.CompletableFuture; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -105,7 +106,7 @@ public class WarpPanelManagerTest { uuid = UUID.randomUUID(); list.add(uuid); - when(wsm.getSortedWarps(any())).thenReturn(list); + when(wsm.getSortedWarps(any())).thenReturn(CompletableFuture.completedFuture(list)); // User and player when(user.getPlayer()).thenReturn(player); @@ -142,21 +143,20 @@ public class WarpPanelManagerTest { Location location = mock(Location.class); Block block = mock(Block.class); - Material sign_type; + Material signType; try { - sign_type = Material.valueOf("SIGN"); + signType = Material.valueOf("SIGN"); } catch (Exception e) { - sign_type = Material.valueOf("OAK_SIGN"); + signType = Material.valueOf("OAK_SIGN"); } - when(block.getType()).thenReturn(sign_type); + when(block.getType()).thenReturn(signType); when(location.getBlock()).thenReturn(block); // Sign block when(wsm.getWarp(any(), any())).thenReturn(location); // Sign cache - SignCacheItem sc = mock(SignCacheItem.class); - when(sc.getSignText()).thenReturn(Collections.singletonList("[welcome]")); - when(sc.getType()).thenReturn(sign_type); + + SignCacheItem sc = new SignCacheItem(Collections.singletonList("[welcome]"), signType); when(wsm.getSignInfo(any(), any())).thenReturn(sc); // Class under test @@ -164,18 +164,17 @@ public class WarpPanelManagerTest { } /** - * Test method for {@link WarpPanelManager#showWarpPanel(org.bukkit.World, world.bentobox.bbox.api.user.User, int)}. + * Test method for {@link WarpPanelManager#processSigns(CompletableFuture, PanelBuilder, User, int, World)}. */ @Test public void testShowWarpPanelTestCache() { PanelBuilder pb = mock(PanelBuilder.class); - // Do 45 initial lookups of sign text - wpm.buildPanel(pb, user, 3, world); - + // Do initial lookups of sign text + wpm.processSigns(new CompletableFuture<>(), pb, user, 3, world); // Get the panel again - wpm.buildPanel(pb, user, 3, world); - // Should only check this 45 times because the sign text is cached - verify(wsm, times(45)).getSignInfo(any(), any()); + wpm.processSigns(new CompletableFuture<>(), pb, user, 3, world); + // Should only check this 201 times in total because the sign text is cached + verify(wsm, times(201)).getSignInfo(any(), any()); } @@ -194,8 +193,8 @@ public class WarpPanelManagerTest { public void testBuildPanel() { PanelBuilder pb = mock(PanelBuilder.class); wpm.buildPanel(pb, user, 3, world); - // Removing the UUID should force a refresh and therefore 46 lookups - verify(wsm, times(45)).getSignInfo(any(), any()); + // Removing the UUID should force a refresh and therefore 201 lookups + verify(wsm, times(201)).getSignInfo(any(), any()); } @@ -245,8 +244,9 @@ public class WarpPanelManagerTest { private int mainBod(int page, int j, boolean random) { + when(settings.isRandomAllowed()).thenReturn(random); PanelBuilder pb = mock(PanelBuilder.class); - int r = wpm.buildMainBody(pb, user, page, world, list, random); + int r = wpm.buildMainBody(pb, user, page, world, list); verify(pb, times(j)).item(any()); if (random && page <= 0) { verify(user).getTranslation(eq("warps.random")); @@ -261,7 +261,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyNoRandomPage0() { - assertEquals(52, mainBod(0, 52, false)); + assertEquals(201, mainBod(0, 201, false)); } /** @@ -269,7 +269,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyNoRandomPage1() { - assertEquals(104, mainBod(1, 52, false)); + assertEquals(201, mainBod(1, 149, false)); } /** @@ -277,7 +277,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyNoRandomPage2() { - assertEquals(156, mainBod(2, 52, false)); + assertEquals(201, mainBod(2, 97, false)); } /** @@ -293,7 +293,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyNoRandomPageMinus1() { - assertEquals(52, mainBod(-1, 52, false)); + assertEquals(201, mainBod(-1, 201, false)); } /** @@ -301,7 +301,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyRandomPage0() { - assertEquals(52, mainBod(0, 52, true)); + assertEquals(201, mainBod(0, 201, true)); } /** @@ -309,7 +309,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyRandomPage1() { - assertEquals(104, mainBod(1, 52, true)); + assertEquals(201, mainBod(1, 149, true)); } /** @@ -317,7 +317,7 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyRandomPage2() { - assertEquals(156, mainBod(2, 52, true)); + assertEquals(201, mainBod(2, 97, true)); } /** @@ -333,6 +333,6 @@ public class WarpPanelManagerTest { */ @Test public void testBuildMainBodyRandomPageMinus1() { - assertEquals(52, mainBod(-1, 52, true)); + assertEquals(201, mainBod(-1, 201, true)); } } diff --git a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java index 532749e..59a59ea 100644 --- a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java @@ -16,11 +16,20 @@ import static org.mockito.Mockito.when; import java.beans.IntrospectionException; import java.lang.reflect.InvocationTargetException; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; import java.util.logging.Logger; -import org.bukkit.*; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.Server; +import org.bukkit.World; import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -74,7 +83,7 @@ public class WarpSignsManagerTest { @Mock private static AbstractDatabaseHandler handler; - + private WarpSignsManager wsm; @Mock private Logger logger; @@ -106,7 +115,7 @@ public class WarpSignsManagerTest { @Mock private Island island; - + @SuppressWarnings("unchecked") @BeforeClass public static void beforeClass() { @@ -118,7 +127,7 @@ public class WarpSignsManagerTest { when(DatabaseSetup.getDatabase()).thenReturn(dbSetup); when(dbSetup.getHandler(any())).thenReturn(handler); } - + /** * @throws java.lang.Exception */ @@ -127,12 +136,12 @@ public class WarpSignsManagerTest { Whitebox.setInternalState(BentoBox.class, "instance", plugin); when(addon.getPlugin()).thenReturn(plugin); when(addon.getLogger()).thenReturn(logger); - + // Player when(player.getUniqueId()).thenReturn(uuid); User.setPlugin(plugin); User.getInstance(player); - + // Locales LocalesManager lm = mock(LocalesManager.class); when(lm.get(Mockito.any(), Mockito.any())).thenReturn(null); @@ -142,16 +151,16 @@ public class WarpSignsManagerTest { when(phm.replacePlaceholders(any(), anyString())).thenAnswer((Answer) invocation -> invocation.getArgument(1, String.class)); when(plugin.getPlaceholdersManager()).thenReturn(phm); - + // Server when(addon.getServer()).thenReturn(server); when(server.getPlayer(any(UUID.class))).thenReturn(player); - + // Util PowerMockito.mockStatic(Util.class); when(Util.getWorld(any())).thenAnswer((Answer) invocation -> invocation.getArgument(0, World.class)); when(Util.sameWorld(any(), any())).thenReturn(true); - + // Location when(location.getWorld()).thenReturn(world); when(location.getBlock()).thenReturn(block); @@ -174,27 +183,27 @@ public class WarpSignsManagerTest { when(signBd.getRotation()).thenReturn(BlockFace.EAST); when(block.getBlockData()).thenReturn(signBd); when(block.getRelative(any())).thenReturn(block); - + // Handler when(handler.objectExists(eq("warps"))).thenReturn(true); Map warpMap = Collections.singletonMap(location, uuid); when(load.getWarpSigns()).thenReturn(warpMap); when(handler.loadObject(anyString())).thenReturn(load); - + // Settings when(addon.getSettings()).thenReturn(settings); when(settings.getWelcomeLine()).thenReturn("[Welcome]"); when(settings.getLoreFormat()).thenReturn("&f"); when(settings.getIcon()).thenReturn("SIGN"); - - // Bukkit - PowerMockito.mockStatic(Bukkit.class); + + // Bukkit + PowerMockito.mockStatic(Bukkit.class, Mockito.RETURNS_MOCKS); when(Bukkit.getPluginManager()).thenReturn(pim); - + // Players Manager when(plugin.getPlayers()).thenReturn(pm); when(pm.getName(eq(uuid))).thenReturn("tastybento"); - + // Offline player when(server.getOfflinePlayer(any(UUID.class))).thenReturn(offlinePlayer); when(offlinePlayer.getLastPlayed()).thenReturn(System.currentTimeMillis()); @@ -202,15 +211,15 @@ public class WarpSignsManagerTest { // IWM when(plugin.getIWM()).thenReturn(iwm); when(iwm.getPermissionPrefix(any())).thenReturn("bskyblock."); - + // Island Manager when(addon.getIslands()).thenReturn(im); when(im.getIsland(any(), any(UUID.class))).thenReturn(island); when(im.isSafeLocation(any())).thenReturn(true); - + // WarpPanelManager when(addon.getWarpPanelManager()).thenReturn(wpm); - + wsm = new WarpSignsManager(addon, plugin); } @@ -260,10 +269,10 @@ public class WarpSignsManagerTest { wsm = new WarpSignsManager(addon, plugin); assertTrue("Map is not empty", wsm.getWarpMap(world).isEmpty()); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#getWarpMap(org.bukkit.World)}. - * @throws Exception + * @throws Exception */ @Test public void testGetWarpMapNullDatabaseObject() throws Exception { @@ -271,7 +280,7 @@ public class WarpSignsManagerTest { wsm = new WarpSignsManager(addon, plugin); assertTrue("Map is not empty", wsm.getWarpMap(world).isEmpty()); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#getWarpMap(org.bukkit.World)}. */ @@ -281,10 +290,10 @@ public class WarpSignsManagerTest { wsm = new WarpSignsManager(addon, plugin); assertTrue("Map is not empty", wsm.getWarpMap(world).isEmpty()); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#WarpSignsManager(world.bentobox.warps.Warp, world.bentobox.bentobox.BentoBox)}. - * @throws Exception + * @throws Exception */ @Test public void testWarpSignsManager() throws Exception { @@ -300,7 +309,7 @@ public class WarpSignsManagerTest { public void testAddWarpNullPlayer() { assertFalse(wsm.addWarp(null, null)); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#addWarp(java.util.UUID, org.bukkit.Location)}. */ @@ -308,7 +317,7 @@ public class WarpSignsManagerTest { public void testAddWarpNullLocation() { assertFalse(wsm.addWarp(uuid, null)); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#addWarp(java.util.UUID, org.bukkit.Location)}. */ @@ -317,7 +326,7 @@ public class WarpSignsManagerTest { assertTrue(wsm.addWarp(uuid, location)); verify(player).sendMessage("warps.sign-removed"); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#addWarp(java.util.UUID, org.bukkit.Location)}. */ @@ -326,7 +335,7 @@ public class WarpSignsManagerTest { assertTrue(wsm.addWarp(UUID.randomUUID(), location)); verify(player).sendMessage("warps.sign-removed"); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#addWarp(java.util.UUID, org.bukkit.Location)}. */ @@ -358,15 +367,18 @@ public class WarpSignsManagerTest { */ @Test public void testGetWarpOwner() { - assertEquals("tastybento", wsm.getWarpOwner(location)); + assertEquals("tastybento", wsm.getWarpOwner(location)); } /** * Test method for {@link world.bentobox.warps.WarpSignsManager#getSortedWarps(org.bukkit.World)}. + * @throws ExecutionException + * @throws InterruptedException */ @Test - public void testGetSortedWarps() { - assertEquals(1, wsm.getSortedWarps(world).size()); + public void testGetSortedWarps() throws InterruptedException, ExecutionException { + CompletableFuture> r = new CompletableFuture<>(); + assertEquals(1, wsm.processWarpMap(r, world).size()); } /** @@ -398,9 +410,9 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#saveWarpList()}. - * @throws IntrospectionException - * @throws InvocationTargetException - * @throws Exception + * @throws IntrospectionException + * @throws InvocationTargetException + * @throws Exception */ @Test public void testSaveWarpList() throws Exception { @@ -458,10 +470,10 @@ public class WarpSignsManagerTest { verify(addon, times(2)).log(eq("Loading warps...")); assertTrue(wsm.getWarpMap(world).isEmpty()); } - + /** * Test method for {@link world.bentobox.warps.WarpSignsManager#loadWarpList()}. - * @throws Exception + * @throws Exception */ @Test public void testLoadWarpListEmptyWarpTable() throws Exception { From 9db549ea0d4b57c5606b4be6c540dd60e072fd96 Mon Sep 17 00:00:00 2001 From: Huynh Tien Date: Thu, 4 Feb 2021 03:14:32 +0700 Subject: [PATCH 10/22] Add files via upload (#95) --- src/main/resources/locales/vi.yml | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 src/main/resources/locales/vi.yml diff --git a/src/main/resources/locales/vi.yml b/src/main/resources/locales/vi.yml new file mode 100644 index 0000000..45c76ea --- /dev/null +++ b/src/main/resources/locales/vi.yml @@ -0,0 +1,29 @@ +# +# This is a YML file. Be careful when editing. Check your edits in a YAML checker like # +# the one at http://yaml-online-parser.appspot.com # +warp: + help: + description: đi đến điểm dịch chuyển của người chơi + parameters: +warps: + deactivate: '&cBảng cũ đã vô hiệu hóa!' + error: + does-not-exist: '&cUầy! Điểm dịch chuyển đó không tồn tại!' + no-permission: '&cBạn không có quyền làm điều đó!' + no-remove: '&cBạn không thể xóa bảng đó!' + no-warps-yet: '&cChưa có điểm dịch chuyển nào' + not-enough-level: '&cCấp đảo của bạn không đủ cao!' + not-on-island: '&cBạn phải ở đảo của bạn để làm điều đó!' + not-safe: '&cĐiểm dịch chuyển không an toàn!' + your-level-is: '&cCấp đảo của bạn là [level] và phải cao hơn [required]. Hãy dùng lệnh xem cấp đảo.' + help: + description: mở bảng dịch chuyển + next: '&6Trang kế' + player-warped: '&2[name] đã vào điểm dịch chuyển của bạn!' + previous: '&6Trang trước' + random: '&4Điểm dịch chuyển ngẫu nhiên' + sign-removed: '&cĐã xóa bảng dịch chuyển!' + success: '&aThành công!' + title: Bảng Dịch Chuyển + warpTip: '&6Đặt bảng với dòng chữ [text] ở dòng đầu tiên' + warpToPlayersSign: '&6Đang dịch chuyển đến chỗ của [player]' From 757a39e7f97b6453a48cb0c476c8ff2310f44997 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 6 Mar 2021 12:37:51 -0800 Subject: [PATCH 11/22] Github workflows sonar cloud --- .github/ISSUE_TEMPLATE/bug_report.md | 26 ---------------- .github/ISSUE_TEMPLATE/feature_request.md | 17 ----------- .github/workflows/build.yml | 37 +++++++++++++++++++++++ .travis.yml | 21 ------------- pom.xml | 4 +++ 5 files changed, 41 insertions(+), 64 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/build.yml delete mode 100644 .travis.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 9231476..0000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve - ---- - -**Description** - - -**Steps to reproduce the behavior:** -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** - - -**Screenshots** - - -**Server Information:** -Do `bbox version` in the console and paste the result here: - -**Additional context** - diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 066b2d9..0000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..9e16544 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,37 @@ +name: Build +on: + push: + branches: + - develop + - master + pull_request: + types: [opened, synchronize, reopened] +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: Set up JDK 11 + uses: actions/setup-java@v1 + with: + java-version: 11 + - name: Cache SonarCloud packages + uses: actions/cache@v1 + with: + path: ~/.sonar/cache + key: ${{ runner.os }}-sonar + restore-keys: ${{ runner.os }}-sonar + - name: Cache Maven packages + uses: actions/cache@v1 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Build and analyze + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 9c5b6e9..0000000 --- a/.travis.yml +++ /dev/null @@ -1,21 +0,0 @@ -language: java -sudo: false -addons: - sonarcloud: - organization: "bentobox-world" - -jdk: - - openjdk8 - - openjdk11 - -matrix: - allow_failures: - - jdk: openjdk11 - -script: - mvn clean org.jacoco:jacoco-maven-plugin:prepare-agent install sonar:sonar -Dsonar.projectKey=BentoBoxWorld_Warps - -cache: - directories: - - '$HOME/.m2/repository' - - '$HOME/.sonar/cache' diff --git a/pom.xml b/pom.xml index 83ecb89..54e14c5 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,10 @@ -LOCAL 1.11.0 + + BentoBoxWorld_Warps + bentobox-world + https://sonarcloud.io From fc4f6c634ad79cbf9ad00b8a8af67a149d74aaef Mon Sep 17 00:00:00 2001 From: tastybento Date: Sat, 5 Jun 2021 08:37:42 -0700 Subject: [PATCH 12/22] Return null if Level addon is not operating in world --- pom.xml | 2 +- src/main/java/world/bentobox/warps/Warp.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 54e14c5..fb8fce4 100644 --- a/pom.xml +++ b/pom.xml @@ -60,7 +60,7 @@ 1.16.3-R0.1-SNAPSHOT 1.15.4 - 1.5.0 + 2.7.0-SNAPSHOT ${build.version}-SNAPSHOT diff --git a/src/main/java/world/bentobox/warps/Warp.java b/src/main/java/world/bentobox/warps/Warp.java index 7d19c89..565c661 100644 --- a/src/main/java/world/bentobox/warps/Warp.java +++ b/src/main/java/world/bentobox/warps/Warp.java @@ -210,10 +210,18 @@ public class Warp extends Addon { * Get the island level * @param world - world * @param uniqueId - player's UUID - * @return island level or null if there is no level plugin + * @return island level or null if there is no level plugin or Level is not operating in this world */ public Long getLevel(World world, UUID uniqueId) { - return this.getPlugin().getAddonsManager().getAddonByName(LEVEL_ADDON_NAME).map(l -> ((Level) l).getIslandLevel(world, uniqueId)).orElse(null); + // Get name of the game mode + String name = this.getPlugin().getIWM().getAddon(world).map(g -> g.getDescription().getName()).orElse(""); + return this.getPlugin().getAddonsManager().getAddonByName(LEVEL_ADDON_NAME) + .map(l -> { + if (!name.isEmpty() && ((Level) l).getSettings().getGameModes().contains(name)) { + return ((Level) l).getIslandLevel(world, uniqueId); + } + return null; + }).orElse(null); } /* (non-Javadoc) From afec2f56f500f6c6b8392c2a2d52d1794a3adec4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 20 Jun 2021 11:29:45 -0700 Subject: [PATCH 13/22] Java 16 Minecraft 17 --- README.md | 2 ++ pom.xml | 32 ++++++++++++++------------------ src/main/resources/addon.yml | 2 +- 3 files changed, 17 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 607674a..ca11081 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ to disable use by gamemode. ## How to use +### Note: Java 16 and Minecraft 17, or later are required. + 1. Place the jar in the addons folder of the BentoBox plugin 2. Restart the server 3. The addon will create a data folder and inside the folder will be a config.yml diff --git a/pom.xml b/pom.xml index fb8fce4..bd71cdf 100644 --- a/pom.xml +++ b/pom.xml @@ -54,12 +54,12 @@ UTF-8 UTF-8 - 1.8 + 16 - 2.0.2 + 2.0.9 - 1.16.3-R0.1-SNAPSHOT - 1.15.4 + 1.17-R0.1-SNAPSHOT + 1.17.0-SNAPSHOT 2.7.0-SNAPSHOT ${build.version}-SNAPSHOT @@ -166,7 +166,7 @@ org.mockito mockito-core - 3.0.0 + 3.11.1 test @@ -200,7 +200,7 @@ org.eclipse.jdt org.eclipse.jdt.annotation - 2.2.200 + 2.2.600 @@ -250,7 +250,12 @@ org.apache.maven.plugins maven-surefire-plugin - 2.22.0 + 3.0.0-M5 + + + --illegal-access=permit + + org.apache.maven.plugins @@ -262,12 +267,11 @@ maven-javadoc-plugin 3.1.1 - 8 + 16 private false -Xdoclint:none - - + ${java.home}/bin/javadoc @@ -292,14 +296,6 @@ - - org.apache.maven.plugins - maven-shade-plugin - 3.1.1 - - false - - org.apache.maven.plugins maven-install-plugin diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 0d3b925..09642b4 100755 --- a/src/main/resources/addon.yml +++ b/src/main/resources/addon.yml @@ -2,7 +2,7 @@ name: Warps main: world.bentobox.warps.Warp version: ${version}${build.number} icon: OAK_SIGN -api-version: 1.15.4 +api-version: 1.17 authors: tastybento From 8c8f25f6d49fb40bb137d7c87a9706ce01213e83 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 9 Jul 2021 09:00:43 -0700 Subject: [PATCH 14/22] Version 1.11.1 --- pom.xml | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/pom.xml b/pom.xml index bd71cdf..3f946aa 100644 --- a/pom.xml +++ b/pom.xml @@ -59,14 +59,14 @@ 2.0.9 1.17-R0.1-SNAPSHOT - 1.17.0-SNAPSHOT + 1.17.0 2.7.0-SNAPSHOT ${build.version}-SNAPSHOT -LOCAL - 1.11.0 + 1.11.1 BentoBoxWorld_Warps bentobox-world @@ -113,30 +113,6 @@ - - sonar - - https://sonarcloud.io - bentobox-world - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - 3.6.0.1398 - - - verify - - sonar - - - - - - - From 9333265e4db18ceb6eecbd11c3b050169e2bfd90 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 9 Jul 2021 09:00:56 -0700 Subject: [PATCH 15/22] Fix PVP message when teleporting to an island. --- src/main/java/world/bentobox/warps/WarpSignsManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index d4d2c18..17c9268 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -358,7 +358,7 @@ public class WarpSignsManager { return; } if (pvp) { - user.sendMessage("protection.flags.PVP_OVERWORLD.active"); + user.sendMessage("protection.flags.PVP_OVERWORLD.enabled"); user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); @@ -446,7 +446,7 @@ public class WarpSignsManager { final Location actualWarp = new Location(warpSpot.getWorld(), warpSpot.getBlockX() + 0.5D, warpSpot.getBlockY(), warpSpot.getBlockZ() + 0.5D); if (pvp) { - user.sendMessage("protection.flags.PVP_OVERWORLD.active"); + user.sendMessage("protection.flags.PVP_OVERWORLD.enabled"); user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); From f6207ababd52eb009cec5b99c6c47f6a0e2a4c62 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 9 Jul 2021 09:07:43 -0700 Subject: [PATCH 16/22] Update to Java 16 for GitHub Action building --- .github/workflows/build.yml | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9e16544..c13f2b9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,18 +14,19 @@ jobs: - uses: actions/checkout@v2 with: fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: Set up JDK 11 - uses: actions/setup-java@v1 + - name: Set up JDK 16 + uses: actions/setup-java@v2 with: - java-version: 11 + distribution: 'adopt' + java-version: '16' - name: Cache SonarCloud packages - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ~/.sonar/cache key: ${{ runner.os }}-sonar restore-keys: ${{ runner.os }}-sonar - name: Cache Maven packages - uses: actions/cache@v1 + uses: actions/cache@v2 with: path: ~/.m2 key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} From 0003c91cca87d83096f73ae20dc83d2c80adc4b2 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 16:40:13 -0700 Subject: [PATCH 17/22] Make Warps a Pladdon. --- src/main/java/world/bentobox/warps/WarpsPladdon.java | 12 ++++++++++++ src/main/resources/plugin.yml | 8 ++++++++ 2 files changed, 20 insertions(+) create mode 100644 src/main/java/world/bentobox/warps/WarpsPladdon.java create mode 100644 src/main/resources/plugin.yml diff --git a/src/main/java/world/bentobox/warps/WarpsPladdon.java b/src/main/java/world/bentobox/warps/WarpsPladdon.java new file mode 100644 index 0000000..d27866a --- /dev/null +++ b/src/main/java/world/bentobox/warps/WarpsPladdon.java @@ -0,0 +1,12 @@ +package world.bentobox.warps; + +import world.bentobox.bentobox.api.addons.Addon; +import world.bentobox.bentobox.api.addons.Pladdon; + +public class WarpsPladdon extends Pladdon { + + @Override + public Addon getAddon() { + return new Warp(); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..8e0bfec --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,8 @@ +name: Warps +main: world.bentobox.warps.WarpsPladdon +version: ${version} +api-version: 1.17 +description: A Warp Pladdon for BentoBox +author: tastybento +depend: + - BentoBox From 3cd93f39dd5d565dece0b5d4cad47025dc407814 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 17:36:03 -0700 Subject: [PATCH 18/22] Objects.requireNonNull for User --- src/main/java/world/bentobox/warps/WarpSignsManager.java | 4 ++-- .../world/bentobox/warps/listeners/WarpSignsListener.java | 8 +++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 17c9268..3eeba4e 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -322,7 +322,7 @@ public class WarpSignsManager { if (!prefix.isEmpty()) { icon = Material.matchMaterial( - this.getPermissionValue(User.getInstance(uuid), + this.getPermissionValue(Objects.requireNonNull(User.getInstance(uuid)), prefix + "island.warp", this.addon.getSettings().getIcon())); } @@ -352,7 +352,7 @@ public class WarpSignsManager { final Location actualWarp = new Location(inFront.getWorld(), inFront.getBlockX() + 0.5D, inFront.getBlockY(), inFront.getBlockZ() + 0.5D, yaw, 30F); Util.teleportAsync(user.getPlayer(), actualWarp, TeleportCause.COMMAND); - User warpOwner = User.getInstance(signOwner); + User warpOwner = Objects.requireNonNull(User.getInstance(signOwner)); // Hide invisible players if (warpOwner.isOnline() && !warpOwner.getPlayer().canSee(user.getPlayer())) { return; diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index e0800f6..6eddf0a 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -3,6 +3,7 @@ package world.bentobox.warps.listeners; import java.util.HashMap; import java.util.Iterator; import java.util.Map; +import java.util.Objects; import java.util.UUID; import org.bukkit.Bukkit; @@ -84,14 +85,14 @@ public class WarpSignsListener implements Listener { public void onPlayerLeave(TeamLeaveEvent e) { // Remove any warp signs from this game mode addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID()); - User.getInstance(e.getPlayerUUID()).sendMessage("warps.deactivate"); + Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage("warps.deactivate"); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerLeave(TeamKickEvent e) { // Remove any warp signs from this game mode addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID()); - User.getInstance(e.getPlayerUUID()).sendMessage("warps.deactivate"); + Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage("warps.deactivate"); } /** @@ -111,6 +112,7 @@ public class WarpSignsListener implements Listener { return; } User user = User.getInstance(e.getPlayer()); + if (user == null) return; UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(b.getLocation()).orElse(null); if (isPlayersSign(e.getPlayer(), b, inWorld)) { addon.getWarpSignsManager().removeWarp(b.getLocation()); @@ -149,7 +151,7 @@ public class WarpSignsListener implements Listener { return; } String title = e.getLine(0); - User user = User.getInstance(e.getPlayer()); + User user = Objects.requireNonNull(User.getInstance(e.getPlayer())); // Check if someone is changing their own sign if (title.equalsIgnoreCase(addon.getSettings().getWelcomeLine())) { // Welcome sign detected - check permissions From 00938e67da0fb14f4067b51a744390777c4e2a43 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 18:09:28 -0700 Subject: [PATCH 19/22] Code smell reduction. --- .../world/bentobox/warps/SignCacheItem.java | 4 +- .../bentobox/warps/SignCacheManager.java | 6 +-- src/main/java/world/bentobox/warps/Warp.java | 22 ++++------- .../bentobox/warps/WarpPanelManager.java | 14 +++---- .../bentobox/warps/WarpSignsManager.java | 38 +++++++++---------- .../bentobox/warps/commands/WarpCommand.java | 2 +- .../bentobox/warps/commands/WarpsCommand.java | 2 +- .../bentobox/warps/event/WarpCreateEvent.java | 8 ++-- .../warps/event/WarpInitiateEvent.java | 2 +- .../bentobox/warps/event/WarpListEvent.java | 2 +- .../warps/listeners/WarpSignsListener.java | 19 +++++----- .../bentobox/warps/objects/WarpsData.java | 2 +- src/main/resources/config.yml | 4 +- .../bentobox/warps/WarpPanelManagerTest.java | 14 ++----- .../bentobox/warps/WarpSignsManagerTest.java | 27 +++++-------- .../warps/commands/WarpCommandTest.java | 6 +-- .../warps/commands/WarpsCommandTest.java | 3 +- .../listeners/WarpSignsListenerTest.java | 5 +-- 18 files changed, 75 insertions(+), 105 deletions(-) diff --git a/src/main/java/world/bentobox/warps/SignCacheItem.java b/src/main/java/world/bentobox/warps/SignCacheItem.java index 48e9056..1d0df5f 100644 --- a/src/main/java/world/bentobox/warps/SignCacheItem.java +++ b/src/main/java/world/bentobox/warps/SignCacheItem.java @@ -18,8 +18,8 @@ public class SignCacheItem { @Expose private final Material type; /** - * @param signText - * @param type + * @param signText sign text + * @param type material of sign */ public SignCacheItem(List signText, Material type) { this.signText = signText; diff --git a/src/main/java/world/bentobox/warps/SignCacheManager.java b/src/main/java/world/bentobox/warps/SignCacheManager.java index 49e73db..5c7a03e 100644 --- a/src/main/java/world/bentobox/warps/SignCacheManager.java +++ b/src/main/java/world/bentobox/warps/SignCacheManager.java @@ -13,10 +13,10 @@ import world.bentobox.bentobox.database.Database; import world.bentobox.warps.objects.SignCache; public class SignCacheManager { - private Map> cachedSigns = new HashMap<>(); - private Warp addon; + private final Map> cachedSigns = new HashMap<>(); + private final Warp addon; // Database handler for level data - private Database handler; + private final Database handler; public SignCacheManager(Warp addon) { this.addon = addon; diff --git a/src/main/java/world/bentobox/warps/Warp.java b/src/main/java/world/bentobox/warps/Warp.java index 565c661..5bd6f6f 100644 --- a/src/main/java/world/bentobox/warps/Warp.java +++ b/src/main/java/world/bentobox/warps/Warp.java @@ -248,20 +248,14 @@ public class Warp extends Addon { return null; } } - switch(requestLabel) { - case "getSortedWarps": - return getWarpSignsManager().getSortedWarps(world); - case "getWarp": - return uuid == null ? null : getWarpSignsManager().getWarp(world, uuid); - case "getWarpMap": - return getWarpSignsManager().getWarpMap(world); - case "hasWarp": - return uuid == null ? null : getWarpSignsManager().hasWarp(world, uuid); - case "listWarps": - return getWarpSignsManager().listWarps(world); - default: - return null; - } + return switch (requestLabel) { + case "getSortedWarps" -> getWarpSignsManager().getSortedWarps(world); + case "getWarp" -> uuid == null ? null : getWarpSignsManager().getWarp(world, uuid); + case "getWarpMap" -> getWarpSignsManager().getWarpMap(world); + case "hasWarp" -> uuid == null ? null : getWarpSignsManager().hasWarp(world, uuid); + case "listWarps" -> getWarpSignsManager().listWarps(world); + default -> null; + }; } diff --git a/src/main/java/world/bentobox/warps/WarpPanelManager.java b/src/main/java/world/bentobox/warps/WarpPanelManager.java index 762eaf1..2ef77ea 100644 --- a/src/main/java/world/bentobox/warps/WarpPanelManager.java +++ b/src/main/java/world/bentobox/warps/WarpPanelManager.java @@ -8,6 +8,7 @@ import java.util.concurrent.CompletableFuture; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.command.Command; import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.NonNull; @@ -19,9 +20,9 @@ import world.bentobox.bentobox.api.user.User; public class WarpPanelManager { private static final int PANEL_MAX_SIZE = 52; - private Warp addon; + private final Warp addon; // This is a cache of signs - private SignCacheManager signCacheManager; + private final SignCacheManager signCacheManager; public WarpPanelManager(Warp addon) { this.addon = addon; @@ -44,10 +45,9 @@ public class WarpPanelManager { private boolean hander(World world, User clicker, UUID warpOwner) { clicker.closeInventory(); - String playerCommand = addon.getPlugin().getIWM().getAddon(world).map(gm -> gm.getPlayerCommand().map(c -> c.getLabel()).orElse("")).orElse(""); + String playerCommand = addon.getPlugin().getIWM().getAddon(world).map(gm -> gm.getPlayerCommand().map(Command::getLabel).orElse("")).orElse(""); String command = addon.getSettings().getWarpCommand() + " " + addon.getPlayers().getName(warpOwner); clicker.getPlayer().performCommand((playerCommand.isEmpty() ? "" : playerCommand + " ") + command); - //addon.getWarpSignsManager().warpPlayer(world, clicker, warpOwner); return true; } @@ -70,7 +70,7 @@ public class WarpPanelManager { .user(user) .name(user.getTranslation("warps.title") + " " + (index + 1)); - buildPanel(panelBuilder, user, index, world).thenRun(() -> panelBuilder.build()); + buildPanel(panelBuilder, user, index, world).thenRun(panelBuilder::build); } CompletableFuture buildPanel(PanelBuilder panelBuilder, User user, int index, World world) { @@ -102,13 +102,11 @@ public class WarpPanelManager { }); } - private boolean getRandomWarp(List warps) { + private void getRandomWarp(List warps) { // Add random warp if (!warps.isEmpty() && addon.getSettings().isRandomAllowed()) { warps.add(0, warps.get(new Random().nextInt(warps.size()))); - return true; } - return false; } int buildMainBody(PanelBuilder panelBuilder, User user, int index, World world, List warps) { diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 3eeba4e..9164886 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -49,13 +49,13 @@ import world.bentobox.warps.objects.WarpsData; public class WarpSignsManager { private static final int MAX_WARPS = 600; private static final String WARPS = "warps"; - private BentoBox plugin; + private final BentoBox plugin; // Map of all warps stored as player, warp sign Location private Map> worldsWarpList; // Database handler for level data - private Database handler; + private final Database handler; - private Warp addon; + private final Warp addon; private WarpsData warpsData = new WarpsData(); /** @@ -155,8 +155,7 @@ public class WarpSignsManager { getWarpMap(world).values().removeIf(Objects::isNull); // Bigger value of time means a more recent login TreeMap map = new TreeMap<>(); - getWarpMap(world).entrySet().forEach(en -> { - UUID uuid = en.getKey(); + getWarpMap(world).forEach((uuid, value) -> { // If never played, will be zero long lastPlayed = addon.getServer().getOfflinePlayer(uuid).getLastPlayed(); // This aims to avoid the chance that players logged off at exactly the same time @@ -185,7 +184,7 @@ public class WarpSignsManager { public Set listWarps(@NonNull World world) { // Remove any null locations getWarpMap(world).values().removeIf(Objects::isNull); - return getWarpMap(world).entrySet().stream().filter(e -> Util.sameWorld(world, e.getValue().getWorld())).map(Map.Entry::getKey).collect(Collectors.toSet()); + return getWarpMap(world).entrySet().stream().filter(e -> Util.sameWorld(world, Objects.requireNonNull(e.getValue().getWorld()))).map(Map.Entry::getKey).collect(Collectors.toSet()); } /** @@ -217,7 +216,7 @@ public class WarpSignsManager { /** * Changes the sign to red if it exists - * @param loc + * @param loc location to pop */ private void popSign(Location loc) { Block b = loc.getBlock(); @@ -233,7 +232,7 @@ public class WarpSignsManager { /** * Removes a warp at a location. * - * @param loc + * @param loc location to remove */ public void removeWarp(Location loc) { popSign(loc); @@ -258,7 +257,7 @@ public class WarpSignsManager { /** * Remove warp sign owned by UUID * - * @param uuid + * @param uuid UUID of owner to remove */ public void removeWarp(World world, UUID uuid) { if (getWarpMap(world).containsKey(uuid)) { @@ -297,14 +296,13 @@ public class WarpSignsManager { */ @NonNull public SignCacheItem getSignInfo(@NonNull World world, @NonNull UUID uuid) { - List result = new ArrayList<>(); //get the sign info Location signLocation = getWarp(world, uuid); if (signLocation == null || !signLocation.getBlock().getType().name().contains("SIGN")) { return new SignCacheItem(); } Sign sign = (Sign)signLocation.getBlock().getState(); - result.addAll(Arrays.asList(sign.getLines())); + List result = new ArrayList<>(Arrays.asList(sign.getLines())); // Clean up - remove the [WELCOME] line result.remove(0); // Remove any trailing blank lines @@ -359,9 +357,9 @@ public class WarpSignsManager { } if (pvp) { user.sendMessage("protection.flags.PVP_OVERWORLD.enabled"); - user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); + user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { - user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); + user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); } if (!warpOwner.equals(user)) { warpOwner.sendMessage("warps.player-warped", "[name]", user.getName()); @@ -396,7 +394,7 @@ public class WarpSignsManager { boolean pvp = false; if (island != null) { // Check for PVP - switch (warpSpot.getWorld().getEnvironment()) { + switch (Objects.requireNonNull(warpSpot.getWorld()).getEnvironment()) { case NETHER: pvp = island.isAllowed(Flags.PVP_NETHER); break; @@ -447,9 +445,9 @@ public class WarpSignsManager { warpSpot.getBlockZ() + 0.5D); if (pvp) { user.sendMessage("protection.flags.PVP_OVERWORLD.enabled"); - user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); + user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { - user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); + user.getWorld().playSound(Objects.requireNonNull(user.getLocation()), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); } Util.teleportAsync(user.getPlayer(), actualWarp, TeleportCause.COMMAND); } @@ -489,10 +487,10 @@ public class WarpSignsManager { String permPrefix = permissionPrefix + "."; - List permissions = user.getEffectivePermissions().stream(). - map(PermissionAttachmentInfo::getPermission). - filter(permission -> permission.startsWith(permPrefix)). - collect(Collectors.toList()); + List permissions = user.getEffectivePermissions().stream() + .map(PermissionAttachmentInfo::getPermission) + .filter(permission -> permission.startsWith(permPrefix)) + .toList(); for (String permission : permissions) { diff --git a/src/main/java/world/bentobox/warps/commands/WarpCommand.java b/src/main/java/world/bentobox/warps/commands/WarpCommand.java index d593192..92a9bc0 100644 --- a/src/main/java/world/bentobox/warps/commands/WarpCommand.java +++ b/src/main/java/world/bentobox/warps/commands/WarpCommand.java @@ -20,7 +20,7 @@ import world.bentobox.warps.Warp; */ public class WarpCommand extends DelayedTeleportCommand { - private Warp addon; + private final Warp addon; public WarpCommand(Warp addon, CompositeCommand bsbIslandCmd) { super(bsbIslandCmd, addon.getSettings().getWarpCommand()); diff --git a/src/main/java/world/bentobox/warps/commands/WarpsCommand.java b/src/main/java/world/bentobox/warps/commands/WarpsCommand.java index da01090..ca9f2d8 100644 --- a/src/main/java/world/bentobox/warps/commands/WarpsCommand.java +++ b/src/main/java/world/bentobox/warps/commands/WarpsCommand.java @@ -15,7 +15,7 @@ import world.bentobox.warps.Warp; */ public class WarpsCommand extends CompositeCommand { - private Warp addon; + private final Warp addon; public WarpsCommand(Warp addon, CompositeCommand bsbIslandCmd) { super(bsbIslandCmd, addon.getSettings().getWarpsCommand()); diff --git a/src/main/java/world/bentobox/warps/event/WarpCreateEvent.java b/src/main/java/world/bentobox/warps/event/WarpCreateEvent.java index cdf7b81..d9430b9 100644 --- a/src/main/java/world/bentobox/warps/event/WarpCreateEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpCreateEvent.java @@ -18,13 +18,13 @@ import world.bentobox.warps.Warp; public class WarpCreateEvent extends Event{ private static final HandlerList handlers = new HandlerList(); - private Location warpLoc; - private UUID creator; + private final Location warpLoc; + private final UUID creator; /** * @param plugin - BSkyBlock plugin objects - * @param warpLoc - * @param creator + * @param warpLoc warp location + * @param creator UUID of creator */ public WarpCreateEvent(Warp plugin, Location warpLoc, UUID creator){ this.warpLoc = warpLoc; diff --git a/src/main/java/world/bentobox/warps/event/WarpInitiateEvent.java b/src/main/java/world/bentobox/warps/event/WarpInitiateEvent.java index 1e50a3b..31e99b1 100644 --- a/src/main/java/world/bentobox/warps/event/WarpInitiateEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpInitiateEvent.java @@ -40,7 +40,7 @@ public class WarpInitiateEvent extends Event implements Cancellable { /** * Set a different location to where the player will go - * @param warpLoc + * @param warpLoc warp location */ public void setWarpLoc(Location warpLoc) { this.warpLoc = warpLoc; diff --git a/src/main/java/world/bentobox/warps/event/WarpListEvent.java b/src/main/java/world/bentobox/warps/event/WarpListEvent.java index 8384034..bc099f1 100644 --- a/src/main/java/world/bentobox/warps/event/WarpListEvent.java +++ b/src/main/java/world/bentobox/warps/event/WarpListEvent.java @@ -24,7 +24,7 @@ public class WarpListEvent extends Event { /** * @param plugin - BSkyBlock plugin objects - * @param warps + * @param warps list of warp UUIDs */ public WarpListEvent(Warp plugin, List warps) { this.warps = warps; diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index 6eddf0a..37b461b 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -40,9 +40,9 @@ import world.bentobox.warps.event.WarpRemoveEvent; */ public class WarpSignsListener implements Listener { - private BentoBox plugin; + private final BentoBox plugin; - private Warp addon; + private final Warp addon; /** * @param addon - addon @@ -153,7 +153,7 @@ public class WarpSignsListener implements Listener { String title = e.getLine(0); User user = Objects.requireNonNull(User.getInstance(e.getPlayer())); // Check if someone is changing their own sign - if (title.equalsIgnoreCase(addon.getSettings().getWelcomeLine())) { + if (title != null && title.equalsIgnoreCase(addon.getSettings().getWelcomeLine())) { // Welcome sign detected - check permissions if (noPerms(user, b.getWorld(), inWorld)) { return; @@ -164,11 +164,7 @@ public class WarpSignsListener implements Listener { } // Check if the player already has a sign final Location oldSignLoc = addon.getWarpSignsManager().getWarp(b.getWorld(), user.getUniqueId()); - if (oldSignLoc == null) { - // First time the sign has been placed or this is a new - // sign - addSign(e, user, b); - } else { + if (oldSignLoc != null) { // A sign already exists. Check if it still there and if // so, // deactivate it @@ -188,8 +184,8 @@ public class WarpSignsListener implements Listener { } } // Set up the new warp sign - addSign(e, user, b); } + addSign(e, user, b); } } @@ -235,7 +231,10 @@ public class WarpSignsListener implements Listener { user.sendMessage("warps.success"); e.setLine(0, ChatColor.GREEN + addon.getSettings().getWelcomeLine()); for (int i = 1; i<4; i++) { - e.setLine(i, ChatColor.translateAlternateColorCodes('&', e.getLine(i))); + String line = e.getLine(i); + if (line != null) { + e.setLine(i, ChatColor.translateAlternateColorCodes('&', line)); + } } Map keyValues = new HashMap<>(); diff --git a/src/main/java/world/bentobox/warps/objects/WarpsData.java b/src/main/java/world/bentobox/warps/objects/WarpsData.java index 1b6dd9f..a09f22d 100644 --- a/src/main/java/world/bentobox/warps/objects/WarpsData.java +++ b/src/main/java/world/bentobox/warps/objects/WarpsData.java @@ -46,7 +46,7 @@ public class WarpsData implements DataObject { /** * Puts all the data from the map into this objects ready for saving - * @param worldsWarpList + * @param worldsWarpList 2D map of warp locations by world vs UUID * @return this class filled with data */ public WarpsData save(Map> worldsWarpList) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index a723f46..3a8818b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -26,11 +26,11 @@ disabled-gamemodes: [] # # Warp panel name formatting. # Example: &c will make names red, &f is white -name-format: &f +name-format: "&f" # # Warp panel default lore formatting. # Example: &c will make lore red. &f is white -lore-format: &f +lore-format: "&f" # # Allow random teleport - adds a button to the warp panel that goes to a random warp sign random-allowed: true diff --git a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java index 0bfb057..bdd28f3 100644 --- a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java @@ -33,7 +33,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import org.powermock.api.mockito.PowerMockito; import org.powermock.core.classloader.annotations.PrepareForTest; @@ -67,7 +66,6 @@ public class WarpPanelManagerTest { private World world; @Mock private Inventory top; - private UUID uuid; @Mock private Settings settings; @Mock @@ -92,10 +90,9 @@ public class WarpPanelManagerTest { } /** - * @throws java.lang.Exception */ @Before - public void setUp() throws Exception { + public void setUp() { when(addon.getWarpSignsManager()).thenReturn(wsm); // Fill with 200 fake warps (I'm banking on them all being different, but there could be a clash) list = new ArrayList<>(); @@ -103,19 +100,14 @@ public class WarpPanelManagerTest { list.add(UUID.randomUUID()); } // One final one - uuid = UUID.randomUUID(); + UUID uuid = UUID.randomUUID(); list.add(uuid); when(wsm.getSortedWarps(any())).thenReturn(CompletableFuture.completedFuture(list)); // User and player when(user.getPlayer()).thenReturn(player); - when(user.getTranslation(any())).thenAnswer(new Answer() { - - @Override - public String answer(InvocationOnMock invocation) throws Throwable { - return invocation.getArgument(0, String.class); - }}); + when(user.getTranslation(any())).thenAnswer((Answer) invocation -> invocation.getArgument(0, String.class)); // BentoBox diff --git a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java index 59a59ea..5b84f65 100644 --- a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java @@ -13,14 +13,11 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import java.beans.IntrospectionException; -import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutionException; import java.util.logging.Logger; import org.bukkit.Bukkit; @@ -89,7 +86,7 @@ public class WarpSignsManagerTest { private Logger logger; @Mock private WarpsData load; - private UUID uuid = UUID.randomUUID(); + private final UUID uuid = UUID.randomUUID(); @Mock private Location location; @Mock @@ -129,7 +126,7 @@ public class WarpSignsManagerTest { } /** - * @throws java.lang.Exception + * @throws java.lang.Exception exception */ @Before public void setUp() throws Exception { @@ -167,6 +164,7 @@ public class WarpSignsManagerTest { when(location.getBlockX()).thenReturn(23); when(location.getBlockY()).thenReturn(24); when(location.getBlockZ()).thenReturn(25); + when(player.getLocation()).thenReturn(location); when(world.getEnvironment()).thenReturn(Environment.NORMAL); when(world.isChunkLoaded(anyInt(), anyInt())).thenReturn(true); @@ -224,10 +222,9 @@ public class WarpSignsManagerTest { } /** - * @throws java.lang.Exception */ @After - public void tearDown() throws Exception { + public void tearDown() { User.clearUsers(); } @@ -272,7 +269,7 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#getWarpMap(org.bukkit.World)}. - * @throws Exception + * @throws Exception exception */ @Test public void testGetWarpMapNullDatabaseObject() throws Exception { @@ -293,10 +290,9 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#WarpSignsManager(world.bentobox.warps.Warp, world.bentobox.bentobox.BentoBox)}. - * @throws Exception */ @Test - public void testWarpSignsManager() throws Exception { + public void testWarpSignsManager() { verify(addon).log("Loading warps..."); verify(load).getWarpSigns(); verify(block).getType(); @@ -372,11 +368,9 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#getSortedWarps(org.bukkit.World)}. - * @throws ExecutionException - * @throws InterruptedException */ @Test - public void testGetSortedWarps() throws InterruptedException, ExecutionException { + public void testGetSortedWarps() { CompletableFuture> r = new CompletableFuture<>(); assertEquals(1, wsm.processWarpMap(r, world).size()); } @@ -410,9 +404,7 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#saveWarpList()}. - * @throws IntrospectionException - * @throws InvocationTargetException - * @throws Exception + * @throws Exception general exception */ @Test public void testSaveWarpList() throws Exception { @@ -438,6 +430,7 @@ public class WarpSignsManagerTest { when(p.getUniqueId()).thenReturn(UUID.randomUUID()); when(p.getWorld()).thenReturn(world); when(p.getName()).thenReturn("tastybento"); + when(p.getLocation()).thenReturn(location); @Nullable User u = User.getInstance(p); wsm.warpPlayer(world, u, uuid); @@ -473,7 +466,7 @@ public class WarpSignsManagerTest { /** * Test method for {@link world.bentobox.warps.WarpSignsManager#loadWarpList()}. - * @throws Exception + * @throws Exception exception */ @Test public void testLoadWarpListEmptyWarpTable() throws Exception { diff --git a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java index 4a22464..4cb687e 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java @@ -53,7 +53,6 @@ public class WarpCommandTest { private static final String WELCOME_LINE = "[Welcome]"; @Mock private CompositeCommand ic; - private UUID uuid; @Mock private User user; @Mock @@ -78,10 +77,9 @@ public class WarpCommandTest { private BukkitScheduler sch; /** - * @throws java.lang.Exception */ @Before - public void setUp() throws Exception { + public void setUp() { // Set up plugin BentoBox plugin = mock(BentoBox.class); Whitebox.setInternalState(BentoBox.class, "instance", plugin); @@ -100,7 +98,7 @@ public class WarpCommandTest { when(plugin.getIWM()).thenReturn(iwm); // Player - uuid = UUID.randomUUID(); + UUID uuid = UUID.randomUUID(); when(user.getUniqueId()).thenReturn(uuid); when(user.getWorld()).thenReturn(world); diff --git a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java index 1cf8d41..731bf34 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java @@ -66,10 +66,9 @@ public class WarpsCommandTest { private WarpPanelManager wpm; /** - * @throws java.lang.Exception */ @Before - public void setUp() throws Exception { + public void setUp() { // Set up plugin BentoBox plugin = mock(BentoBox.class); Whitebox.setInternalState(BentoBox.class, "instance", plugin); diff --git a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java index 7ded115..e881477 100644 --- a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java +++ b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java @@ -73,7 +73,6 @@ public class WarpSignsListenerTest { @Mock private WarpSignsManager wsm; private PluginManager pm; - private UUID uuid; private String[] lines; @Mock private FileConfiguration config; @@ -85,7 +84,7 @@ public class WarpSignsListenerTest { private IslandWorldManager iwm; @Before - public void setUp() throws Exception { + public void setUp() { // Bukkit PowerMockito.mockStatic(Bukkit.class); pm = mock(PluginManager.class); @@ -114,7 +113,7 @@ public class WarpSignsListenerTest { when(block.getWorld()).thenReturn(world); // Player when(player.hasPermission(anyString())).thenReturn(false); - uuid = UUID.randomUUID(); + UUID uuid = UUID.randomUUID(); when(player.getUniqueId()).thenReturn(uuid); s = mock(Sign.class); when(s.getLine(Mockito.anyInt())).thenReturn(ChatColor.GREEN + "[WELCOME]"); From 6c4c42ff64f1a8f566b35391b13161df116b433e Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 18:19:55 -0700 Subject: [PATCH 20/22] Clean up tests. --- .../world/bentobox/warps/WarpPanelManagerTest.java | 10 +++++----- .../world/bentobox/warps/WarpSignsManagerTest.java | 10 +++++----- .../bentobox/warps/commands/WarpCommandTest.java | 14 +++++--------- .../bentobox/warps/commands/WarpsCommandTest.java | 10 +++++----- .../warps/listeners/WarpSignsListenerTest.java | 11 ++++++----- 5 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java index bdd28f3..c19cba6 100644 --- a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java @@ -219,7 +219,7 @@ public class WarpPanelManagerTest { PanelBuilder pb = mock(PanelBuilder.class); wpm.addNavigation(pb, user, world, 60, 2, 20); verify(pb).item(any()); - verify(user).getTranslation(eq("warps.previous")); + verify(user).getTranslation("warps.previous"); } /** @@ -230,8 +230,8 @@ public class WarpPanelManagerTest { PanelBuilder pb = mock(PanelBuilder.class); wpm.addNavigation(pb, user, world, 60, 2, 100); verify(pb, times(2)).item(any()); - verify(user).getTranslation(eq("warps.previous")); - verify(user).getTranslation(eq("warps.next")); + verify(user).getTranslation("warps.previous"); + verify(user).getTranslation("warps.next"); } @@ -241,9 +241,9 @@ public class WarpPanelManagerTest { int r = wpm.buildMainBody(pb, user, page, world, list); verify(pb, times(j)).item(any()); if (random && page <= 0) { - verify(user).getTranslation(eq("warps.random")); + verify(user).getTranslation("warps.random"); } else { - verify(user, never()).getTranslation(eq("warps.random")); + verify(user, never()).getTranslation("warps.random"); } return r; } diff --git a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java index 5b84f65..bbb8efc 100644 --- a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java @@ -183,7 +183,7 @@ public class WarpSignsManagerTest { when(block.getRelative(any())).thenReturn(block); // Handler - when(handler.objectExists(eq("warps"))).thenReturn(true); + when(handler.objectExists("warps")).thenReturn(true); Map warpMap = Collections.singletonMap(location, uuid); when(load.getWarpSigns()).thenReturn(warpMap); when(handler.loadObject(anyString())).thenReturn(load); @@ -200,7 +200,7 @@ public class WarpSignsManagerTest { // Players Manager when(plugin.getPlayers()).thenReturn(pm); - when(pm.getName(eq(uuid))).thenReturn("tastybento"); + when(pm.getName(uuid)).thenReturn("tastybento"); // Offline player when(server.getOfflinePlayer(any(UUID.class))).thenReturn(offlinePlayer); @@ -283,7 +283,7 @@ public class WarpSignsManagerTest { */ @Test public void testGetWarpMapNothingInDatabase() { - when(handler.objectExists(eq("warps"))).thenReturn(false); + when(handler.objectExists("warps")).thenReturn(false); wsm = new WarpSignsManager(addon, plugin); assertTrue("Map is not empty", wsm.getWarpMap(world).isEmpty()); } @@ -460,7 +460,7 @@ public class WarpSignsManagerTest { // Save wsm.saveWarpList(); // Default load in constructor check - verify(addon, times(2)).log(eq("Loading warps...")); + verify(addon, times(2)).log("Loading warps..."); assertTrue(wsm.getWarpMap(world).isEmpty()); } @@ -476,7 +476,7 @@ public class WarpSignsManagerTest { // Save wsm.saveWarpList(); // Default load in constructor check - verify(addon, times(2)).log(eq("Loading warps...")); + verify(addon, times(2)).log("Loading warps..."); assertTrue(wsm.getWarpMap(world).isEmpty()); } } diff --git a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java index 4cb687e..6bcb486 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java @@ -114,7 +114,7 @@ public class WarpCommandTest { set.add(UUID.randomUUID()); set.add(UUID.randomUUID()); set.add(UUID.randomUUID()); - when(wsm.listWarps(eq(world))).thenReturn(set); + when(wsm.listWarps(world)).thenReturn(set); // Players Manager when(plugin.getPlayers()).thenReturn(pm); @@ -179,7 +179,7 @@ public class WarpCommandTest { public void testExecuteUserStringListOfStringNoArgs() { warpCommandWarpCompositeCommand(); wc.execute(user, "warp", Collections.emptyList()); - verify(user).sendMessage(eq("commands.help.header"), eq(TextVariables.LABEL), eq("BSkyBlock")); + verify(user).sendMessage("commands.help.header", TextVariables.LABEL, "BSkyBlock"); } /** @@ -189,7 +189,6 @@ public class WarpCommandTest { public void testExecuteUserStringListOfStringKnownPlayer() { warpCommandWarpCompositeCommand(); assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento"))); - //verify(wsm).warpPlayer(eq(world), eq(user), any()); } /** @@ -199,7 +198,6 @@ public class WarpCommandTest { public void testExecuteUserStringListOfStringKnownPlayerWarp() { warpCommandWarp(); assertTrue(wc.execute(user, "warp", Collections.singletonList("tastybento"))); - //verify(wsm).warpPlayer(eq(world), eq(user), any()); } /** @@ -209,7 +207,6 @@ public class WarpCommandTest { public void testExecuteUserStringListOfStringKnownPlayerMixedCase() { warpCommandWarpCompositeCommand(); assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTyBEnTo"))); - //verify(wsm).warpPlayer(eq(world), eq(user), any()); } /** @@ -220,7 +217,6 @@ public class WarpCommandTest { when(pm.getName(any())).thenReturn("tastybento"); warpCommandWarpCompositeCommand(); assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTy"))); - //verify(wsm).warpPlayer(eq(world), eq(user), any()); } @@ -231,7 +227,7 @@ public class WarpCommandTest { public void testExecuteUserStringListOfStringUnknownPlayer() { warpCommandWarpCompositeCommand(); assertFalse(wc.execute(user, "warp", Collections.singletonList("LSPVicky"))); - verify(user).sendMessage(eq("warps.error.does-not-exist")); + verify(user).sendMessage("warps.error.does-not-exist"); } /** @@ -242,8 +238,8 @@ public class WarpCommandTest { when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); warpCommandWarpCompositeCommand(); assertFalse(wc.execute(user, "warp", Collections.singletonList("LSPVicky"))); - verify(user).sendMessage(eq("warps.error.no-warps-yet")); - verify(user).sendMessage(eq("warps.warpTip"), eq("[text]"), eq(WELCOME_LINE)); + verify(user).sendMessage("warps.error.no-warps-yet"); + verify(user).sendMessage("warps.warpTip", "[text]", WELCOME_LINE); } /** diff --git a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java index 731bf34..e80c032 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java @@ -98,7 +98,7 @@ public class WarpsCommandTest { set.add(UUID.randomUUID()); set.add(UUID.randomUUID()); set.add(UUID.randomUUID()); - when(wsm.listWarps(eq(world))).thenReturn(set); + when(wsm.listWarps(world)).thenReturn(set); // Warp Panel Manager when(addon.getWarpPanelManager()).thenReturn(wpm); @@ -146,8 +146,8 @@ public class WarpsCommandTest { when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); warpCommandWarpsCompositeCommand(); assertFalse(wc.execute(user, "warps", Collections.emptyList())); - verify(user).sendMessage(eq("warps.error.no-warps-yet")); - verify(user).sendMessage(eq("warps.warpTip"), eq("[text]"), eq(WELCOME_LINE)); + verify(user).sendMessage("warps.error.no-warps-yet"); + verify(user).sendMessage("warps.warpTip", "[text]", WELCOME_LINE); } /** @@ -158,8 +158,8 @@ public class WarpsCommandTest { when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); warpCommandWarps(); assertFalse(wc.execute(user, "warps", Collections.emptyList())); - verify(user).sendMessage(eq("warps.error.no-warps-yet")); - verify(user).sendMessage(eq("warps.warpTip"), eq("[text]"), eq(WELCOME_LINE)); + verify(user).sendMessage("warps.error.no-warps-yet"); + verify(user).sendMessage("warps.warpTip", "[text]", WELCOME_LINE); } /** diff --git a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java index e881477..132fd38 100644 --- a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java +++ b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java @@ -6,6 +6,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -116,7 +117,7 @@ public class WarpSignsListenerTest { UUID uuid = UUID.randomUUID(); when(player.getUniqueId()).thenReturn(uuid); s = mock(Sign.class); - when(s.getLine(Mockito.anyInt())).thenReturn(ChatColor.GREEN + "[WELCOME]"); + when(s.getLine(anyInt())).thenReturn(ChatColor.GREEN + "[WELCOME]"); when(block.getState()).thenReturn(s); // warp signs manager when(addon.getWarpSignsManager()).thenReturn(wsm); @@ -127,7 +128,7 @@ public class WarpSignsListenerTest { when(block.getLocation()).thenReturn(location); list.put(uuid, location); // Player is in world - when(wsm.getWarpMap(Mockito.eq(world))).thenReturn(list); + when(wsm.getWarpMap(world)).thenReturn(list); //Player has a warp sign already here when(wsm.getWarp(any(), any())).thenReturn(location); // Unique spot @@ -198,7 +199,7 @@ public class WarpSignsListenerTest { when(addon.inRegisteredWorld(any())).thenReturn(false); wsl.onSignBreak(e); assertFalse(e.isCancelled()); - verify(addon).inRegisteredWorld(Mockito.eq(world)); + verify(addon).inRegisteredWorld(world); } @Test @@ -221,7 +222,7 @@ public class WarpSignsListenerTest { when(s.getLocation()).thenReturn(mock(Location.class)); wsl.onSignBreak(e); assertFalse(e.isCancelled()); - verify(wsm).getWarpMap(Mockito.eq(world)); + verify(wsm).getWarpMap(world); verify(s).getLocation(); } @@ -281,7 +282,7 @@ public class WarpSignsListenerTest { SignChangeEvent e = new SignChangeEvent(block, player, lines); when(addon.inRegisteredWorld(any())).thenReturn(false); wsl.onSignWarpCreate(e); - verify(addon).inRegisteredWorld(Mockito.eq(world)); + verify(addon).inRegisteredWorld(world); } @Test From d936fbecc11b4acbe5edc0f4d9af50b04d8572cd Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 18:28:19 -0700 Subject: [PATCH 21/22] More code cleanup --- .../java/world/bentobox/warps/commands/WarpCommand.java | 3 +-- .../world/bentobox/warps/listeners/WarpSignsListener.java | 8 +++++--- .../java/world/bentobox/warps/WarpPanelManagerTest.java | 3 +-- .../world/bentobox/warps/commands/WarpCommandTest.java | 3 +-- .../world/bentobox/warps/commands/WarpsCommandTest.java | 5 ++--- .../bentobox/warps/listeners/WarpSignsListenerTest.java | 2 +- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/main/java/world/bentobox/warps/commands/WarpCommand.java b/src/main/java/world/bentobox/warps/commands/WarpCommand.java index 92a9bc0..53af311 100644 --- a/src/main/java/world/bentobox/warps/commands/WarpCommand.java +++ b/src/main/java/world/bentobox/warps/commands/WarpCommand.java @@ -4,7 +4,6 @@ import java.util.List; import java.util.Optional; import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; import org.bukkit.World; @@ -81,7 +80,7 @@ public class WarpCommand extends DelayedTeleportCommand { @Override public Optional> tabComplete(User user, String alias, List args) { World world = getWorld() == null ? user.getWorld() : getWorld(); - return Optional.of(addon.getWarpSignsManager().listWarps(world).stream().map(getPlayers()::getName).collect(Collectors.toList())); + return Optional.of(addon.getWarpSignsManager().listWarps(world).stream().map(getPlayers()::getName).toList()); } diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index 37b461b..a581d69 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -40,6 +40,8 @@ import world.bentobox.warps.event.WarpRemoveEvent; */ public class WarpSignsListener implements Listener { + private static final String WARPS_DEACTIVATE = "warps.deactivate"; + private final BentoBox plugin; private final Warp addon; @@ -85,14 +87,14 @@ public class WarpSignsListener implements Listener { public void onPlayerLeave(TeamLeaveEvent e) { // Remove any warp signs from this game mode addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID()); - Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage("warps.deactivate"); + Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage(WARPS_DEACTIVATE); } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onPlayerLeave(TeamKickEvent e) { // Remove any warp signs from this game mode addon.getWarpSignsManager().removeWarp(e.getIsland().getWorld(), e.getPlayerUUID()); - Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage("warps.deactivate"); + Objects.requireNonNull(User.getInstance(e.getPlayerUUID())).sendMessage(WARPS_DEACTIVATE); } /** @@ -176,7 +178,7 @@ public class WarpSignsListener implements Listener { if (oldSign.getLine(0).equalsIgnoreCase(ChatColor.GREEN + addon.getSettings().getWelcomeLine())) { oldSign.setLine(0, ChatColor.RED + addon.getSettings().getWelcomeLine()); oldSign.update(true, false); - user.sendMessage("warps.deactivate"); + user.sendMessage(WARPS_DEACTIVATE); addon.getWarpSignsManager().removeWarp(oldSignBlock.getWorld(), user.getUniqueId()); @Nullable UUID owner = addon.getWarpSignsManager().getWarpOwnerUUID(oldSignLoc).orElse(null); diff --git a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java index c19cba6..d2af1f6 100644 --- a/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpPanelManagerTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; @@ -208,7 +207,7 @@ public class WarpPanelManagerTest { PanelBuilder pb = mock(PanelBuilder.class); wpm.addNavigation(pb, user, world, 0, 0, 100); verify(pb).item(any()); - verify(user).getTranslation(eq("warps.next")); + verify(user).getTranslation("warps.next"); } /** diff --git a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java index 6bcb486..fb57795 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -235,7 +234,7 @@ public class WarpCommandTest { */ @Test public void testExecuteUserStringListOfStringNoWarpsYet() { - when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); + when(wsm.listWarps(world)).thenReturn(Collections.emptySet()); warpCommandWarpCompositeCommand(); assertFalse(wc.execute(user, "warp", Collections.singletonList("LSPVicky"))); verify(user).sendMessage("warps.error.no-warps-yet"); diff --git a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java index e80c032..ff12698 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpsCommandTest.java @@ -3,7 +3,6 @@ package world.bentobox.warps.commands; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -143,7 +142,7 @@ public class WarpsCommandTest { */ @Test public void testExecuteUserStringListOfStringNoWarpsYet() { - when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); + when(wsm.listWarps(world)).thenReturn(Collections.emptySet()); warpCommandWarpsCompositeCommand(); assertFalse(wc.execute(user, "warps", Collections.emptyList())); verify(user).sendMessage("warps.error.no-warps-yet"); @@ -155,7 +154,7 @@ public class WarpsCommandTest { */ @Test public void testExecuteUserStringListOfStringNoWarpsYetNoAddon() { - when(wsm.listWarps(eq(world))).thenReturn(Collections.emptySet()); + when(wsm.listWarps(world)).thenReturn(Collections.emptySet()); warpCommandWarps(); assertFalse(wc.execute(user, "warps", Collections.emptyList())); verify(user).sendMessage("warps.error.no-warps-yet"); diff --git a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java index 132fd38..978c3d8 100644 --- a/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java +++ b/src/test/java/world/bentobox/warps/listeners/WarpSignsListenerTest.java @@ -209,7 +209,7 @@ public class WarpSignsListenerTest { when(s.getLine(Mockito.anyInt())).thenReturn(ChatColor.RED + "[WELCOME]"); wsl.onSignBreak(e); assertFalse(e.isCancelled()); - verify(s).getLine(Mockito.eq(0)); + verify(s).getLine(0); verify(settings).getWelcomeLine(); } From 55ec1ded61e450dee57bcf67f60ff33dc7bfcb0a Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 8 Aug 2021 18:28:29 -0700 Subject: [PATCH 22/22] Remove this deprecated event. --- .../bentobox/warps/event/WarpListEvent.java | 59 ------------------- 1 file changed, 59 deletions(-) delete mode 100644 src/main/java/world/bentobox/warps/event/WarpListEvent.java diff --git a/src/main/java/world/bentobox/warps/event/WarpListEvent.java b/src/main/java/world/bentobox/warps/event/WarpListEvent.java deleted file mode 100644 index bc099f1..0000000 --- a/src/main/java/world/bentobox/warps/event/WarpListEvent.java +++ /dev/null @@ -1,59 +0,0 @@ -package world.bentobox.warps.event; - -import java.util.List; -import java.util.UUID; - -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; - -import world.bentobox.warps.Warp; - -/** - * This event is fired when request is made for a sorted list of warps or when - * the API updateWarpPanel method is called. - * A listener to this event can reorder or rewrite the warp list by using setWarps. - * This new order will then be used in the warp panel. - * - * @author tastybento - * @deprecated this event is not fired any more because the task is async - */ -@Deprecated -public class WarpListEvent extends Event { - private static final HandlerList handlers = new HandlerList(); - private List warps; - - /** - * @param plugin - BSkyBlock plugin objects - * @param warps list of warp UUIDs - */ - public WarpListEvent(Warp plugin, List warps) { - this.warps = warps; - } - - - /** - *The warp list is a collection of player UUID's and the default order is - * that players with the most recent login will be first. - * @return the warps - */ - public List getWarps() { - return warps; - } - - /** - * @param warps the warps to set - */ - public void setWarps(List warps) { - this.warps = warps; - } - - - @Override - public HandlerList getHandlers() { - return handlers; - } - - public static HandlerList getHandlerList() { - return handlers; - } -}