From b4c368a2cd34089351a8b9003d2ba790a1214e65 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sun, 15 Sep 2024 09:29:57 +0800 Subject: [PATCH 1/2] Initial support for MV5 core and hk2 injection --- build.gradle | 28 +++- .../listeners/MVSPPlayerListener.java | 151 ------------------ .../listeners/MVSPTravelAgent.java | 29 ---- .../listeners/MVSPVersionListener.java | 85 ---------- .../utils/PortalLocation.java | 12 -- .../signportals}/MultiverseSignPortals.java | 132 +++++++-------- .../MultiverseSignPortalsPluginBinder.java | 19 +++ .../multiverse/signportals}/enums/Axis.java | 34 ++-- .../MoreThanOneSignFoundException.java | 22 +-- .../NoMultiverseSignFoundException.java | 24 +-- .../listeners/MVSPBlockListener.java | 129 ++++++++------- .../listeners/MVSPPlayerListener.java | 146 +++++++++++++++++ .../listeners/MVSPPluginListener.java | 19 ++- .../listeners/MVSPVersionListener.java | 82 ++++++++++ .../listeners/SignPortalsListener.java | 8 + .../signportals}/utils/PortalDetector.java | 84 +++++----- .../signportals}/utils/SignStatus.java | 24 +-- .../signportals}/utils/SignTools.java | 54 +++---- src/main/resources/plugin.yml | 2 +- 19 files changed, 533 insertions(+), 551 deletions(-) delete mode 100644 src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPlayerListener.java delete mode 100644 src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPTravelAgent.java delete mode 100644 src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPVersionListener.java delete mode 100644 src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalLocation.java rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/MultiverseSignPortals.java (52%) create mode 100644 src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/enums/Axis.java (80%) rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/exceptions/MoreThanOneSignFoundException.java (79%) rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/exceptions/NoMultiverseSignFoundException.java (79%) rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/listeners/MVSPBlockListener.java (53%) create mode 100644 src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/listeners/MVSPPluginListener.java (53%) create mode 100644 src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java create mode 100644 src/main/java/org/mvplugins/multiverse/signportals/listeners/SignPortalsListener.java rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/utils/PortalDetector.java (83%) rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/utils/SignStatus.java (82%) rename src/main/java/{com/onarandombox/MultiverseSignPortals => org/mvplugins/multiverse/signportals}/utils/SignTools.java (91%) diff --git a/build.gradle b/build.gradle index 3f56366..7d6e8c6 100644 --- a/build.gradle +++ b/build.gradle @@ -6,10 +6,14 @@ plugins { } version = System.getenv('GITHUB_VERSION') ?: 'local' -group = 'com.onarandombox.multiversesignportals' +group = 'org.mvplugins.multiverse.signportals' description = 'Multiverse-SignPortals' -java.sourceCompatibility = JavaVersion.VERSION_11 +java { + toolchain { + languageVersion.set(JavaLanguageVersion.of(17)) + } +} repositories { mavenLocal() @@ -28,12 +32,12 @@ repositories { dependencies { // Spigot - implementation('org.bukkit:bukkit:1.13.2-R0.1-SNAPSHOT') { + implementation('org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT') { exclude group: 'junit', module: 'junit' } // Core - implementation 'com.onarandombox.multiversecore:Multiverse-Core:4.2.2' + implementation 'org.mvplugins.multiverse.core:multiverse-core:local' // Utils api('com.dumptruckman.minecraft:Logging:1.1.1') { @@ -55,7 +59,6 @@ tasks.withType(Javadoc).configureEach { options.encoding = 'UTF-8' } - configurations { [apiElements, runtimeElements].each { it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) } @@ -112,8 +115,8 @@ javadoc { project.configurations.api.canBeResolved = true shadowJar { - relocate 'com.dumptruckman.minecraft.util.Logging', 'com.onarandombox.MultiverseSignPortals.util.MVSPLogging' - relocate 'com.dumptruckman.minecraft.util.DebugLog', 'com.onarandombox.MultiverseSignPortals.util.DebugFileLogger' + relocate 'com.dumptruckman.minecraft.util.Logging', 'org.mvplugins.multiverse.signportals.util.MVSPLogging' + relocate 'com.dumptruckman.minecraft.util.DebugLog', 'org.mvplugins.multiverse.signportals.util.DebugFileLogger' configurations = [project.configurations.api] @@ -122,3 +125,14 @@ shadowJar { build.dependsOn shadowJar jar.enabled = false + +tasks.register('runHabitatGenerator', JavaExec) { + classpath = configurations["compileClasspath"] + main = 'org.mvplugins.multiverse.external.jvnet.hk2.generator.HabitatGenerator' + + args = [ + '--file', "build/libs/multiverse-signportals-$version" + ".jar", + '--locator', 'Multiverse-SignPortals', + ] +} +tasks.named("build") { finalizedBy("runHabitatGenerator") } diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPlayerListener.java b/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPlayerListener.java deleted file mode 100644 index bed92a6..0000000 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPlayerListener.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.listeners; - -import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.destination.DestinationFactory; -import com.onarandombox.MultiverseCore.enums.TeleportResult; -import com.onarandombox.MultiverseCore.utils.MVPermissions; -import com.onarandombox.MultiverseCore.api.SafeTTeleporter; -import com.onarandombox.MultiverseSignPortals.MultiverseSignPortals; -import com.onarandombox.MultiverseSignPortals.exceptions.MoreThanOneSignFoundException; -import com.onarandombox.MultiverseSignPortals.exceptions.NoMultiverseSignFoundException; -import com.onarandombox.MultiverseSignPortals.utils.PortalDetector; -import com.onarandombox.MultiverseSignPortals.utils.SignStatus; -import org.bukkit.ChatColor; -import org.bukkit.block.Sign; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.permissions.PermissionDefault; - -public class MVSPPlayerListener implements Listener { - - private static final String USE_PERMISSION = "multiverse.signportal.use"; - private static final String VALIDATE_PERMISSION = "multiverse.signportal.validate"; - private final MultiverseSignPortals plugin; - private final MVPermissions permissions; - private final PortalDetector pd; - - public MVSPPlayerListener(MultiverseSignPortals plugin) { - this.plugin = plugin; - this.permissions = this.plugin.getCore().getMVPerms(); - this.permissions.addPermission(VALIDATE_PERMISSION, PermissionDefault.OP); - this.permissions.addPermission(USE_PERMISSION, PermissionDefault.TRUE); - this.pd = new PortalDetector(this.plugin); - } - - /** - * Called when the portal is ready to take the player to the destination. - * @param event The Portal event. - */ - @EventHandler - public void playerPortal(PlayerPortalEvent event) { - if (event.isCancelled()) { - return; - } - PortalDetector detector = new PortalDetector(this.plugin); - try { - String destString = detector.getNotchPortalDestination(event.getPlayer(), event.getFrom()); - if (destString != null) { - Logging.finer("Found a Multiverse Sign"); - DestinationFactory df = this.plugin.getCore().getDestFactory(); - destString = ChatColor.stripColor(destString); - MVDestination dest = df.getDestination(destString); - MVSPTravelAgent travelAgent = new MVSPTravelAgent(this.plugin.getCore(), dest, event.getPlayer()); - travelAgent.setPortalEventTravelAgent(event); - event.setTo(dest.getLocation(event.getPlayer())); - } - - } catch (NoMultiverseSignFoundException e) { - // This will simply act as a notch portal. - Logging.finer("Did NOT find a Multiverse Sign"); - } catch (MoreThanOneSignFoundException e) { - this.plugin.getCore().getMessaging().sendMessage(event.getPlayer(), - String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", - ChatColor.RED, ChatColor.WHITE), false); - event.setCancelled(true); - } - } - - /** - * Called when a player clicks on anything. - * @param event The Interact event. - */ - @EventHandler - public void playerInteract(PlayerInteractEvent event) { - // The event must not be canceled... - if (event.isCancelled()) { - return; - } - - // We must be right-clicking... - if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { - return; - } - - // And it must be a sign - if (!(event.getClickedBlock().getState() instanceof Sign)) { - return; - } - - Logging.finer("Found a Sign!"); - Sign s = (Sign) event.getClickedBlock().getState(); - SignStatus status = this.pd.getSignStatus(s); - - Player player = event.getPlayer(); - switch (status) { - case SignPortal: - if (permissions.hasPermission(player, USE_PERMISSION, false)) { - String destString = this.pd.processSign(s); - this.takePlayerToDestination(player, destString); - } else { - player.sendMessage(ChatColor.RED + "You do not have the required permission to use SignPortals (" + USE_PERMISSION + ")"); - } - event.setCancelled(true); - break; - case Legacy: - this.pd.activateSignPortal(player, ChatColor.AQUA + "Legacy", s); - event.setCancelled(true); - break; - case Disabled: - this.pd.activateSignPortal(player, ChatColor.RED + "Disabled", s); - event.setCancelled(true); - break; - case NetherPortalSign: - event.setCancelled(true); - } - } - - private void takePlayerToDestination(Player player, String destString) { - if (destString != null) { - Logging.finer("Found a SignPortal! (" + destString + ")"); - SafeTTeleporter teleporter = this.plugin.getCore().getSafeTTeleporter(); - DestinationFactory df = this.plugin.getCore().getDestFactory(); - - MVDestination d = df.getDestination(destString); - Logging.finer("Found a Destination! (" + d + ")"); - if (this.pd.playerCanGoToDestination(player, d)) { - TeleportResult result = teleporter.safelyTeleport(player, player, d); - if (result == TeleportResult.FAIL_UNSAFE) { - player.sendMessage("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); - } - } else { - Logging.finer("Denied permission to go to destination!"); - } - } else { - player.sendMessage("The Destination was not set on the sign!"); - } - } - - -} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPTravelAgent.java b/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPTravelAgent.java deleted file mode 100644 index 4d155b6..0000000 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPTravelAgent.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.onarandombox.MultiverseSignPortals.listeners; - -import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.utils.BukkitTravelAgent; -import com.onarandombox.MultiverseCore.utils.MVTravelAgent; -import org.bukkit.entity.Player; -import org.bukkit.event.player.PlayerPortalEvent; - -import java.util.logging.Level; - -class MVSPTravelAgent extends MVTravelAgent { - - MVSPTravelAgent(MultiverseCore multiverseCore, MVDestination d, Player p) { - super(multiverseCore, d, p); - } - - void setPortalEventTravelAgent(PlayerPortalEvent event) { - try { - Class.forName("org.bukkit.TravelAgent"); - event.useTravelAgent(true); - new BukkitTravelAgent(this).setPortalEventTravelAgent(event); - } catch (ClassNotFoundException ignore) { - Logging.fine("TravelAgent not available for PlayerPortalEvent for " + player.getName()); - } - } -} - diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPVersionListener.java b/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPVersionListener.java deleted file mode 100644 index c5c87dc..0000000 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPVersionListener.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.listeners; - -import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.event.MVDebugModeEvent; -import com.onarandombox.MultiverseCore.event.MVPlayerTouchedPortalEvent; -import com.onarandombox.MultiverseCore.event.MVVersionEvent; -import com.onarandombox.MultiverseSignPortals.MultiverseSignPortals; -import com.onarandombox.MultiverseSignPortals.exceptions.MoreThanOneSignFoundException; -import com.onarandombox.MultiverseSignPortals.exceptions.NoMultiverseSignFoundException; -import com.onarandombox.MultiverseSignPortals.utils.PortalDetector; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -import java.util.logging.Level; - -public class MVSPVersionListener implements Listener { - private MultiverseSignPortals plugin; - - public MVSPVersionListener(MultiverseSignPortals plugin) { - this.plugin = plugin; - } - - /** - * This method is called when Multiverse-Core wants to know what version we are. - * @param event The Version event. - */ - @EventHandler - public void versionEvent(MVVersionEvent event) { - event.appendVersionInfo(this.plugin.getVersionInfo()); - } - - /** - * This method is called when a player touches a portal. - * It's used to handle the intriquite messiness of priority between MV plugins. - * @param event The PTP event. - */ - @EventHandler - public void portalTouchEvent(MVPlayerTouchedPortalEvent event) { - Logging.finer("Found The TouchedPortal event."); - Player p = event.getPlayer(); - Location l = event.getBlockTouched(); - - PortalDetector detector = new PortalDetector(this.plugin); - try { - String destString = detector.getNotchPortalDestination(p, l); - - if (destString != null) { - MVDestination d = this.plugin.getCore().getDestFactory().getDestination(destString); - Logging.fine(destString + " ::: " + d); - if (detector.playerCanGoToDestination(p, d)) { - // If the player can go to the destination on the sign... - // We're overriding NetherPortals. - Logging.fine("Player could go to destination!"); - event.setCancelled(true); - } else { - Logging.fine("Player could NOT go to destination!"); - } - } - - } catch (NoMultiverseSignFoundException e) { - // This will simply act as a notch portal. - Logging.finer("Did NOT find a Multiverse Sign"); - } catch (MoreThanOneSignFoundException e) { - this.plugin.getCore().getMessaging().sendMessage(p, - String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", - ChatColor.RED, ChatColor.WHITE), false); - } - } - - @EventHandler - public void debugModeChange(MVDebugModeEvent event) { - Logging.setDebugLevel(event.getLevel()); - } -} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalLocation.java b/src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalLocation.java deleted file mode 100644 index b27a32f..0000000 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalLocation.java +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.utils; - -public class PortalLocation { - -} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java similarity index 52% rename from src/main/java/com/onarandombox/MultiverseSignPortals/MultiverseSignPortals.java rename to src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index 421673a..e59233c 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -5,30 +5,35 @@ * with this project. */ -package com.onarandombox.MultiverseSignPortals; +package org.mvplugins.multiverse.signportals; import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseCore.api.MVPlugin; -import com.onarandombox.MultiverseSignPortals.listeners.MVSPBlockListener; -import com.onarandombox.MultiverseSignPortals.listeners.MVSPPlayerListener; -import com.onarandombox.MultiverseSignPortals.listeners.MVSPPluginListener; -import com.onarandombox.MultiverseSignPortals.listeners.MVSPVersionListener; -import com.onarandombox.MultiverseSignPortals.utils.PortalDetector; -import org.bukkit.plugin.PluginManager; +import org.mvplugins.multiverse.core.MultiverseCore; +import org.mvplugins.multiverse.core.api.MVConfig; +import org.mvplugins.multiverse.core.api.MVCore; +import org.mvplugins.multiverse.core.api.MVPlugin; +import org.mvplugins.multiverse.core.inject.PluginServiceLocator; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.external.vavr.control.Option; +import org.mvplugins.multiverse.external.vavr.control.Try; import org.bukkit.plugin.java.JavaPlugin; +import org.mvplugins.multiverse.signportals.listeners.SignPortalsListener; import java.util.logging.Level; +@Service public class MultiverseSignPortals extends JavaPlugin implements MVPlugin { - protected MultiverseCore core; - protected MVSPPlayerListener playerListener; - protected MVSPPluginListener pluginListener; - protected MVSPBlockListener blockListener; - private final static int requiresProtocol = 24; + private MultiverseCore core; + private PluginServiceLocator serviceLocator; - private PortalDetector portalDetector; + private final static int requiresProtocol = 50; + + /** This fires before I get Enabled. */ + public void onLoad() { + Logging.init(this); + this.getDataFolder().mkdirs(); + } public void onEnable() { Logging.init(this); @@ -50,36 +55,51 @@ public void onEnable() { return; } - Logging.setDebugLevel(core.getMVConfig().getGlobalDebug()); + initializeDependencyInjection(); + registerEvents(); + Logging.setDebugLevel(serviceLocator.getActiveService(MVConfig.class).getGlobalDebug()); this.core.incrementPluginCount(); - - // Init our listeners - this.pluginListener = new MVSPPluginListener(this); - this.playerListener = new MVSPPlayerListener(this); - this.blockListener = new MVSPBlockListener(this); - - // Init our events - PluginManager pm = this.getServer().getPluginManager(); - pm.registerEvents(this.pluginListener, this); - pm.registerEvents(this.playerListener, this); - pm.registerEvents(this.blockListener, this); - pm.registerEvents(new MVSPVersionListener(this), this); - - this.portalDetector = new PortalDetector(this); - Logging.log(true, Level.INFO, " Enabled - By %s", getAuthors()); } public void onDisable() { // The Usual + shutdownDependencyInjection(); Logging.info("- Disabled"); } - /** This fires before I get Enabled. */ - public void onLoad() { - Logging.init(this); - this.getDataFolder().mkdirs(); + private void initializeDependencyInjection() { + serviceLocator = core.getServiceLocatorFactory() + .registerPlugin(new MultiverseSignPortalsPluginBinder(this), core.getServiceLocator()) + .flatMap(PluginServiceLocator::enable) + .getOrElseThrow(exception -> { + Logging.severe("Failed to initialize dependency injection!"); + getServer().getPluginManager().disablePlugin(this); + return new RuntimeException(exception); + }); + } + + private void shutdownDependencyInjection() { + Option.of(serviceLocator) + .peek(PluginServiceLocator::disable) + .peek(ignore -> serviceLocator = null); + } + + /** + * Function to Register all the Events needed. + */ + private void registerEvents() { + var pluginManager = getServer().getPluginManager(); + + Try.run(() -> serviceLocator.getAllServices(SignPortalsListener.class).forEach( + listener -> { + Logging.info(listener.toString()); + pluginManager.registerEvents(listener, this); + })) + .onFailure(e -> { + throw new RuntimeException("Failed to register listeners. Terminating...", e); + }); } /** @@ -87,7 +107,8 @@ public void onLoad() { * * @return An comma separated string of authors */ - private String getAuthors() { + @Override + public String getAuthors() { String authors = ""; for (int i = 0; i < this.getDescription().getAuthors().size(); i++) { if (i == this.getDescription().getAuthors().size() - 1) { @@ -99,55 +120,22 @@ private String getAuthors() { return authors.substring(2); } - /** - * {@inheritDoc} - * - * @deprecated This is now deprecated, nobody needs it any longer. - * All logging is now done with {@link Logging}. - */ - @Override - @Deprecated - public void log(Level level, String msg) { - Logging.log(level, msg); - } - - // No longer using, use getVersionInfo instead. @Override - @Deprecated - public String dumpVersionInfo(String buffer) { - buffer += logAndAddToPasteBinBuffer(this.getVersionInfo()); - return buffer; + public PluginServiceLocator getServiceLocator() { + return serviceLocator; } public String getVersionInfo() { return "[Multiverse-SignPortals] Multiverse-SignPortals Version: " + this.getDescription().getVersion() + '\n'; } - // No longer using, use getVersionInfo instead. - @Deprecated - private String logAndAddToPasteBinBuffer(String string) { - Logging.info(string); - return Logging.getPrefixedMessage(string, false); - } - @Override - public MultiverseCore getCore() { + public MVCore getCore() { return this.core; } - @Override - public void setCore(MultiverseCore core) { - this.core = core; - } - @Override public int getProtocolVersion() { return 1; } - - public PortalDetector getPortalDetector() { - return this.portalDetector; - } - - } diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java new file mode 100644 index 0000000..efd607b --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java @@ -0,0 +1,19 @@ +package org.mvplugins.multiverse.signportals; + +import org.mvplugins.multiverse.core.api.MVPlugin; +import org.mvplugins.multiverse.core.inject.binder.JavaPluginBinder; +import org.mvplugins.multiverse.external.glassfish.hk2.utilities.binding.ScopedBindingBuilder; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; + +public class MultiverseSignPortalsPluginBinder extends JavaPluginBinder { + + protected MultiverseSignPortalsPluginBinder(@NotNull MultiverseSignPortals plugin) { + super(plugin); + } + + @Override + protected ScopedBindingBuilder bindPluginClass( + ScopedBindingBuilder bindingBuilder) { + return super.bindPluginClass(bindingBuilder).to(MVPlugin.class).to(MultiverseSignPortals.class); + } +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/enums/Axis.java b/src/main/java/org/mvplugins/multiverse/signportals/enums/Axis.java similarity index 80% rename from src/main/java/com/onarandombox/MultiverseSignPortals/enums/Axis.java rename to src/main/java/org/mvplugins/multiverse/signportals/enums/Axis.java index cce86f4..5bc31cc 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/enums/Axis.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/enums/Axis.java @@ -1,17 +1,17 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.enums; - -/** - * Multiverse 2 - * - * @author fernferret - */ -public enum Axis { - X, Z -} +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.enums; + +/** + * Multiverse 2 + * + * @author fernferret + */ +public enum Axis { + X, Z +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/MoreThanOneSignFoundException.java b/src/main/java/org/mvplugins/multiverse/signportals/exceptions/MoreThanOneSignFoundException.java similarity index 79% rename from src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/MoreThanOneSignFoundException.java rename to src/main/java/org/mvplugins/multiverse/signportals/exceptions/MoreThanOneSignFoundException.java index 9d36a1d..b692f05 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/MoreThanOneSignFoundException.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/exceptions/MoreThanOneSignFoundException.java @@ -1,11 +1,11 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.exceptions; - -public class MoreThanOneSignFoundException extends Exception { -} +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.exceptions; + +public class MoreThanOneSignFoundException extends Exception { +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/NoMultiverseSignFoundException.java b/src/main/java/org/mvplugins/multiverse/signportals/exceptions/NoMultiverseSignFoundException.java similarity index 79% rename from src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/NoMultiverseSignFoundException.java rename to src/main/java/org/mvplugins/multiverse/signportals/exceptions/NoMultiverseSignFoundException.java index 477f6a3..5f19637 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/exceptions/NoMultiverseSignFoundException.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/exceptions/NoMultiverseSignFoundException.java @@ -1,12 +1,12 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.exceptions; - -public class NoMultiverseSignFoundException extends Exception { - -} +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.exceptions; + +public class NoMultiverseSignFoundException extends Exception { + +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPBlockListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java similarity index 53% rename from src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPBlockListener.java rename to src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java index caa2ff3..9f872a4 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPBlockListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java @@ -5,18 +5,16 @@ * with this project. */ -package com.onarandombox.MultiverseSignPortals.listeners; +package org.mvplugins.multiverse.signportals.listeners; import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.api.SafeTTeleporter; -import com.onarandombox.MultiverseCore.enums.TeleportResult; -import com.onarandombox.MultiverseCore.utils.MVPermissions; -import com.onarandombox.MultiverseSignPortals.MultiverseSignPortals; -import com.onarandombox.MultiverseSignPortals.utils.PortalDetector; -import com.onarandombox.MultiverseSignPortals.utils.SignStatus; -import com.onarandombox.MultiverseSignPortals.utils.SignTools; -import org.bukkit.Bukkit; +import org.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.signportals.MultiverseSignPortals; +import org.mvplugins.multiverse.signportals.utils.PortalDetector; +import org.mvplugins.multiverse.signportals.utils.SignStatus; +import org.mvplugins.multiverse.signportals.utils.SignTools; import org.bukkit.ChatColor; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; @@ -25,24 +23,24 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.material.RedstoneTorch; -import org.bukkit.permissions.PermissionDefault; -import java.util.logging.Level; - -public class MVSPBlockListener implements Listener { +@Service +public class MVSPBlockListener implements SignPortalsListener { private final String CREATE_PERM = "multiverse.signportal.create"; - private MultiverseSignPortals plugin; - private MVPermissions permissions; + private final MultiverseSignPortals plugin; + private final PortalDetector pd; + // private MVPermissions permissions; - public MVSPBlockListener(MultiverseSignPortals plugin) { + @Inject + public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, @NotNull PortalDetector pd) { this.plugin = plugin; - this.permissions = this.plugin.getCore().getMVPerms(); - this.permissions.addPermission(CREATE_PERM, PermissionDefault.OP); + this.pd = pd; +// this.permissions = this.plugin.getCore().getMVPerms(); +// this.permissions.addPermission(CREATE_PERM, PermissionDefault.OP); } @EventHandler @@ -72,43 +70,43 @@ public void redstonePower(BlockRedstoneEvent event) { return; } Sign sign = (Sign) block.getState(); - SignStatus status = plugin.getPortalDetector().getSignStatus(sign); + SignStatus status = pd.getSignStatus(sign); if (status == SignStatus.SignPortal) { - String destString = plugin.getPortalDetector().processSign(sign); - for (Entity entity : plugin.getPortalDetector().getRedstoneTeleportEntities(sign)) { + String destString = pd.processSign(sign); + for (Entity entity : pd.getRedstoneTeleportEntities(sign)) { this.takeEntityToDestination(entity, destString); } } } private void takeEntityToDestination(Entity entity, String destString) { - if (destString != null) { - SafeTTeleporter teleporter = plugin.getCore().getSafeTTeleporter(); - MVDestination d = plugin.getCore().getDestFactory().getDestination(destString); - Logging.finer("Found a Destination! (" + d + ")"); - if (entity instanceof Player) { - Player player = (Player) entity; - if (plugin.getPortalDetector().playerCanGoToDestination(player, d)) { - TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), player, d); - if (result == TeleportResult.FAIL_UNSAFE) { - Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); - } else { - Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); - } - } else { - Logging.finer("Denied permission to go to destination!"); - } - } else { - TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), entity, d.getLocation(entity), true); - if (result == TeleportResult.FAIL_UNSAFE) { - Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); - } else { - Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); - } - } - } else { - Logging.finer("The destination was not set on the sign!"); - } +// if (destString != null) { +// SafeTTeleporter teleporter = plugin.getCore().getSafeTTeleporter(); +// MVDestination d = plugin.getCore().getDestFactory().getDestination(destString); +// Logging.finer("Found a Destination! (" + d + ")"); +// if (entity instanceof Player) { +// Player player = (Player) entity; +// if (plugin.getPortalDetector().playerCanGoToDestination(player, d)) { +// TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), player, d); +// if (result == TeleportResult.FAIL_UNSAFE) { +// Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); +// } else { +// Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); +// } +// } else { +// Logging.finer("Denied permission to go to destination!"); +// } +// } else { +// TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), entity, d.getLocation(entity), true); +// if (result == TeleportResult.FAIL_UNSAFE) { +// Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); +// } else { +// Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); +// } +// } +// } else { +// Logging.finer("The destination was not set on the sign!"); +// } } private Block getNearbySign(Block block, boolean torch) { @@ -149,13 +147,12 @@ public void onBlockBreak(BlockBreakEvent event) { BlockState state = event.getBlock().getState(); if (state instanceof Sign) { Sign s = (Sign) state; - PortalDetector pd = this.plugin.getPortalDetector(); if (pd.getSignStatus(s) == SignStatus.NetherPortalSign || pd.getSignStatus(s) == SignStatus.SignPortal) { - if (!this.permissions.hasPermission(event.getPlayer(), CREATE_PERM, true)) { - event.setCancelled(true); - event.getPlayer().sendMessage("You don't have permission to destroy a SignPortal!"); - event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); - } +// if (!this.permissions.hasPermission(event.getPlayer(), CREATE_PERM, true)) { +// event.setCancelled(true); +// event.getPlayer().sendMessage("You don't have permission to destroy a SignPortal!"); +// event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); +// } } } } @@ -170,16 +167,16 @@ private void checkForHack(SignChangeEvent event) { } private void createMultiverseSignPortal(SignChangeEvent event) { - if (this.plugin.getCore().getMVPerms().hasPermission(event.getPlayer(), "multiverse.signportal.create", true)) { - Logging.finer("MV SignPortal Created"); - event.setLine(1, ChatColor.DARK_GREEN + event.getLine(1)); - checkRedstoneTeleportTargets(event); - } else { - Logging.finer("No Perms to create"); - event.setLine(1, ChatColor.DARK_RED + event.getLine(1)); - event.getPlayer().sendMessage("You don't have permission to create a SignPortal!"); - event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); - } +// if (this.plugin.getCore().getMVPerms().hasPermission(event.getPlayer(), "multiverse.signportal.create", true)) { +// Logging.finer("MV SignPortal Created"); +// event.setLine(1, ChatColor.DARK_GREEN + event.getLine(1)); +// checkRedstoneTeleportTargets(event); +// } else { +// Logging.finer("No Perms to create"); +// event.setLine(1, ChatColor.DARK_RED + event.getLine(1)); +// event.getPlayer().sendMessage("You don't have permission to create a SignPortal!"); +// event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); +// } } private void checkRedstoneTeleportTargets(SignChangeEvent event) { diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java new file mode 100644 index 0000000..fde1551 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java @@ -0,0 +1,146 @@ +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.listeners; + +import com.dumptruckman.minecraft.util.Logging; +import org.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.signportals.MultiverseSignPortals; +import org.mvplugins.multiverse.signportals.exceptions.MoreThanOneSignFoundException; +import org.mvplugins.multiverse.signportals.exceptions.NoMultiverseSignFoundException; +import org.mvplugins.multiverse.signportals.utils.PortalDetector; +import org.mvplugins.multiverse.signportals.utils.SignStatus; +import org.bukkit.ChatColor; +import org.bukkit.block.Sign; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerPortalEvent; + +@Service +public class MVSPPlayerListener implements SignPortalsListener { + + private static final String USE_PERMISSION = "multiverse.signportal.use"; + private static final String VALIDATE_PERMISSION = "multiverse.signportal.validate"; + private final MultiverseSignPortals plugin; + // private final MVPermissions permissions; + private final PortalDetector pd; + + @Inject + MVSPPlayerListener(@NotNull MultiverseSignPortals plugin, @NotNull PortalDetector pd) { + this.plugin = plugin; +// this.permissions = this.plugin.getCore().getMVPerms(); +// this.permissions.addPermission(VALIDATE_PERMISSION, PermissionDefault.OP); +// this.permissions.addPermission(USE_PERMISSION, PermissionDefault.TRUE); + this.pd = pd; + } + + /** + * Called when the portal is ready to take the player to the destination. + * @param event The Portal event. + */ + @EventHandler + public void playerPortal(PlayerPortalEvent event) { + if (event.isCancelled()) { + return; + } + try { + String destString = pd.getNotchPortalDestination(event.getPlayer(), event.getFrom()); + if (destString != null) { + Logging.finer("Found a Multiverse Sign"); +// DestinationFactory df = this.plugin.getCore().getDestFactory(); +// destString = ChatColor.stripColor(destString); +// MVDestination dest = df.getDestination(destString); +// MVSPTravelAgent travelAgent = new MVSPTravelAgent(this.plugin.getCore(), dest, event.getPlayer()); +// travelAgent.setPortalEventTravelAgent(event); +// event.setTo(dest.getLocation(event.getPlayer())); + } + + } catch (NoMultiverseSignFoundException e) { + // This will simply act as a notch portal. + Logging.finer("Did NOT find a Multiverse Sign"); + } catch (MoreThanOneSignFoundException e) { +// this.plugin.getCore().getMessaging().sendMessage(event.getPlayer(), +// String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", +// ChatColor.RED, ChatColor.WHITE), false); + event.setCancelled(true); + } + } + + /** + * Called when a player clicks on anything. + * @param event The Interact event. + */ + @EventHandler + public void playerInteract(PlayerInteractEvent event) { + // The event must not be canceled... + if (event.isCancelled()) { + return; + } + + // We must be right-clicking... + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { + return; + } + + // And it must be a sign + if (!(event.getClickedBlock().getState() instanceof Sign)) { + return; + } + + Logging.finer("Found a Sign!"); + Sign s = (Sign) event.getClickedBlock().getState(); + SignStatus status = this.pd.getSignStatus(s); + + Player player = event.getPlayer(); + switch (status) { + case SignPortal: +// if (permissions.hasPermission(player, USE_PERMISSION, false)) { +// String destString = this.pd.processSign(s); +// this.takePlayerToDestination(player, destString); +// } else { +// player.sendMessage(ChatColor.RED + "You do not have the required permission to use SignPortals (" + USE_PERMISSION + ")"); +// } + event.setCancelled(true); + break; + case Legacy: + this.pd.activateSignPortal(player, ChatColor.AQUA + "Legacy", s); + event.setCancelled(true); + break; + case Disabled: + this.pd.activateSignPortal(player, ChatColor.RED + "Disabled", s); + event.setCancelled(true); + break; + case NetherPortalSign: + event.setCancelled(true); + } + } + + private void takePlayerToDestination(Player player, String destString) { +// if (destString != null) { +// Logging.finer("Found a SignPortal! (" + destString + ")"); +// SafeTTeleporter teleporter = this.plugin.getCore().getSafeTTeleporter(); +// DestinationFactory df = this.plugin.getCore().getDestFactory(); +// +// MVDestination d = df.getDestination(destString); +// Logging.finer("Found a Destination! (" + d + ")"); +// if (this.pd.playerCanGoToDestination(player, d)) { +// TeleportResult result = teleporter.safelyTeleport(player, player, d); +// if (result == TeleportResult.FAIL_UNSAFE) { +// player.sendMessage("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); +// } +// } else { +// Logging.finer("Denied permission to go to destination!"); +// } +// } else { +// player.sendMessage("The Destination was not set on the sign!"); +// } + } +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPluginListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java similarity index 53% rename from src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPluginListener.java rename to src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java index 6eb90b3..f91e6b0 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/listeners/MVSPPluginListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java @@ -5,19 +5,22 @@ * with this project. */ -package com.onarandombox.MultiverseSignPortals.listeners; +package org.mvplugins.multiverse.signportals.listeners; -import com.onarandombox.MultiverseCore.MultiverseCore; -import com.onarandombox.MultiverseSignPortals.MultiverseSignPortals; +import org.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.signportals.MultiverseSignPortals; import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.server.PluginEnableEvent; -public class MVSPPluginListener implements Listener { +@Service +public class MVSPPluginListener implements SignPortalsListener { - private MultiverseSignPortals plugin; + private final MultiverseSignPortals plugin; - public MVSPPluginListener(MultiverseSignPortals plugin) { + @Inject + MVSPPluginListener(@NotNull MultiverseSignPortals plugin) { this.plugin = plugin; } @@ -28,7 +31,7 @@ public MVSPPluginListener(MultiverseSignPortals plugin) { @EventHandler public void onPluginEnable(PluginEnableEvent event) { if (event.getPlugin().getDescription().getName().equals("Multiverse-Core")) { - this.plugin.setCore(((MultiverseCore) plugin.getServer().getPluginManager().getPlugin("Multiverse-Core"))); + // this.plugin.setCore(((MultiverseCore) plugin.getServer().getPluginManager().getPlugin("Multiverse-Core"))); this.plugin.getServer().getPluginManager().enablePlugin(this.plugin); } } diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java new file mode 100644 index 0000000..eabf960 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java @@ -0,0 +1,82 @@ +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.listeners; + +import com.dumptruckman.minecraft.util.Logging; +import org.jetbrains.annotations.NotNull; +import org.mvplugins.multiverse.core.event.MVDebugModeEvent; +import org.mvplugins.multiverse.core.event.MVPlayerTouchedPortalEvent; +import org.mvplugins.multiverse.core.event.MVVersionEvent; +import org.mvplugins.multiverse.core.world.WorldManager; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.signportals.MultiverseSignPortals; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; + +@Service +public class MVSPVersionListener implements SignPortalsListener { + private final MultiverseSignPortals plugin; + + @Inject + MVSPVersionListener(@NotNull MultiverseSignPortals plugin) { + this.plugin = plugin; + } + + /** + * This method is called when Multiverse-Core wants to know what version we are. + * @param event The Version event. + */ + @EventHandler + public void versionEvent(MVVersionEvent event) { + event.appendVersionInfo(this.plugin.getVersionInfo()); + } + + /** + * This method is called when a player touches a portal. + * It's used to handle the intriquite messiness of priority between MV plugins. + * @param event The PTP event. + */ + @EventHandler + public void portalTouchEvent(MVPlayerTouchedPortalEvent event) { + Logging.finer("Found The TouchedPortal event."); + Player p = event.getPlayer(); + Location l = event.getBlockTouched(); + + // TODO +// try { +// String destString = detector.getNotchPortalDestination(p, l); +// +// if (destString != null) { +// MVDestination d = this.plugin.getCore().getDestFactory().getDestination(destString); +// Logging.fine(destString + " ::: " + d); +// if (detector.playerCanGoToDestination(p, d)) { +// // If the player can go to the destination on the sign... +// // We're overriding NetherPortals. +// Logging.fine("Player could go to destination!"); +// event.setCancelled(true); +// } else { +// Logging.fine("Player could NOT go to destination!"); +// } +// } +// +// } catch (NoMultiverseSignFoundException e) { +// // This will simply act as a notch portal. +// Logging.finer("Did NOT find a Multiverse Sign"); +// } catch (MoreThanOneSignFoundException e) { +// p.sendMessage(String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", +// ChatColor.RED, ChatColor.WHITE)); +// } + } + + @EventHandler + public void debugModeChange(MVDebugModeEvent event) { + Logging.setDebugLevel(event.getLevel()); + } +} diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/SignPortalsListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/SignPortalsListener.java new file mode 100644 index 0000000..4ca0c07 --- /dev/null +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/SignPortalsListener.java @@ -0,0 +1,8 @@ +package org.mvplugins.multiverse.signportals.listeners; + +import org.bukkit.event.Listener; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Contract; + +@Contract +public interface SignPortalsListener extends Listener { +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalDetector.java b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java similarity index 83% rename from src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalDetector.java rename to src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java index 478a8d6..f344702 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/PortalDetector.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java @@ -5,15 +5,15 @@ * with this project. */ -package com.onarandombox.MultiverseSignPortals.utils; +package org.mvplugins.multiverse.signportals.utils; import com.dumptruckman.minecraft.util.Logging; -import com.onarandombox.MultiverseCore.api.MVDestination; -import com.onarandombox.MultiverseCore.destination.InvalidDestination; -import com.onarandombox.MultiverseSignPortals.MultiverseSignPortals; -import com.onarandombox.MultiverseSignPortals.enums.Axis; -import com.onarandombox.MultiverseSignPortals.exceptions.MoreThanOneSignFoundException; -import com.onarandombox.MultiverseSignPortals.exceptions.NoMultiverseSignFoundException; +import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.signportals.MultiverseSignPortals; +import org.mvplugins.multiverse.signportals.enums.Axis; +import org.mvplugins.multiverse.signportals.exceptions.MoreThanOneSignFoundException; +import org.mvplugins.multiverse.signportals.exceptions.NoMultiverseSignFoundException; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; @@ -34,12 +34,14 @@ import java.util.List; import java.util.regex.Pattern; +@Service public class PortalDetector { public static final Pattern REDSTONE_TELEPORT_PATTERN = Pattern.compile(".*\\[([pPaAmM]|all|ALL):\\d+(:(north|NORTH|south|SOUTH|east|EAST|west|WEST|up|UP|down|DOWN))?\\]"); private MultiverseSignPortals plugin; - public PortalDetector(MultiverseSignPortals plugin) { + @Inject + PortalDetector(MultiverseSignPortals plugin) { this.plugin = plugin; } @@ -85,21 +87,21 @@ public String getNotchPortalDestination(Player p, Location l) throws MoreThanOne } public void activateSignPortal(Player player, String type, Sign sign) { - if (this.plugin.getCore().getMVPerms().hasPermission(player, "multiverse.signportal.validate", true)) { - // Do 2-stage validation - ChatColor colorToChange = ChatColor.DARK_GREEN; - if(SignTools.isMVSign("mv", ChatColor.GREEN)) { - colorToChange = ChatColor.DARK_BLUE; - player.sendMessage("This vanilla sign portal has been " + ChatColor.GREEN + " Validated!"); - } else { - player.sendMessage("This MV sign portal has been " + ChatColor.GREEN + " Validated!"); - } - sign.setLine(1, SignTools.setColor(sign.getLine(1), colorToChange)); - sign.update(true); - - } else { - player.sendMessage("Sorry you don't have permission to activate this " + type + ChatColor.WHITE + " SignPortal."); - } +// if (this.plugin.getCore().getMVPerms().hasPermission(player, "multiverse.signportal.validate", true)) { +// // Do 2-stage validation +// ChatColor colorToChange = ChatColor.DARK_GREEN; +// if(SignTools.isMVSign("mv", ChatColor.GREEN)) { +// colorToChange = ChatColor.DARK_BLUE; +// player.sendMessage("This vanilla sign portal has been " + ChatColor.GREEN + " Validated!"); +// } else { +// player.sendMessage("This MV sign portal has been " + ChatColor.GREEN + " Validated!"); +// } +// sign.setLine(1, SignTools.setColor(sign.getLine(1), colorToChange)); +// sign.update(true); +// +// } else { +// player.sendMessage("Sorry you don't have permission to activate this " + type + ChatColor.WHITE + " SignPortal."); +// } } /** @@ -144,13 +146,13 @@ private String processSigns(List foundSigns, Player player) throws MoreTha return foundSign.getLine(2); } if (legacySign != null) { - if (this.plugin.getCore().getMVPerms().hasPermission(player, "multiverse.signportal.validate", true)) { - Logging.fine("Migrating Legacy Sign"); - legacySign.setLine(1, SignTools.setColor(legacySign.getLine(1), ChatColor.DARK_BLUE)); - legacySign.update(true); - this.invalidateOtherSigns(legacySign, foundSigns); - return legacySign.getLine(2); - } +// if (this.plugin.getCore().getMVPerms().hasPermission(player, "multiverse.signportal.validate", true)) { +// Logging.fine("Migrating Legacy Sign"); +// legacySign.setLine(1, SignTools.setColor(legacySign.getLine(1), ChatColor.DARK_BLUE)); +// legacySign.update(true); +// this.invalidateOtherSigns(legacySign, foundSigns); +// return legacySign.getLine(2); +// } } if (normalSign != null) { Logging.fine("Migrating Normal Sign"); @@ -345,12 +347,12 @@ private List checkZoneForSigns(Block topper, Block bottomer) { looking.setY(y); for (int z = topper.getZ(); z <= bottomer.getZ(); z++) { looking.setZ(z); - Logging.finest("Looking for sign at " + - this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); +// Logging.finest("Looking for sign at " + +// this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); BlockState signBlock = topper.getWorld().getBlockAt(looking).getState(); if (signBlock instanceof Sign) { - Logging.finer("WOO Found one! " + - this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); +// Logging.finer("WOO Found one! " + +// this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); signs.add((Sign) signBlock); } } @@ -359,13 +361,13 @@ private List checkZoneForSigns(Block topper, Block bottomer) { return signs; } - public boolean playerCanGoToDestination(Player player, MVDestination d) { - if (d instanceof InvalidDestination || !d.isValid()) { - this.plugin.getCore().getMessaging().sendMessage(player, "The Destination on this sign is Invalid!", false); - return false; - } - return this.plugin.getCore().getMVPerms().hasPermission(player, d.getRequiredPermission(), true); - } +// public boolean playerCanGoToDestination(Player player, MVDestination d) { +// if (d instanceof InvalidDestination || !d.isValid()) { +// this.plugin.getCore().getMessaging().sendMessage(player, "The Destination on this sign is Invalid!", false); +// return false; +// } +// return this.plugin.getCore().getMVPerms().hasPermission(player, d.getRequiredPermission(), true); +// } enum RedstoneTeleportType { ALL, diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignStatus.java b/src/main/java/org/mvplugins/multiverse/signportals/utils/SignStatus.java similarity index 82% rename from src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignStatus.java rename to src/main/java/org/mvplugins/multiverse/signportals/utils/SignStatus.java index 29b148e..40acacb 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignStatus.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/SignStatus.java @@ -1,12 +1,12 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.utils; - -public enum SignStatus { - NetherPortalSign, SignPortal, Disabled, Legacy, NotASignPortal -} +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.utils; + +public enum SignStatus { + NetherPortalSign, SignPortal, Disabled, Legacy, NotASignPortal +} diff --git a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignTools.java b/src/main/java/org/mvplugins/multiverse/signportals/utils/SignTools.java similarity index 91% rename from src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignTools.java rename to src/main/java/org/mvplugins/multiverse/signportals/utils/SignTools.java index 7e25946..e98fde4 100644 --- a/src/main/java/com/onarandombox/MultiverseSignPortals/utils/SignTools.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/SignTools.java @@ -1,27 +1,27 @@ -/* - * Multiverse 2 Copyright (c) the Multiverse Team 2011. - * Multiverse 2 is licensed under the BSD License. - * For more information please check the README.md file included - * with this project. - */ - -package com.onarandombox.MultiverseSignPortals.utils; - -import org.bukkit.ChatColor; - -public class SignTools { - public static boolean isMVSign(String test, ChatColor color) { - if (color == null) { - test = ChatColor.stripColor(test); - return test.toLowerCase().matches("[multiverse]") || test.equalsIgnoreCase("[mv]"); - } - return test.equalsIgnoreCase(color + "[multiverse]") || test.equalsIgnoreCase(color + "[mv]"); - } - - public static String setColor(String line, ChatColor color) { - if (isMVSign(line, null)) { - return color + line.substring(line.indexOf("["), line.length()); - } - return line; - } -} +/* + * Multiverse 2 Copyright (c) the Multiverse Team 2011. + * Multiverse 2 is licensed under the BSD License. + * For more information please check the README.md file included + * with this project. + */ + +package org.mvplugins.multiverse.signportals.utils; + +import org.bukkit.ChatColor; + +public class SignTools { + public static boolean isMVSign(String test, ChatColor color) { + if (color == null) { + test = ChatColor.stripColor(test); + return test.toLowerCase().matches("[multiverse]") || test.equalsIgnoreCase("[mv]"); + } + return test.equalsIgnoreCase(color + "[multiverse]") || test.equalsIgnoreCase(color + "[mv]"); + } + + public static String setColor(String line, ChatColor color) { + if (isMVSign(line, null)) { + return color + line.substring(line.indexOf("["), line.length()); + } + return line; + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1eaf0a7..fa4ffd0 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Multiverse-SignPortals -main: com.onarandombox.MultiverseSignPortals.MultiverseSignPortals +main: org.mvplugins.multiverse.signportals.MultiverseSignPortals authors: ['Rigby','fernferret'] version: ${version} api-version: 1.13 From 7be8f7e39f051570e2e52b6b861338fbac21deca Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sat, 18 Jan 2025 21:09:24 +0800 Subject: [PATCH 2/2] Fully convert to MV5 api --- build.gradle | 8 +- .../signportals/MultiverseSignPortals.java | 8 +- .../MultiverseSignPortalsPluginBinder.java | 2 +- .../listeners/MVSPBlockListener.java | 99 ++++++++++--------- .../listeners/MVSPPlayerListener.java | 99 +++++++++++-------- .../listeners/MVSPPluginListener.java | 2 +- .../listeners/MVSPVersionListener.java | 74 ++++++++------ .../signportals/utils/PortalDetector.java | 65 ++++++------ 8 files changed, 201 insertions(+), 156 deletions(-) diff --git a/build.gradle b/build.gradle index 7d6e8c6..47ed002 100644 --- a/build.gradle +++ b/build.gradle @@ -28,6 +28,12 @@ repositories { name = 'onarandombox' url = uri('https://repo.onarandombox.com/content/groups/public/') } + + maven { + // todo: remove before mv5 release + name = 'benwoo1110' + url = uri('https://repo.c0ding.party/multiverse-beta') + } } dependencies { @@ -37,7 +43,7 @@ dependencies { } // Core - implementation 'org.mvplugins.multiverse.core:multiverse-core:local' + implementation 'org.mvplugins.multiverse.core:multiverse-core:5.0.0-SNAPSHOT' // Utils api('com.dumptruckman.minecraft:Logging:1.1.1') { diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index e59233c..06904d6 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -9,10 +9,10 @@ import com.dumptruckman.minecraft.util.Logging; import org.mvplugins.multiverse.core.MultiverseCore; -import org.mvplugins.multiverse.core.api.MVConfig; -import org.mvplugins.multiverse.core.api.MVCore; -import org.mvplugins.multiverse.core.api.MVPlugin; +import org.mvplugins.multiverse.core.api.config.MVCoreConfig; import org.mvplugins.multiverse.core.inject.PluginServiceLocator; +import org.mvplugins.multiverse.core.submodules.MVCore; +import org.mvplugins.multiverse.core.submodules.MVPlugin; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.external.vavr.control.Option; import org.mvplugins.multiverse.external.vavr.control.Try; @@ -57,7 +57,7 @@ public void onEnable() { initializeDependencyInjection(); registerEvents(); - Logging.setDebugLevel(serviceLocator.getActiveService(MVConfig.class).getGlobalDebug()); + Logging.setDebugLevel(serviceLocator.getActiveService(MVCoreConfig.class).getGlobalDebug()); this.core.incrementPluginCount(); Logging.log(true, Level.INFO, " Enabled - By %s", getAuthors()); diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java index efd607b..fda2c74 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java @@ -1,7 +1,7 @@ package org.mvplugins.multiverse.signportals; -import org.mvplugins.multiverse.core.api.MVPlugin; import org.mvplugins.multiverse.core.inject.binder.JavaPluginBinder; +import org.mvplugins.multiverse.core.submodules.MVPlugin; import org.mvplugins.multiverse.external.glassfish.hk2.utilities.binding.ScopedBindingBuilder; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java index 9f872a4..7fb3f02 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java @@ -8,8 +8,15 @@ package org.mvplugins.multiverse.signportals.listeners; import com.dumptruckman.minecraft.util.Logging; -import org.jetbrains.annotations.NotNull; +import org.bukkit.Bukkit; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.PluginManager; +import org.mvplugins.multiverse.core.api.destination.DestinationInstance; +import org.mvplugins.multiverse.core.api.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.api.teleportation.SafetyTeleporter; import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.signportals.MultiverseSignPortals; import org.mvplugins.multiverse.signportals.utils.PortalDetector; @@ -28,19 +35,30 @@ import org.bukkit.event.block.SignChangeEvent; import org.bukkit.material.RedstoneTorch; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission; + @Service public class MVSPBlockListener implements SignPortalsListener { private final String CREATE_PERM = "multiverse.signportal.create"; private final MultiverseSignPortals plugin; private final PortalDetector pd; - // private MVPermissions permissions; + private final PortalDetector portalDetector; + private final DestinationsProvider destinationsProvider; + private final SafetyTeleporter safetyTeleporter; @Inject - public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, @NotNull PortalDetector pd) { + public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, + @NotNull PortalDetector pd, + @NotNull PluginManager pluginManager, + @NotNull PortalDetector portalDetector, + @NotNull DestinationsProvider destinationsProvider, + @NotNull SafetyTeleporter safetyTeleporter) { this.plugin = plugin; this.pd = pd; -// this.permissions = this.plugin.getCore().getMVPerms(); -// this.permissions.addPermission(CREATE_PERM, PermissionDefault.OP); + this.portalDetector = portalDetector; + this.destinationsProvider = destinationsProvider; + this.safetyTeleporter = safetyTeleporter; + pluginManager.addPermission(new Permission(CREATE_PERM, PermissionDefault.OP)); } @EventHandler @@ -80,33 +98,20 @@ public void redstonePower(BlockRedstoneEvent event) { } private void takeEntityToDestination(Entity entity, String destString) { -// if (destString != null) { -// SafeTTeleporter teleporter = plugin.getCore().getSafeTTeleporter(); -// MVDestination d = plugin.getCore().getDestFactory().getDestination(destString); -// Logging.finer("Found a Destination! (" + d + ")"); -// if (entity instanceof Player) { -// Player player = (Player) entity; -// if (plugin.getPortalDetector().playerCanGoToDestination(player, d)) { -// TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), player, d); -// if (result == TeleportResult.FAIL_UNSAFE) { -// Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); -// } else { -// Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); -// } -// } else { -// Logging.finer("Denied permission to go to destination!"); -// } -// } else { -// TeleportResult result = teleporter.safelyTeleport(Bukkit.getConsoleSender(), entity, d.getLocation(entity), true); -// if (result == TeleportResult.FAIL_UNSAFE) { -// Logging.finer("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); -// } else { -// Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d); -// } -// } -// } else { -// Logging.finer("The destination was not set on the sign!"); -// } + if (destString == null) { + Logging.finer("The destination was not set on the sign!"); + } + DestinationInstance d = destinationsProvider.parseDestination(destString).getOrNull(); + if (d == null) { + Logging.warning("Could not find destination: " + destString); + return; + } + Logging.finer("Found a Destination! (" + d + ")"); + safetyTeleporter.to(d) + .by(Bukkit.getConsoleSender()) + .teleport(entity) + .onSuccess(() -> Logging.finer("Teleported " + entity + " to: " + ChatColor.GREEN + d)) + .onFailure(error -> Logging.warning("Failed to teleport " + entity + " to: " + d + " (" + error + ")")); } private Block getNearbySign(Block block, boolean torch) { @@ -148,11 +153,11 @@ public void onBlockBreak(BlockBreakEvent event) { if (state instanceof Sign) { Sign s = (Sign) state; if (pd.getSignStatus(s) == SignStatus.NetherPortalSign || pd.getSignStatus(s) == SignStatus.SignPortal) { -// if (!this.permissions.hasPermission(event.getPlayer(), CREATE_PERM, true)) { -// event.setCancelled(true); -// event.getPlayer().sendMessage("You don't have permission to destroy a SignPortal!"); -// event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); -// } + if (!hasPermission(event.getPlayer(), CREATE_PERM)) { + event.setCancelled(true); + event.getPlayer().sendMessage("You don't have permission to destroy a SignPortal!"); + event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); + } } } } @@ -167,16 +172,16 @@ private void checkForHack(SignChangeEvent event) { } private void createMultiverseSignPortal(SignChangeEvent event) { -// if (this.plugin.getCore().getMVPerms().hasPermission(event.getPlayer(), "multiverse.signportal.create", true)) { -// Logging.finer("MV SignPortal Created"); -// event.setLine(1, ChatColor.DARK_GREEN + event.getLine(1)); -// checkRedstoneTeleportTargets(event); -// } else { -// Logging.finer("No Perms to create"); -// event.setLine(1, ChatColor.DARK_RED + event.getLine(1)); -// event.getPlayer().sendMessage("You don't have permission to create a SignPortal!"); -// event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); -// } + if (hasPermission(event.getPlayer(), "multiverse.signportal.create")) { + Logging.finer("MV SignPortal Created"); + event.setLine(1, ChatColor.DARK_GREEN + event.getLine(1)); + checkRedstoneTeleportTargets(event); + } else { + Logging.finer("No Perms to create"); + event.setLine(1, ChatColor.DARK_RED + event.getLine(1)); + event.getPlayer().sendMessage("You don't have permission to create a SignPortal!"); + event.getPlayer().sendMessage(ChatColor.GREEN + CREATE_PERM); + } } private void checkRedstoneTeleportTargets(SignChangeEvent event) { diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java index fde1551..2b98ad3 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java @@ -8,8 +8,15 @@ package org.mvplugins.multiverse.signportals.listeners; import com.dumptruckman.minecraft.util.Logging; -import org.jetbrains.annotations.NotNull; +import org.bukkit.Location; +import org.bukkit.permissions.Permission; +import org.bukkit.permissions.PermissionDefault; +import org.bukkit.plugin.PluginManager; +import org.mvplugins.multiverse.core.api.destination.DestinationInstance; +import org.mvplugins.multiverse.core.api.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.api.teleportation.SafetyTeleporter; import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.signportals.MultiverseSignPortals; import org.mvplugins.multiverse.signportals.exceptions.MoreThanOneSignFoundException; @@ -24,21 +31,26 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerPortalEvent; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission; + @Service public class MVSPPlayerListener implements SignPortalsListener { private static final String USE_PERMISSION = "multiverse.signportal.use"; private static final String VALIDATE_PERMISSION = "multiverse.signportal.validate"; - private final MultiverseSignPortals plugin; - // private final MVPermissions permissions; + private final DestinationsProvider destinationsProvider; + private final SafetyTeleporter safetyTeleporter; private final PortalDetector pd; @Inject - MVSPPlayerListener(@NotNull MultiverseSignPortals plugin, @NotNull PortalDetector pd) { - this.plugin = plugin; -// this.permissions = this.plugin.getCore().getMVPerms(); -// this.permissions.addPermission(VALIDATE_PERMISSION, PermissionDefault.OP); -// this.permissions.addPermission(USE_PERMISSION, PermissionDefault.TRUE); + MVSPPlayerListener(@NotNull PortalDetector pd, + @NotNull PluginManager pluginManager, + @NotNull DestinationsProvider destinationsProvider, + @NotNull SafetyTeleporter safetyTeleporter) { + this.destinationsProvider = destinationsProvider; + this.safetyTeleporter = safetyTeleporter; + pluginManager.addPermission(new Permission(VALIDATE_PERMISSION, PermissionDefault.OP)); + pluginManager.addPermission(new Permission(USE_PERMISSION, PermissionDefault.TRUE)); this.pd = pd; } @@ -55,21 +67,26 @@ public void playerPortal(PlayerPortalEvent event) { String destString = pd.getNotchPortalDestination(event.getPlayer(), event.getFrom()); if (destString != null) { Logging.finer("Found a Multiverse Sign"); -// DestinationFactory df = this.plugin.getCore().getDestFactory(); -// destString = ChatColor.stripColor(destString); -// MVDestination dest = df.getDestination(destString); -// MVSPTravelAgent travelAgent = new MVSPTravelAgent(this.plugin.getCore(), dest, event.getPlayer()); -// travelAgent.setPortalEventTravelAgent(event); -// event.setTo(dest.getLocation(event.getPlayer())); + destString = ChatColor.stripColor(destString); + DestinationInstance dest = destinationsProvider.parseDestination(destString).getOrNull(); + if (dest == null) { + Logging.warning("Could not find destination: " + destString); + return; + } + Location destLocation = dest.getLocation(event.getPlayer()).getOrNull(); + if (destLocation == null) { + Logging.warning("Could not find Location for destination: " + destString); + return; + } + event.setTo(destLocation); } } catch (NoMultiverseSignFoundException e) { // This will simply act as a notch portal. Logging.finer("Did NOT find a Multiverse Sign"); } catch (MoreThanOneSignFoundException e) { -// this.plugin.getCore().getMessaging().sendMessage(event.getPlayer(), -// String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", -// ChatColor.RED, ChatColor.WHITE), false); + event.getPlayer().sendMessage(String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", + ChatColor.RED, ChatColor.WHITE)); event.setCancelled(true); } } @@ -102,12 +119,12 @@ public void playerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); switch (status) { case SignPortal: -// if (permissions.hasPermission(player, USE_PERMISSION, false)) { -// String destString = this.pd.processSign(s); -// this.takePlayerToDestination(player, destString); -// } else { -// player.sendMessage(ChatColor.RED + "You do not have the required permission to use SignPortals (" + USE_PERMISSION + ")"); -// } + if (hasPermission(player, USE_PERMISSION)) { + String destString = this.pd.processSign(s); + this.takePlayerToDestination(player, destString); + } else { + player.sendMessage(ChatColor.RED + "You do not have the required permission to use SignPortals (" + USE_PERMISSION + ")"); + } event.setCancelled(true); break; case Legacy: @@ -124,23 +141,23 @@ public void playerInteract(PlayerInteractEvent event) { } private void takePlayerToDestination(Player player, String destString) { -// if (destString != null) { -// Logging.finer("Found a SignPortal! (" + destString + ")"); -// SafeTTeleporter teleporter = this.plugin.getCore().getSafeTTeleporter(); -// DestinationFactory df = this.plugin.getCore().getDestFactory(); -// -// MVDestination d = df.getDestination(destString); -// Logging.finer("Found a Destination! (" + d + ")"); -// if (this.pd.playerCanGoToDestination(player, d)) { -// TeleportResult result = teleporter.safelyTeleport(player, player, d); -// if (result == TeleportResult.FAIL_UNSAFE) { -// player.sendMessage("The Destination was not safe! (" + ChatColor.RED + d + ChatColor.WHITE + ")"); -// } -// } else { -// Logging.finer("Denied permission to go to destination!"); -// } -// } else { -// player.sendMessage("The Destination was not set on the sign!"); -// } + if (destString != null) { + Logging.finer("Found a SignPortal! (" + destString + ")"); + DestinationInstance d = destinationsProvider.parseDestination(destString).getOrNull(); + if (d == null) { + Logging.warning("Could not find destination: " + destString); + return; + } + Logging.finer("Found a Destination! (" + d + ")"); + if (this.pd.playerCanGoToDestination(player, d)) { + safetyTeleporter.to(d).teleport(player) + .onSuccess(() -> player.sendMessage("Teleported " + player.getName() + " to: " + ChatColor.GREEN + d)) + .onFailure(result -> player.sendMessage("Could not teleport " + player.getName() + " to: " + ChatColor.RED + d)); + } else { + Logging.finer("Denied permission to go to destination!"); + } + } else { + player.sendMessage("The Destination was not set on the sign!"); + } } } diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java index f91e6b0..160fa3d 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPluginListener.java @@ -7,8 +7,8 @@ package org.mvplugins.multiverse.signportals.listeners; -import org.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.signportals.MultiverseSignPortals; import org.bukkit.event.EventHandler; diff --git a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java index eabf960..fb8107f 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java @@ -8,25 +8,36 @@ package org.mvplugins.multiverse.signportals.listeners; import com.dumptruckman.minecraft.util.Logging; -import org.jetbrains.annotations.NotNull; -import org.mvplugins.multiverse.core.event.MVDebugModeEvent; -import org.mvplugins.multiverse.core.event.MVPlayerTouchedPortalEvent; -import org.mvplugins.multiverse.core.event.MVVersionEvent; -import org.mvplugins.multiverse.core.world.WorldManager; +import org.bukkit.ChatColor; +import org.mvplugins.multiverse.core.api.destination.DestinationInstance; +import org.mvplugins.multiverse.core.api.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.api.event.MVDebugModeEvent; +import org.mvplugins.multiverse.core.api.event.MVDumpsDebugInfoEvent; +import org.mvplugins.multiverse.core.api.event.MVPlayerTouchedPortalEvent; import org.mvplugins.multiverse.external.jakarta.inject.Inject; +import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.signportals.MultiverseSignPortals; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.mvplugins.multiverse.signportals.exceptions.MoreThanOneSignFoundException; +import org.mvplugins.multiverse.signportals.exceptions.NoMultiverseSignFoundException; +import org.mvplugins.multiverse.signportals.utils.PortalDetector; @Service public class MVSPVersionListener implements SignPortalsListener { private final MultiverseSignPortals plugin; + private final PortalDetector detector; + private final DestinationsProvider destinationsProvider; @Inject - MVSPVersionListener(@NotNull MultiverseSignPortals plugin) { + MVSPVersionListener(@NotNull MultiverseSignPortals plugin, + @NotNull PortalDetector detector, + @NotNull DestinationsProvider destinationsProvider) { this.plugin = plugin; + this.detector = detector; + this.destinationsProvider = destinationsProvider; } /** @@ -34,8 +45,8 @@ public class MVSPVersionListener implements SignPortalsListener { * @param event The Version event. */ @EventHandler - public void versionEvent(MVVersionEvent event) { - event.appendVersionInfo(this.plugin.getVersionInfo()); + public void versionEvent(MVDumpsDebugInfoEvent event) { + event.appendDebugInfo(this.plugin.getVersionInfo()); } /** @@ -49,30 +60,29 @@ public void portalTouchEvent(MVPlayerTouchedPortalEvent event) { Player p = event.getPlayer(); Location l = event.getBlockTouched(); - // TODO -// try { -// String destString = detector.getNotchPortalDestination(p, l); -// -// if (destString != null) { -// MVDestination d = this.plugin.getCore().getDestFactory().getDestination(destString); -// Logging.fine(destString + " ::: " + d); -// if (detector.playerCanGoToDestination(p, d)) { -// // If the player can go to the destination on the sign... -// // We're overriding NetherPortals. -// Logging.fine("Player could go to destination!"); -// event.setCancelled(true); -// } else { -// Logging.fine("Player could NOT go to destination!"); -// } -// } -// -// } catch (NoMultiverseSignFoundException e) { -// // This will simply act as a notch portal. -// Logging.finer("Did NOT find a Multiverse Sign"); -// } catch (MoreThanOneSignFoundException e) { -// p.sendMessage(String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", -// ChatColor.RED, ChatColor.WHITE)); -// } + try { + String destString = detector.getNotchPortalDestination(p, l); + + if (destString != null) { + DestinationInstance d = this.destinationsProvider.parseDestination(destString).getOrNull(); + Logging.fine(destString + " ::: " + d); + if (detector.playerCanGoToDestination(p, d)) { + // If the player can go to the destination on the sign... + // We're overriding NetherPortals. + Logging.fine("Player could go to destination!"); + event.setCancelled(true); + } else { + Logging.fine("Player could NOT go to destination!"); + } + } + + } catch (NoMultiverseSignFoundException e) { + // This will simply act as a notch portal. + Logging.finer("Did NOT find a Multiverse Sign"); + } catch (MoreThanOneSignFoundException e) { + p.sendMessage(String.format("%sSorry %sbut more than 1 sign was found where the second line was [mv] or [multiverse]. Please remove one of the signs.", + ChatColor.RED, ChatColor.WHITE)); + } } @EventHandler diff --git a/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java index f344702..2e676c8 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java @@ -8,6 +8,9 @@ package org.mvplugins.multiverse.signportals.utils; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.core.api.destination.DestinationInstance; +import org.mvplugins.multiverse.core.api.teleportation.LocationManipulation; +import org.mvplugins.multiverse.core.permissions.CorePermissionsChecker; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.signportals.MultiverseSignPortals; @@ -34,15 +37,19 @@ import java.util.List; import java.util.regex.Pattern; +import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission; + @Service public class PortalDetector { public static final Pattern REDSTONE_TELEPORT_PATTERN = Pattern.compile(".*\\[([pPaAmM]|all|ALL):\\d+(:(north|NORTH|south|SOUTH|east|EAST|west|WEST|up|UP|down|DOWN))?\\]"); - private MultiverseSignPortals plugin; + private final LocationManipulation locationManipulation; + private final CorePermissionsChecker permissionsChecker; @Inject - PortalDetector(MultiverseSignPortals plugin) { - this.plugin = plugin; + PortalDetector(LocationManipulation locationManipulation, CorePermissionsChecker permissionsChecker) { + this.locationManipulation = locationManipulation; + this.permissionsChecker = permissionsChecker; } public String getNotchPortalDestination(Player p, Location l) throws MoreThanOneSignFoundException, NoMultiverseSignFoundException { @@ -87,21 +94,21 @@ public String getNotchPortalDestination(Player p, Location l) throws MoreThanOne } public void activateSignPortal(Player player, String type, Sign sign) { -// if (this.plugin.getCore().getMVPerms().hasPermission(player, "multiverse.signportal.validate", true)) { -// // Do 2-stage validation -// ChatColor colorToChange = ChatColor.DARK_GREEN; -// if(SignTools.isMVSign("mv", ChatColor.GREEN)) { -// colorToChange = ChatColor.DARK_BLUE; -// player.sendMessage("This vanilla sign portal has been " + ChatColor.GREEN + " Validated!"); -// } else { -// player.sendMessage("This MV sign portal has been " + ChatColor.GREEN + " Validated!"); -// } -// sign.setLine(1, SignTools.setColor(sign.getLine(1), colorToChange)); -// sign.update(true); -// -// } else { -// player.sendMessage("Sorry you don't have permission to activate this " + type + ChatColor.WHITE + " SignPortal."); -// } + if (hasPermission(player, "multiverse.signportal.validate")) { + // Do 2-stage validation + ChatColor colorToChange = ChatColor.DARK_GREEN; + if(SignTools.isMVSign("mv", ChatColor.GREEN)) { + colorToChange = ChatColor.DARK_BLUE; + player.sendMessage("This vanilla sign portal has been " + ChatColor.GREEN + " Validated!"); + } else { + player.sendMessage("This MV sign portal has been " + ChatColor.GREEN + " Validated!"); + } + sign.setLine(1, SignTools.setColor(sign.getLine(1), colorToChange)); + sign.update(true); + + } else { + player.sendMessage("Sorry you don't have permission to activate this " + type + ChatColor.WHITE + " SignPortal."); + } } /** @@ -347,12 +354,12 @@ private List checkZoneForSigns(Block topper, Block bottomer) { looking.setY(y); for (int z = topper.getZ(); z <= bottomer.getZ(); z++) { looking.setZ(z); -// Logging.finest("Looking for sign at " + -// this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); + Logging.finest("Looking for sign at " + + this.locationManipulation.strCoordsRaw(looking)); BlockState signBlock = topper.getWorld().getBlockAt(looking).getState(); if (signBlock instanceof Sign) { -// Logging.finer("WOO Found one! " + -// this.plugin.getCore().getLocationManipulation().strCoordsRaw(looking)); + Logging.finer("WOO Found one! " + + this.locationManipulation.strCoordsRaw(looking)); signs.add((Sign) signBlock); } } @@ -361,13 +368,13 @@ private List checkZoneForSigns(Block topper, Block bottomer) { return signs; } -// public boolean playerCanGoToDestination(Player player, MVDestination d) { -// if (d instanceof InvalidDestination || !d.isValid()) { -// this.plugin.getCore().getMessaging().sendMessage(player, "The Destination on this sign is Invalid!", false); -// return false; -// } -// return this.plugin.getCore().getMVPerms().hasPermission(player, d.getRequiredPermission(), true); -// } + public boolean playerCanGoToDestination(Player player, DestinationInstance d) { + if (d == null) { + player.sendMessage("The Destination on this sign is Invalid!"); + return false; + } + return permissionsChecker.checkTeleportPermissions(player, player, d); + } enum RedstoneTeleportType { ALL,