diff --git a/pom.xml b/pom.xml index 3df88bd..30aa0d5 100644 --- a/pom.xml +++ b/pom.xml @@ -58,15 +58,15 @@ 2.0.2 - 1.16.1-R0.1-SNAPSHOT - 1.14.0 + 1.16.3-R0.1-SNAPSHOT + 1.15.4 1.5.0 ${build.version}-SNAPSHOT -LOCAL - 1.10.1 + 1.10.2 diff --git a/src/main/java/world/bentobox/warps/WarpSignsManager.java b/src/main/java/world/bentobox/warps/WarpSignsManager.java index 1295c24..87ddae1 100644 --- a/src/main/java/world/bentobox/warps/WarpSignsManager.java +++ b/src/main/java/world/bentobox/warps/WarpSignsManager.java @@ -186,7 +186,12 @@ public class WarpSignsManager { // Load into map if (warpsData != null) { warpsData.getWarpSigns().forEach((k,v) -> { - if (k != null && k.getWorld() != null && k.getBlock().getType().name().contains("SIGN")) { + if (k != null && k.getWorld() != null) { + if (k.getWorld().isChunkLoaded(k.getBlockX() >> 4, k.getBlockZ() >> 4) + && !k.getBlock().getType().name().contains("SIGN")) { + return; + } + // Add to map getWarpMap(k.getWorld()).put(v, k); } @@ -327,13 +332,17 @@ 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); + // Hide invisible players + if (warpOwner.isOnline() && !warpOwner.getPlayer().canSee(user.getPlayer())) { + return; + } if (pvp) { user.sendMessage("protection.flags.PVP_OVERWORLD.active"); user.getWorld().playSound(user.getLocation(), Sound.ENTITY_ARROW_HIT, 1F, 1F); } else { user.getWorld().playSound(user.getLocation(), Sound.ENTITY_BAT_TAKEOFF, 1F, 1F); - } - User warpOwner = User.getInstance(signOwner); + } if (!warpOwner.equals(user)) { warpOwner.sendMessage("warps.player-warped", "[name]", user.getName()); } diff --git a/src/main/java/world/bentobox/warps/commands/WarpCommand.java b/src/main/java/world/bentobox/warps/commands/WarpCommand.java index be45106..d593192 100644 --- a/src/main/java/world/bentobox/warps/commands/WarpCommand.java +++ b/src/main/java/world/bentobox/warps/commands/WarpCommand.java @@ -17,7 +17,6 @@ import world.bentobox.warps.Warp; * The /is warp command * * @author tastybento - * */ public class WarpCommand extends DelayedTeleportCommand { @@ -52,12 +51,22 @@ public class WarpCommand extends DelayedTeleportCommand { user.sendMessage("warps.warpTip", "[text]", addon.getSettings().getWelcomeLine()); return false; } else { - // Check if this is part of a name - UUID foundWarp = warpList.stream().filter(u -> getPlayers().getName(u).equalsIgnoreCase(args.get(0)) - || getPlayers().getName(u).toLowerCase().startsWith(args.get(0).toLowerCase())).findFirst().orElse(null); + // Attemp to find warp with exact player's name + UUID foundWarp = warpList.stream().filter(u -> getPlayers().getName(u).equalsIgnoreCase(args.get(0))).findFirst().orElse(null); + if (foundWarp == null) { - user.sendMessage("warps.error.does-not-exist"); - return false; + + // Atempt to find warp which starts with the given name + UUID foundAlernativeWarp = warpList.stream().filter(u -> getPlayers().getName(u).toLowerCase().startsWith(args.get(0).toLowerCase())).findFirst().orElse(null); + + if (foundAlernativeWarp == null) { + user.sendMessage("warps.error.does-not-exist"); + return false; + } else { + // Alternative warp found! + this.delayCommand(user, () -> addon.getWarpSignsManager().warpPlayer(world, user, foundAlernativeWarp)); + return true; + } } else { // Warp exists! this.delayCommand(user, () -> addon.getWarpSignsManager().warpPlayer(world, user, foundWarp)); diff --git a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java index 3def898..f16f48c 100644 --- a/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java +++ b/src/main/java/world/bentobox/warps/listeners/WarpSignsListener.java @@ -1,12 +1,11 @@ package world.bentobox.warps.listeners; +import java.util.HashMap; +import java.util.Iterator; import java.util.Map; import java.util.UUID; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.World; +import org.bukkit.*; import org.bukkit.block.Block; import org.bukkit.block.Sign; import org.bukkit.entity.Player; @@ -16,9 +15,12 @@ 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 world.bentobox.bentobox.BentoBox; -import world.bentobox.bentobox.api.events.team.TeamEvent.TeamKickEvent; -import world.bentobox.bentobox.api.events.team.TeamEvent.TeamLeaveEvent; +import world.bentobox.bentobox.api.events.addon.AddonEvent; +import world.bentobox.bentobox.api.events.team.TeamKickEvent; +import world.bentobox.bentobox.api.events.team.TeamLeaveEvent; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.util.Util; import world.bentobox.warps.Warp; @@ -44,20 +46,49 @@ public class WarpSignsListener implements Listener { this.plugin = addon.getPlugin(); } + @EventHandler(priority = EventPriority.NORMAL) + public void onChunkLoad(ChunkLoadEvent event) { + // Delay to wait the chunk to be fully loaded + new BukkitRunnable() { + @Override + public void run() { + boolean changed = false; + Iterator> iterator = + addon.getWarpSignsManager().getWarpMap(event.getWorld()).entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + UUID uuid = entry.getKey(); + Location location = entry.getValue(); + if (event.getChunk().getX() == location.getBlockX() >> 4 + && event.getChunk().getZ() == location.getBlockZ() >> 4 + && !Tag.SIGNS.isTagged(location.getBlock().getType())) { + iterator.remove(); + // Remove sign from warp panel cache + addon.getWarpPanelManager().removeWarp(event.getWorld(), uuid); + changed = true; + } + } + if (changed) { + addon.getWarpSignsManager().saveWarpList(); + } + } + }.runTask(plugin); + } + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) 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"); } - + @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"); } - + /** * Checks to see if a sign has been broken * @param e - event @@ -197,6 +228,13 @@ public class WarpSignsListener implements Listener { for (int i = 1; i<4; i++) { e.setLine(i, ChatColor.translateAlternateColorCodes('&', e.getLine(i))); } + + Map keyValues = new HashMap<>(); + keyValues.put("eventName", "WarpCreateEvent"); + keyValues.put("targetPlayer", user.getUniqueId()); + keyValues.put("location", Util.getStringLocation(b.getLocation())); + + new AddonEvent().builder().addon(addon).keyValues(keyValues).build(); } // Else null player } diff --git a/src/main/resources/addon.yml b/src/main/resources/addon.yml index 4e346a4..0d3b925 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.14 +api-version: 1.15.4 authors: tastybento diff --git a/src/main/resources/locales/tr.yml b/src/main/resources/locales/tr.yml index 7ab3f4e..5da34df 100644 --- a/src/main/resources/locales/tr.yml +++ b/src/main/resources/locales/tr.yml @@ -1,31 +1,27 @@ -########################################################################################### -# 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: "Oyuncunun bölge tabelası." - parameters: -warps: +--- +warp: + help: + description: Oyuncunun bölge tabelası. + parameters: "" +warps: deactivate: "&cEski ada warpı silindi!" - error: - does-not-exist: "&4Malasef sorun oluştu. Tekrar dene." + error: + does-not-exist: "&cÜzgünüm. Böyle bir bölge artık yok!" no-permission: "&4Buna yetkin yok!" + not-safe: "&4Ada bölgesi güvenli değil!" no-remove: "&4Bu tabelayı kıramazsın!" no-warps-yet: "&4Böyle bir bölge henüz yok." not-enough-level: "&4Bunu koyman için daha fazla ada leveline ihtiyacın var." not-on-island: "&4Adanda değilsin." - not-safe: "&4Ada bölgesi güvenli değil!" your-level-is: "&9Ada levelin &e[level] &9ve &e[required]&9'den fazla olması gerek!" - help: - description: "Bölge panelini açar." - next: "&6Sonraki Sayfa" + help: + description: Bölge panelini açar. player-warped: "&d[name] &9ada bölgene ışınlandı!" - previous: "&6Önceki sayfa" sign-removed: "&4Ada tabelası kaldırıldı!" - success: "&9Başarılı!" - title: "&3&lSon&b&lCesurlar &e&lBölgeler &5" - warpTip: "&9Ada warpı açmak için tabelanın en üstüne &e[text] &9yaz!" + success: "&aBaşarılı!" + title: "&dOyuncu bölgeleri &8- &5" + warpTip: "&6Ada bölgesi açmak için tabelanın en üstüne &a[text] &9yaz!" warpToPlayersSign: "&d[player] &9bölgesine gidiliyor!" - \ No newline at end of file + next: "&6Sonraki Sayfa" + previous: "&6Önceki sayfa" + random: "&4Rastgele bölgeye git!" diff --git a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java index 0e86108..532749e 100644 --- a/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java +++ b/src/test/java/world/bentobox/warps/WarpSignsManagerTest.java @@ -20,13 +20,7 @@ import java.util.Map; import java.util.UUID; import java.util.logging.Logger; -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.*; import org.bukkit.World.Environment; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -165,7 +159,8 @@ public class WarpSignsManagerTest { when(location.getBlockY()).thenReturn(24); when(location.getBlockZ()).thenReturn(25); when(world.getEnvironment()).thenReturn(Environment.NORMAL); - + when(world.isChunkLoaded(anyInt(), anyInt())).thenReturn(true); + // Block when(block.getType()).thenReturn(Material.ACACIA_SIGN); when(block.getLocation()).thenReturn(location); diff --git a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java index 75dea30..4a22464 100644 --- a/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java +++ b/src/test/java/world/bentobox/warps/commands/WarpCommandTest.java @@ -219,6 +219,7 @@ public class WarpCommandTest { */ @Test public void testExecuteUserStringListOfStringKnownPlayerStartOnly() { + when(pm.getName(any())).thenReturn("tastybento"); warpCommandWarpCompositeCommand(); assertTrue(wc.execute(user, "warp", Collections.singletonList("tAsTy"))); //verify(wsm).warpPlayer(eq(world), eq(user), any());