From 6c2c896bfcd516d9b6b6112154f3a7b9f215fdb7 Mon Sep 17 00:00:00 2001 From: Zax71 Date: Fri, 23 Aug 2024 11:59:27 +0100 Subject: [PATCH 1/4] Refactor code and make end portal generation drop blocks --- .../listeners/MVNPEntityListener.java | 106 ++++++++++-------- .../listeners/MVNPPlayerListener.java | 24 +--- .../utils/EndPlatformCreator.java | 66 +++++++++++ 3 files changed, 127 insertions(+), 69 deletions(-) create mode 100644 src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java index 9ac0d9f..a5ee87b 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java @@ -8,6 +8,7 @@ import com.onarandombox.MultiverseCore.event.MVPlayerTouchedPortalEvent; import com.onarandombox.MultiverseCore.utils.PermissionTools; import com.onarandombox.MultiverseNetherPortals.MultiverseNetherPortals; +import com.onarandombox.MultiverseNetherPortals.utils.EndPlatformCreator; import com.onarandombox.MultiverseNetherPortals.utils.MVEventRecord; import com.onarandombox.MultiverseNetherPortals.utils.MVLinkChecker; import com.onarandombox.MultiverseNetherPortals.utils.MVNameChecker; @@ -31,7 +32,6 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; public class MVNPEntityListener implements Listener { @@ -299,14 +299,25 @@ public void onEntityPortal(EntityPortalEvent event) { return; } - Entity e = event.getEntity(); - Location originalTo = this.locationManipulation.getBlockLocation(event.getTo()); - Location currentLocation = this.locationManipulation.getBlockLocation(event.getFrom()); + // Some shortcuts for later + Entity entity = event.getEntity(); + Location toLocation = event.getTo(); + Location fromLocation = event.getFrom(); + + MultiverseWorld fromWorld = this.worldManager.getMVWorld(fromLocation.getWorld().getName()); + MultiverseWorld toWorld = this.worldManager.getMVWorld(toLocation.getWorld().getName()); + + Location originalTo = this.locationManipulation.getBlockLocation(toLocation); + Location currentLocation = this.locationManipulation.getBlockLocation(fromLocation); + + + // Don't mess with other people's stuff if (!plugin.isHandledByNetherPortals(currentLocation)) { return; } + // This is the entity event, don't teleport entities if we're not supposed to if (!this.plugin.isTeleportingEntities()) { event.setCancelled(true); return; @@ -323,18 +334,19 @@ public void onEntityPortal(EntityPortalEvent event) { return; } + // Are we allowed to use the nether portal travel agent? if (type == PortalType.NETHER) { try { Class.forName("org.bukkit.TravelAgent"); event.useTravelAgent(true); } catch (ClassNotFoundException ignore) { - Logging.fine("TravelAgent not available for EntityPortalEvent for " + e.getName()); + Logging.fine("TravelAgent not available for EntityPortalEvent for " + entity.getName()); } } String currentWorld = currentLocation.getWorld().getName(); String linkedWorld = this.plugin.getWorldLink(currentWorld, type); - Location newTo = getLocation(e, currentLocation, type, currentWorld, linkedWorld); + Location newTo = getLocation(entity, currentLocation, type, currentWorld, linkedWorld); // Gets the player spawn location from the portal spawn location if (newTo != null) { event.setTo(newTo); @@ -343,57 +355,53 @@ public void onEntityPortal(EntityPortalEvent event) { return; } - MultiverseWorld fromWorld = this.worldManager.getMVWorld(event.getFrom().getWorld().getName()); - MultiverseWorld toWorld = this.worldManager.getMVWorld(event.getTo().getWorld().getName()); - - if (!event.isCancelled()) { - if (fromWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { - Logging.fine("Entity '" + e.getName() + "' will be teleported to the spawn of '" + toWorld.getName() + "' since they used an end exit portal."); - try { - Class.forName("org.bukkit.TravelAgent"); - event.getPortalTravelAgent().setCanCreatePortal(false); - } catch (ClassNotFoundException ignore) { - Logging.fine("TravelAgent not available for EntityPortalEvent for " + e.getName() + ". There may be a portal created at spawn."); - } + if (event.isCancelled()) { // Superfluous? + return; + } - event.setTo(toWorld.getSpawnLocation()); - } else if (fromWorld.getEnvironment() == World.Environment.NETHER && type == PortalType.NETHER) { - try { - Class.forName("org.bukkit.TravelAgent"); - event.getPortalTravelAgent().setCanCreatePortal(true); - event.setTo(event.getPortalTravelAgent().findOrCreate(event.getTo())); - } catch (ClassNotFoundException ignore) { - Logging.fine("TravelAgent not available for EntityPortalEvent for " + e.getName() + ". Their destination may not be correct."); - event.setTo(event.getTo()); - } - } else if (toWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { - Location loc = new Location(event.getTo().getWorld(), 100, 50, 0); // This is the vanilla location for obsidian platform. - event.setTo(loc); - Block block = loc.getBlock(); - for (int x = block.getX() - 2; x <= block.getX() + 2; x++) { - for (int z = block.getZ() - 2; z <= block.getZ() + 2; z++) { - Block platformBlock = loc.getWorld().getBlockAt(x, block.getY() - 1, z); - if (platformBlock.getType() != Material.OBSIDIAN) { - platformBlock.setType(Material.OBSIDIAN); - } - for (int yMod = 1; yMod <= 3; yMod++) { - Block b = platformBlock.getRelative(BlockFace.UP, yMod); - if (b.getType() != Material.AIR) { - b.setType(Material.AIR); - } - } - } - } + // If we are going to the overworld from the end + if (fromWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { + Logging.fine("Entity '" + entity.getName() + "' will be teleported to the spawn of '" + toWorld.getName() + "' since they used an end exit portal."); + try { + Class.forName("org.bukkit.TravelAgent"); + event.getPortalTravelAgent().setCanCreatePortal(false); + } catch (ClassNotFoundException ignore) { + Logging.fine("TravelAgent not available for EntityPortalEvent for " + entity.getName() + ". There may be a portal created at spawn."); } + + event.setTo(toWorld.getSpawnLocation()); + return; + } + + // If we are going to the overworld from the nether + if (fromWorld.getEnvironment() == World.Environment.NETHER && type == PortalType.NETHER) { + try { + Class.forName("org.bukkit.TravelAgent"); + event.getPortalTravelAgent().setCanCreatePortal(true); + event.setTo(event.getPortalTravelAgent().findOrCreate(toLocation)); + } catch (ClassNotFoundException ignore) { + Logging.fine("TravelAgent not available for EntityPortalEvent for " + entity.getName() + ". Their destination may not be correct."); + event.setTo(toLocation); + } + + return; + } + + // If we are going to the end from anywhere + if (toWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { + Location spawnLocation = EndPlatformCreator.getVanillaLocation(toWorld); + event.setTo(spawnLocation); + EndPlatformCreator.createEndPlatform(spawnLocation); + return; } } @EventHandler public void onEntityPortalExit(EntityPortalExitEvent event) { if (event.getEntity() instanceof Player) { - Player p = (Player) event.getEntity(); - eventRecord.removeFromRecord(PortalType.ENDER, p.getUniqueId()); - eventRecord.removeFromRecord(PortalType.NETHER, p.getUniqueId()); + Player player = (Player) event.getEntity(); + eventRecord.removeFromRecord(PortalType.ENDER, player.getUniqueId()); + eventRecord.removeFromRecord(PortalType.NETHER, player.getUniqueId()); } } } diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java index afaf1c0..76f90ab 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java @@ -5,17 +5,15 @@ import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.utils.PermissionTools; import com.onarandombox.MultiverseNetherPortals.MultiverseNetherPortals; +import com.onarandombox.MultiverseNetherPortals.utils.EndPlatformCreator; import com.onarandombox.MultiverseNetherPortals.utils.MVLinkChecker; import com.onarandombox.MultiverseNetherPortals.utils.MVNameChecker; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.PortalType; import org.bukkit.World; import org.bukkit.advancement.Advancement; import org.bukkit.advancement.AdvancementProgress; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -138,23 +136,9 @@ public void onPlayerPortal(PlayerPortalEvent event) { event.setTo(event.getTo()); } } else if (toWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { - Location loc = new Location(event.getTo().getWorld(), 100, 50, 0); // This is the vanilla location for obsidian platform. - event.setTo(loc); - Block block = loc.getBlock(); - for (int x = block.getX() - 2; x <= block.getX() + 2; x++) { - for (int z = block.getZ() - 2; z <= block.getZ() + 2; z++) { - Block platformBlock = loc.getWorld().getBlockAt(x, block.getY() - 1, z); - if (platformBlock.getType() != Material.OBSIDIAN) { - platformBlock.setType(Material.OBSIDIAN); - } - for (int yMod = 1; yMod <= 3; yMod++) { - Block b = platformBlock.getRelative(BlockFace.UP, yMod); - if (b.getType() != Material.AIR) { - b.setType(Material.AIR); - } - } - } - } + Location spawnLocation = EndPlatformCreator.getVanillaLocation(event.getTo().getWorld()); + event.setTo(spawnLocation); + EndPlatformCreator.createEndPlatform(spawnLocation); } // Advancements need to be triggered manually diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java new file mode 100644 index 0000000..60bda9f --- /dev/null +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java @@ -0,0 +1,66 @@ +package com.onarandombox.MultiverseNetherPortals.utils; + +import com.dumptruckman.minecraft.util.Logging; +import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; + +public class EndPlatformCreator { + + /** + * Creates an end platform at the specified {@code Block} + * @param spawnLocation The {@code Block} that the player will spawn at. + */ + public static void createEndPlatform(Block spawnLocation) { + Logging.fine("Creating an end platform at " + spawnLocation.toString()); + + // Is this code even required?! - Past self + for (int x = spawnLocation.getX() - 2; x <= spawnLocation.getX() + 2; x++) { + for (int z = spawnLocation.getZ() - 2; z <= spawnLocation.getZ() + 2; z++) { + Block platformBlock = spawnLocation.getWorld().getBlockAt(x, spawnLocation.getY() - 1, z); + Logging.finest("Placing blocks at " + platformBlock); + + // Create platform + if (platformBlock.getType() != Material.OBSIDIAN) { + platformBlock.setType(Material.OBSIDIAN); + Logging.finest("Placing obsidian at " + platformBlock); + } + + // Clear space above platform + for (int yMod = 1; yMod <= 3; yMod++) { + Block b = platformBlock.getRelative(BlockFace.UP, yMod); + if (b.getType() != Material.AIR) { + b.breakNaturally(); + Logging.warning("Breaking block at " + platformBlock); + } + } + } + } + } + + + /** + * Creates an end platform at the specified {@code Location} + * @param spawnLocation The {@code Location} that the player will spawn at. + */ + public static void createEndPlatform(Location spawnLocation) { + createEndPlatform(spawnLocation.getBlock()); + } + + /** + * The default vanilla location for the end platform + */ + public static Location getVanillaLocation(World world) { + return new Location(world, 100, 49, 0, 90, 0); + } + + /** + * The default vanilla location for the end platform + */ + public static Location getVanillaLocation(MultiverseWorld world) { + return getVanillaLocation(world.getCBWorld()); + } +} From 1180c9652e582f74531c7c183755ce56f37b127a Mon Sep 17 00:00:00 2001 From: Zax71 Date: Fri, 23 Aug 2024 13:11:06 +0100 Subject: [PATCH 2/4] Change warning to finest & remove nonsensical comment --- .../MultiverseNetherPortals/utils/EndPlatformCreator.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java index 60bda9f..37c1fdd 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java @@ -17,7 +17,6 @@ public class EndPlatformCreator { public static void createEndPlatform(Block spawnLocation) { Logging.fine("Creating an end platform at " + spawnLocation.toString()); - // Is this code even required?! - Past self for (int x = spawnLocation.getX() - 2; x <= spawnLocation.getX() + 2; x++) { for (int z = spawnLocation.getZ() - 2; z <= spawnLocation.getZ() + 2; z++) { Block platformBlock = spawnLocation.getWorld().getBlockAt(x, spawnLocation.getY() - 1, z); @@ -34,7 +33,7 @@ public static void createEndPlatform(Block spawnLocation) { Block b = platformBlock.getRelative(BlockFace.UP, yMod); if (b.getType() != Material.AIR) { b.breakNaturally(); - Logging.warning("Breaking block at " + platformBlock); + Logging.finest("Breaking block at " + platformBlock); } } } From 6a09b698eb9cc3539199606e4464a5cda21282ca Mon Sep 17 00:00:00 2001 From: Zax71 Date: Fri, 23 Aug 2024 13:17:15 +0100 Subject: [PATCH 3/4] Remove superfluous `isCancelled() check --- .../MultiverseNetherPortals/listeners/MVNPEntityListener.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java index a5ee87b..70b4c49 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java @@ -355,10 +355,6 @@ public void onEntityPortal(EntityPortalEvent event) { return; } - if (event.isCancelled()) { // Superfluous? - return; - } - // If we are going to the overworld from the end if (fromWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { Logging.fine("Entity '" + entity.getName() + "' will be teleported to the spawn of '" + toWorld.getName() + "' since they used an end exit portal."); From 44da5208db983107aa59ebfcd98a264c200c662d Mon Sep 17 00:00:00 2001 From: Zax71 Date: Fri, 23 Aug 2024 13:47:04 +0100 Subject: [PATCH 4/4] Add config option for the end platform dropping blocks & warn if getTo is null --- .../MultiverseNetherPortals.java | 10 ++++++++++ .../listeners/MVNPEntityListener.java | 9 +++++++-- .../listeners/MVNPPlayerListener.java | 2 +- .../utils/EndPlatformCreator.java | 20 +++++++++++++------ 4 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/MultiverseNetherPortals.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/MultiverseNetherPortals.java index 80ac620..af4066e 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/MultiverseNetherPortals.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/MultiverseNetherPortals.java @@ -113,6 +113,7 @@ public void loadConfig() { this.setTeleportingEntities(this.isTeleportingEntities()); this.setSendingNoDestinationMessage(this.isSendingNoDestinationMessage()); this.setSendingDisabledPortalMessage(this.isSendingDisabledPortalMessage()); + this.setEndPlatformDropBlocks(this.isEndPlatformDropBlocks()); this.setNetherPrefix(this.getNetherPrefix()); this.setNetherSuffix(this.getNetherSuffix()); @@ -334,6 +335,14 @@ public void setSendingNoDestinationMessage(boolean sendNoDestinationMessage) { this.MVNPConfiguration.set("send_no_destination_message", sendNoDestinationMessage); } + public boolean isEndPlatformDropBlocks() { + return this.MVNPConfiguration.getBoolean("end_platform_drop_blocks", true); + } + + public void setEndPlatformDropBlocks(boolean endPlatformDropBlocks) { + this.MVNPConfiguration.set("end_platform_drop_blocks", endPlatformDropBlocks); + } + public boolean isHandledByNetherPortals(Location l) { if (multiversePortals != null) { // Catch errors which could occur if classes aren't present or are missing methods. @@ -398,6 +407,7 @@ public String dumpVersionInfo(String buffer) { buffer += logAndAddToPasteBinBuffer("Teleport Entities: " + this.isTeleportingEntities()); buffer += logAndAddToPasteBinBuffer("Send Disabled Portal Message: " + this.isSendingDisabledPortalMessage()); buffer += logAndAddToPasteBinBuffer("Send No Destination Message: " + this.isSendingNoDestinationMessage()); + buffer += logAndAddToPasteBinBuffer("End platform drops blocks: " + this.isEndPlatformDropBlocks()); buffer += logAndAddToPasteBinBuffer("Special Code: FRN001"); return buffer; } diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java index 70b4c49..d74e8e2 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPEntityListener.java @@ -302,9 +302,14 @@ public void onEntityPortal(EntityPortalEvent event) { // Some shortcuts for later Entity entity = event.getEntity(); - Location toLocation = event.getTo(); + @Nullable Location toLocation = event.getTo(); Location fromLocation = event.getFrom(); + if (toLocation == null) { + Logging.warning("ToLocation in EntityPortalEvent is null."); + return; + } + MultiverseWorld fromWorld = this.worldManager.getMVWorld(fromLocation.getWorld().getName()); MultiverseWorld toWorld = this.worldManager.getMVWorld(toLocation.getWorld().getName()); @@ -387,7 +392,7 @@ public void onEntityPortal(EntityPortalEvent event) { if (toWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { Location spawnLocation = EndPlatformCreator.getVanillaLocation(toWorld); event.setTo(spawnLocation); - EndPlatformCreator.createEndPlatform(spawnLocation); + EndPlatformCreator.createEndPlatform(spawnLocation, plugin.isEndPlatformDropBlocks()); return; } } diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java index 76f90ab..9c04e70 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/listeners/MVNPPlayerListener.java @@ -138,7 +138,7 @@ public void onPlayerPortal(PlayerPortalEvent event) { } else if (toWorld.getEnvironment() == World.Environment.THE_END && type == PortalType.ENDER) { Location spawnLocation = EndPlatformCreator.getVanillaLocation(event.getTo().getWorld()); event.setTo(spawnLocation); - EndPlatformCreator.createEndPlatform(spawnLocation); + EndPlatformCreator.createEndPlatform(spawnLocation, plugin.isEndPlatformDropBlocks()); } // Advancements need to be triggered manually diff --git a/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java index 37c1fdd..face112 100644 --- a/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java +++ b/src/main/java/com/onarandombox/MultiverseNetherPortals/utils/EndPlatformCreator.java @@ -2,6 +2,7 @@ import com.dumptruckman.minecraft.util.Logging; import com.onarandombox.MultiverseCore.api.MultiverseWorld; +import com.onarandombox.MultiverseNetherPortals.MultiverseNetherPortals; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; @@ -12,9 +13,11 @@ public class EndPlatformCreator { /** * Creates an end platform at the specified {@code Block} + * * @param spawnLocation The {@code Block} that the player will spawn at. + * @param dropEndBlocks If the platform should drop the broken blocks or delete them */ - public static void createEndPlatform(Block spawnLocation) { + public static void createEndPlatform(Block spawnLocation, boolean dropEndBlocks) { Logging.fine("Creating an end platform at " + spawnLocation.toString()); for (int x = spawnLocation.getX() - 2; x <= spawnLocation.getX() + 2; x++) { @@ -30,9 +33,14 @@ public static void createEndPlatform(Block spawnLocation) { // Clear space above platform for (int yMod = 1; yMod <= 3; yMod++) { - Block b = platformBlock.getRelative(BlockFace.UP, yMod); - if (b.getType() != Material.AIR) { - b.breakNaturally(); + Block block = platformBlock.getRelative(BlockFace.UP, yMod); + if (block.getType() != Material.AIR) { + if (dropEndBlocks) { + block.breakNaturally(); + } else { + block.setType(Material.AIR); + } + Logging.finest("Breaking block at " + platformBlock); } } @@ -45,8 +53,8 @@ public static void createEndPlatform(Block spawnLocation) { * Creates an end platform at the specified {@code Location} * @param spawnLocation The {@code Location} that the player will spawn at. */ - public static void createEndPlatform(Location spawnLocation) { - createEndPlatform(spawnLocation.getBlock()); + public static void createEndPlatform(Location spawnLocation, boolean dropEndBlocks) { + createEndPlatform(spawnLocation.getBlock(), dropEndBlocks); } /**