From 95e3eab883f127fefc6587abcf14e778d0df4910 Mon Sep 17 00:00:00 2001 From: Esophose Date: Sat, 25 May 2019 23:55:07 -0600 Subject: [PATCH] Misc island permission bug fixes, portal event bug fix --- .../goodandevil/skyblock/island/Island.java | 8 --- .../skyblock/island/IslandManager.java | 6 +- .../goodandevil/skyblock/listeners/Block.java | 62 ++++++++----------- .../skyblock/listeners/Entity.java | 14 +++-- .../skyblock/listeners/Interact.java | 8 ++- 5 files changed, 46 insertions(+), 52 deletions(-) diff --git a/src/main/java/me/goodandevil/skyblock/island/Island.java b/src/main/java/me/goodandevil/skyblock/island/Island.java index a1759b8c..2d172f74 100644 --- a/src/main/java/me/goodandevil/skyblock/island/Island.java +++ b/src/main/java/me/goodandevil/skyblock/island/Island.java @@ -824,14 +824,6 @@ public class Island { return unlocked; } - public boolean isLocationWithinIsland(IslandWorld world, Location location) { - Location islandLocation = this.getLocation(world, IslandEnvironment.Island).clone().add(0.5, 0, 0.5); - double size = this.getRadius(); - size += size % 2 == 0 ? 1 : 0; - - return LocationUtil.isLocationAtLocationRadius(location, islandLocation, size); - } - public me.goodandevil.skyblock.api.island.Island getAPIWrapper() { return apiWrapper; } diff --git a/src/main/java/me/goodandevil/skyblock/island/IslandManager.java b/src/main/java/me/goodandevil/skyblock/island/IslandManager.java index f6ad7723..dfb3da93 100644 --- a/src/main/java/me/goodandevil/skyblock/island/IslandManager.java +++ b/src/main/java/me/goodandevil/skyblock/island/IslandManager.java @@ -1342,6 +1342,10 @@ public class IslandManager { } public boolean isLocationAtIsland(Island island, org.bukkit.Location location, IslandWorld world) { - return LocationUtil.isLocationAtLocationRadius(location, island.getLocation(world, IslandEnvironment.Island), island.getRadius()); + Location islandLocation = island.getLocation(world, IslandEnvironment.Island).clone().add(0.5, 0, 0.5); + double size = island.getRadius(); + size += size % 2 == 0 ? 1 : 0; + + return LocationUtil.isLocationAtLocationRadius(location, islandLocation, size); } } diff --git a/src/main/java/me/goodandevil/skyblock/listeners/Block.java b/src/main/java/me/goodandevil/skyblock/listeners/Block.java index edeefe2b..b9be762b 100644 --- a/src/main/java/me/goodandevil/skyblock/listeners/Block.java +++ b/src/main/java/me/goodandevil/skyblock/listeners/Block.java @@ -17,6 +17,7 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.BlockFace; +import org.bukkit.block.BlockState; import org.bukkit.block.CreatureSpawner; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.EntityType; @@ -187,7 +188,7 @@ public class Block implements Listener { FileConfiguration configLoad = config.getFileConfiguration(); if (configLoad.getBoolean("Island.WorldBorder.Block") && block.getType() == Material.DISPENSER) { - if (!island.isLocationWithinIsland(world, block.getLocation())) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { event.setCancelled(true); } } @@ -268,7 +269,7 @@ public class Block implements Listener { org.bukkit.block.Block block = event.getToBlock(); // Protect outside of border - if (!island.isLocationWithinIsland(world, block.getLocation())) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { event.setCancelled(true); return; } @@ -291,7 +292,7 @@ public class Block implements Listener { island.hasRole(IslandRole.Member, p.getUniqueId()) || island.hasRole(IslandRole.Coop, p.getUniqueId()) || island.hasRole(IslandRole.Operator, p.getUniqueId()); - if (isMember && island.isLocationWithinIsland(world, p.getLocation())) { + if (isMember && islandManager.isLocationAtIsland(island, p.getLocation(), world)) { possiblePlayers.add(p); } } @@ -334,7 +335,7 @@ public class Block implements Listener { FileConfiguration configLoad = config.getFileConfiguration(); for (org.bukkit.block.Block block : event.getBlocks()) { - if (!island.isLocationWithinIsland(world, block.getLocation())) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { event.setCancelled(true); return; } @@ -390,7 +391,7 @@ public class Block implements Listener { FileConfiguration configLoad = config.getFileConfiguration(); for (org.bukkit.block.Block block : event.getBlocks()) { - if (!island.isLocationWithinIsland(world, block.getLocation())) { + if (!islandManager.isLocationAtIsland(island, block.getLocation(), world)) { event.setCancelled(true); return; } @@ -466,7 +467,7 @@ public class Block implements Listener { island.hasRole(IslandRole.Member, player.getUniqueId()) || island.hasRole(IslandRole.Coop, player.getUniqueId()) || island.hasRole(IslandRole.Operator, player.getUniqueId()); - if (isMember && island.isLocationWithinIsland(world, player.getLocation())) { + if (isMember && islandManager.isLocationAtIsland(island, player.getLocation(), world)) { possiblePlayers.add(player); } } @@ -639,37 +640,26 @@ public class Block implements Listener { IslandWorld world = worldManager.getIslandWorld(event.getBlocks().get(0).getWorld()); Location islandLocation = island.getLocation(world, IslandEnvironment.Main); - for (org.bukkit.block.Block block : event.getBlocks()) { - if (LocationUtil.isLocationAffectingLocation(block.getLocation(), islandLocation)) { - event.setCancelled(true); - return; + // PortalCreateEvent.getBlocks() changed from ArrayList to ArrayList in 1.14.1... why... + if (NMSUtil.getVersionNumber() > 13) { + for (BlockState block : event.getBlocks()) { + if (LocationUtil.isLocationAffectingLocation(block.getLocation(), islandLocation)) { + event.setCancelled(true); + return; + } } - } - } - - @EventHandler - public void onEntityCreatePortal(EntityCreatePortalEvent event) { - WorldManager worldManager = skyblock.getWorldManager(); - IslandManager islandManager = skyblock.getIslandManager(); - - if (!skyblock.getFileManager().getConfig(new File(skyblock.getDataFolder(), "config.yml")).getFileConfiguration().getBoolean("Island.Spawn.Protection")) - return; - - if (event.getBlocks().isEmpty()) - return; - - Island island = islandManager.getIslandAtLocation(event.getBlocks().get(0).getLocation()); - if (island == null) - return; - - // Check spawn block protection - IslandWorld world = worldManager.getIslandWorld(event.getBlocks().get(0).getWorld()); - Location islandLocation = island.getLocation(world, IslandEnvironment.Main); - - for (org.bukkit.block.BlockState block : event.getBlocks()) { - if (LocationUtil.isLocationAffectingLocation(block.getLocation(), islandLocation)) { - event.setCancelled(true); - return; + } else { + try { + @SuppressWarnings("unchecked") + ArrayList blocks = (ArrayList) event.getClass().getMethod("getBlocks").invoke(event); + for (org.bukkit.block.Block block : blocks) { + if (LocationUtil.isLocationAffectingLocation(block.getLocation(), islandLocation)) { + event.setCancelled(true); + return; + } + } + } catch (ReflectiveOperationException ex) { + ex.printStackTrace(); } } } diff --git a/src/main/java/me/goodandevil/skyblock/listeners/Entity.java b/src/main/java/me/goodandevil/skyblock/listeners/Entity.java index 270f0d19..f63d9aa2 100644 --- a/src/main/java/me/goodandevil/skyblock/listeners/Entity.java +++ b/src/main/java/me/goodandevil/skyblock/listeners/Entity.java @@ -100,8 +100,8 @@ public class Entity implements Listener { event.setCancelled(true); } } - - // Fix a bug in spigot where arrows with flame still apply flame even if the event is cancelled + + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged if (preventFireTicks.contains(player.getUniqueId()) && event.getCause() == DamageCause.FIRE_TICK) { player.setFireTicks(0); event.setCancelled(true); @@ -157,8 +157,7 @@ public class Entity implements Listener { return; } - if (event.getDamager() instanceof Projectile - && ((Projectile) event.getDamager()).getShooter() instanceof Player) { + if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player) { Player player = (Player) ((Projectile) event.getDamager()).getShooter(); org.bukkit.entity.Entity entity = event.getEntity(); @@ -167,6 +166,11 @@ public class Entity implements Listener { Config config = fileManager.getConfig(new File(skyblock.getDataFolder(), "config.yml")); FileConfiguration configLoad = config.getFileConfiguration(); + if (entity.getType() == EntityType.ITEM_FRAME && !islandManager.hasPermission(player, entity.getLocation(), "HangingDestroy")) { + event.setCancelled(true); + return; + } + if (configLoad.getBoolean("Island.Settings.PvP.Enable")) { if (!islandManager.hasSetting(entity.getLocation(), IslandRole.Owner, "PvP")) { event.setCancelled(true); @@ -214,7 +218,7 @@ public class Entity implements Listener { } } - // Fix a bug in spigot where arrows with flame still apply flame even if the event is cancelled + // Fix a bug in minecraft where arrows with flame still apply fire ticks even if the shot entity isn't damaged if (event.isCancelled() && event.getEntity() != null && event.getDamager() instanceof Arrow && ((Arrow)event.getDamager()).getShooter() instanceof Player) { Arrow arrow = (Arrow) event.getDamager(); if (arrow.getFireTicks() != 0) { diff --git a/src/main/java/me/goodandevil/skyblock/listeners/Interact.java b/src/main/java/me/goodandevil/skyblock/listeners/Interact.java index bc3cd4d3..d204c252 100644 --- a/src/main/java/me/goodandevil/skyblock/listeners/Interact.java +++ b/src/main/java/me/goodandevil/skyblock/listeners/Interact.java @@ -258,7 +258,8 @@ public class Interact implements Listener { || block.getType() == Materials.BIRCH_BUTTON.parseMaterial() || block.getType() == Materials.JUNGLE_BUTTON.parseMaterial() || block.getType() == Materials.ACACIA_BUTTON.parseMaterial() - || block.getType() == Materials.DARK_OAK_BUTTON.parseMaterial()) { + || block.getType() == Materials.DARK_OAK_BUTTON.parseMaterial() + || block.getType() == Materials.LEVER.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "LeverButton")) { event.setCancelled(true); @@ -468,6 +469,7 @@ public class Interact implements Listener { } } } else if (event.getAction() == Action.LEFT_CLICK_BLOCK) { + // Note: Cast is necessary as it is ambiguous without it in 1.8 if (player.getTargetBlock((Set) null, 5).getType() == Material.FIRE) { if (!islandManager.hasPermission(player, block.getLocation(), "Fire")) { event.setCancelled(true); @@ -479,7 +481,9 @@ public class Interact implements Listener { } } } else if (event.getAction() == Action.PHYSICAL) { - if (block.getType() == Materials.FARMLAND.parseMaterial()) { + if (block.getType() == Materials.TURTLE_EGG.parseMaterial()) { + event.setCancelled(true); + } else if (block.getType() == Materials.FARMLAND.parseMaterial()) { if (!islandManager.hasPermission(player, block.getLocation(), "Crop")) { event.setCancelled(true);