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 01/12] 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 02/12] 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, From a35cf7bb01e58c37719546d387f57148d97902a3 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sun, 9 Feb 2025 19:15:21 +0800 Subject: [PATCH 03/12] Update for latest mv5 api support --- .../signportals/MultiverseSignPortals.java | 63 ++++--------------- .../MultiverseSignPortalsPluginBinder.java | 3 +- .../listeners/MVSPBlockListener.java | 10 +-- .../listeners/MVSPPlayerListener.java | 11 ++-- .../listeners/MVSPVersionListener.java | 10 +-- .../signportals/utils/PortalDetector.java | 5 +- 6 files changed, 30 insertions(+), 72 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index 06904d6..67afa79 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -8,23 +8,23 @@ package org.mvplugins.multiverse.signportals; import com.dumptruckman.minecraft.util.Logging; -import org.mvplugins.multiverse.core.MultiverseCore; -import org.mvplugins.multiverse.core.api.config.MVCoreConfig; +import org.mvplugins.multiverse.core.MultiverseCoreApi; +import org.mvplugins.multiverse.core.MultiversePlugin; +import org.mvplugins.multiverse.core.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.core.inject.PluginServiceLocatorFactory; +import org.mvplugins.multiverse.core.utils.StringFormatter; 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 { +public class MultiverseSignPortals extends MultiversePlugin { - private MultiverseCore core; + private MultiverseCoreApi core; private PluginServiceLocator serviceLocator; private final static int requiresProtocol = 50; @@ -38,29 +38,13 @@ public void onLoad() { public void onEnable() { Logging.init(this); - this.core = (MultiverseCore) getServer().getPluginManager().getPlugin("Multiverse-Core"); - // Test if the Core was found, if not we'll disable this plugin. - if (this.core == null) { - Logging.info("Multiverse-Core not found, will keep looking."); - getServer().getPluginManager().disablePlugin(this); - return; - } - if (this.core.getProtocolVersion() < requiresProtocol) { - Logging.severe("Your Multiverse-Core is OUT OF DATE"); - Logging.severe("This version of SignPortals requires Protocol Level: " + requiresProtocol); - Logging.severe("Your of Core Protocol Level is: " + this.core.getProtocolVersion()); - Logging.severe("Grab an updated copy at: "); - Logging.severe("http://dev.bukkit.org/bukkit-plugins/multiverse-core/"); - getServer().getPluginManager().disablePlugin(this); - return; - } + this.core = MultiverseCoreApi.get(); initializeDependencyInjection(); registerEvents(); Logging.setDebugLevel(serviceLocator.getActiveService(MVCoreConfig.class).getGlobalDebug()); - this.core.incrementPluginCount(); - Logging.log(true, Level.INFO, " Enabled - By %s", getAuthors()); + Logging.log(true, Level.INFO, " Enabled - By %s", StringFormatter.joinAnd(getDescription().getAuthors())); } public void onDisable() { @@ -70,7 +54,7 @@ public void onDisable() { } private void initializeDependencyInjection() { - serviceLocator = core.getServiceLocatorFactory() + serviceLocator = PluginServiceLocatorFactory.get() .registerPlugin(new MultiverseSignPortalsPluginBinder(this), core.getServiceLocator()) .flatMap(PluginServiceLocator::enable) .getOrElseThrow(exception -> { @@ -102,24 +86,6 @@ private void registerEvents() { }); } - /** - * Parse the Authors Array into a readable String with ',' and 'and'. - * - * @return An comma separated string of authors - */ - @Override - public String getAuthors() { - String authors = ""; - for (int i = 0; i < this.getDescription().getAuthors().size(); i++) { - if (i == this.getDescription().getAuthors().size() - 1) { - authors += " and " + this.getDescription().getAuthors().get(i); - } else { - authors += ", " + this.getDescription().getAuthors().get(i); - } - } - return authors.substring(2); - } - @Override public PluginServiceLocator getServiceLocator() { return serviceLocator; @@ -130,12 +96,7 @@ public String getVersionInfo() { } @Override - public MVCore getCore() { - return this.core; - } - - @Override - public int getProtocolVersion() { - return 1; + public int getTargetCoreProtocolVersion() { + return requiresProtocol; } } diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java index fda2c74..d7d304e 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java @@ -1,7 +1,6 @@ package org.mvplugins.multiverse.signportals; 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; @@ -14,6 +13,6 @@ protected MultiverseSignPortalsPluginBinder(@NotNull MultiverseSignPortals plugi @Override protected ScopedBindingBuilder bindPluginClass( ScopedBindingBuilder bindingBuilder) { - return super.bindPluginClass(bindingBuilder).to(MVPlugin.class).to(MultiverseSignPortals.class); + return super.bindPluginClass(bindingBuilder).to(MultiverseSignPortals.class); } } 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 7fb3f02..7dd4e05 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java @@ -12,9 +12,9 @@ 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.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter; 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; @@ -44,7 +44,7 @@ public class MVSPBlockListener implements SignPortalsListener { private final PortalDetector pd; private final PortalDetector portalDetector; private final DestinationsProvider destinationsProvider; - private final SafetyTeleporter safetyTeleporter; + private final AsyncSafetyTeleporter safetyTeleporter; @Inject public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, @@ -52,7 +52,7 @@ public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, @NotNull PluginManager pluginManager, @NotNull PortalDetector portalDetector, @NotNull DestinationsProvider destinationsProvider, - @NotNull SafetyTeleporter safetyTeleporter) { + @NotNull AsyncSafetyTeleporter safetyTeleporter) { this.plugin = plugin; this.pd = pd; this.portalDetector = portalDetector; 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 2b98ad3..bb3171a 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPPlayerListener.java @@ -12,13 +12,12 @@ 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.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter; 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; import org.mvplugins.multiverse.signportals.exceptions.NoMultiverseSignFoundException; import org.mvplugins.multiverse.signportals.utils.PortalDetector; @@ -39,14 +38,14 @@ 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 DestinationsProvider destinationsProvider; - private final SafetyTeleporter safetyTeleporter; + private final AsyncSafetyTeleporter safetyTeleporter; private final PortalDetector pd; @Inject MVSPPlayerListener(@NotNull PortalDetector pd, @NotNull PluginManager pluginManager, @NotNull DestinationsProvider destinationsProvider, - @NotNull SafetyTeleporter safetyTeleporter) { + @NotNull AsyncSafetyTeleporter safetyTeleporter) { this.destinationsProvider = destinationsProvider; this.safetyTeleporter = safetyTeleporter; pluginManager.addPermission(new Permission(VALIDATE_PERMISSION, PermissionDefault.OP)); 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 fb8107f..679bc40 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPVersionListener.java @@ -9,11 +9,11 @@ import com.dumptruckman.minecraft.util.Logging; 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.core.destination.DestinationInstance; +import org.mvplugins.multiverse.core.destination.DestinationsProvider; +import org.mvplugins.multiverse.core.event.MVDebugModeEvent; +import org.mvplugins.multiverse.core.event.MVDumpsDebugInfoEvent; +import org.mvplugins.multiverse.core.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; 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 2e676c8..a1ceaaa 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java @@ -8,12 +8,11 @@ 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.destination.DestinationInstance; +import org.mvplugins.multiverse.core.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; import org.mvplugins.multiverse.signportals.enums.Axis; import org.mvplugins.multiverse.signportals.exceptions.MoreThanOneSignFoundException; import org.mvplugins.multiverse.signportals.exceptions.NoMultiverseSignFoundException; From ed72a98ce36ab53c0e9372749d2a023b70c40261 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sun, 9 Feb 2025 20:29:56 +0800 Subject: [PATCH 04/12] Remove use of legacy material data --- .../signportals/listeners/MVSPBlockListener.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) 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 7dd4e05..8876bc5 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/listeners/MVSPBlockListener.java @@ -9,6 +9,7 @@ import com.dumptruckman.minecraft.util.Logging; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; import org.bukkit.plugin.PluginManager; @@ -33,7 +34,6 @@ import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockRedstoneEvent; import org.bukkit.event.block.SignChangeEvent; -import org.bukkit.material.RedstoneTorch; import static org.mvplugins.multiverse.core.permissions.PermissionUtils.hasPermission; @@ -42,7 +42,6 @@ public class MVSPBlockListener implements SignPortalsListener { private final String CREATE_PERM = "multiverse.signportal.create"; private final MultiverseSignPortals plugin; private final PortalDetector pd; - private final PortalDetector portalDetector; private final DestinationsProvider destinationsProvider; private final AsyncSafetyTeleporter safetyTeleporter; @@ -50,12 +49,10 @@ public class MVSPBlockListener implements SignPortalsListener { public MVSPBlockListener(@NotNull MultiverseSignPortals plugin, @NotNull PortalDetector pd, @NotNull PluginManager pluginManager, - @NotNull PortalDetector portalDetector, @NotNull DestinationsProvider destinationsProvider, @NotNull AsyncSafetyTeleporter safetyTeleporter) { this.plugin = plugin; this.pd = pd; - this.portalDetector = portalDetector; this.destinationsProvider = destinationsProvider; this.safetyTeleporter = safetyTeleporter; pluginManager.addPermission(new Permission(CREATE_PERM, PermissionDefault.OP)); @@ -79,10 +76,9 @@ public void redstonePower(BlockRedstoneEvent event) { if (event.getNewCurrent() <= 0) { return; } - boolean torch = false; - if (event.getBlock().getState().getData() instanceof RedstoneTorch) { - torch = true; - } + Logging.fine("Redstone power: " + event.getNewCurrent()); + boolean torch = event.getBlock().getType() == Material.REDSTONE_TORCH + || event.getBlock().getType() == Material.REDSTONE_WALL_TORCH; Block block = getNearbySign(event.getBlock(), torch); if (block == null) { return; From 6741c11a320414640e2eee5090dd8a5a9b9b63be Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Thu, 6 Mar 2025 21:21:34 +0800 Subject: [PATCH 05/12] Fix permission checking with destination --- .../multiverse/signportals/utils/PortalDetector.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 a1ceaaa..c91f1d7 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/utils/PortalDetector.java @@ -368,11 +368,11 @@ private List checkZoneForSigns(Block topper, Block bottomer) { } 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); + if (d == null) { + player.sendMessage("The Destination on this sign is Invalid!"); + return false; + } + return true; } enum RedstoneTeleportType { From c90479596a5da3a53dbcea8b979c28145b895c0d Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:28:52 +0800 Subject: [PATCH 06/12] Update to suppport core api changes --- .../multiverse/signportals/MultiverseSignPortals.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index 67afa79..0c466a7 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -10,7 +10,7 @@ import com.dumptruckman.minecraft.util.Logging; import org.mvplugins.multiverse.core.MultiverseCoreApi; import org.mvplugins.multiverse.core.MultiversePlugin; -import org.mvplugins.multiverse.core.config.MVCoreConfig; +import org.mvplugins.multiverse.core.config.CoreConfig; import org.mvplugins.multiverse.core.inject.PluginServiceLocator; import org.mvplugins.multiverse.core.inject.PluginServiceLocatorFactory; import org.mvplugins.multiverse.core.utils.StringFormatter; @@ -42,7 +42,7 @@ public void onEnable() { initializeDependencyInjection(); registerEvents(); - Logging.setDebugLevel(serviceLocator.getActiveService(MVCoreConfig.class).getGlobalDebug()); + Logging.setDebugLevel(serviceLocator.getActiveService(CoreConfig.class).getGlobalDebug()); Logging.log(true, Level.INFO, " Enabled - By %s", StringFormatter.joinAnd(getDescription().getAuthors())); } From 02debe39de71c9becab8a0547029a8c5104210ea Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sat, 29 Mar 2025 18:28:34 +0800 Subject: [PATCH 07/12] Update to support core api changes --- .../multiverse/signportals/MultiverseSignPortals.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index 0c466a7..e42ab78 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -24,11 +24,11 @@ @Service public class MultiverseSignPortals extends MultiversePlugin { + private static final double TARGET_CORE_API_VERSION = 5.0; + private MultiverseCoreApi core; private PluginServiceLocator serviceLocator; - private final static int requiresProtocol = 50; - /** This fires before I get Enabled. */ public void onLoad() { Logging.init(this); @@ -96,7 +96,7 @@ public String getVersionInfo() { } @Override - public int getTargetCoreProtocolVersion() { - return requiresProtocol; + public double getTargetCoreVersion() { + return TARGET_CORE_API_VERSION; } } From e02af3f768ce9bb2ef222ec762dbf54ca0820f27 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Sun, 13 Apr 2025 13:51:46 +0800 Subject: [PATCH 08/12] Update to support core api changes --- .../signportals/MultiverseSignPortals.java | 53 +++---------------- .../MultiverseSignPortalsPluginBinder.java | 3 +- 2 files changed, 9 insertions(+), 47 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java index e42ab78..f4132cf 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortals.java @@ -9,83 +9,44 @@ import com.dumptruckman.minecraft.util.Logging; import org.mvplugins.multiverse.core.MultiverseCoreApi; -import org.mvplugins.multiverse.core.MultiversePlugin; import org.mvplugins.multiverse.core.config.CoreConfig; import org.mvplugins.multiverse.core.inject.PluginServiceLocator; -import org.mvplugins.multiverse.core.inject.PluginServiceLocatorFactory; +import org.mvplugins.multiverse.core.module.MultiverseModule; import org.mvplugins.multiverse.core.utils.StringFormatter; 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.mvplugins.multiverse.signportals.listeners.SignPortalsListener; import java.util.logging.Level; @Service -public class MultiverseSignPortals extends MultiversePlugin { +public class MultiverseSignPortals extends MultiverseModule { private static final double TARGET_CORE_API_VERSION = 5.0; - private MultiverseCoreApi core; - private PluginServiceLocator serviceLocator; - /** This fires before I get Enabled. */ + @Override public void onLoad() { Logging.init(this); this.getDataFolder().mkdirs(); } + @Override public void onEnable() { Logging.init(this); - this.core = MultiverseCoreApi.get(); - - initializeDependencyInjection(); - registerEvents(); + initializeDependencyInjection(new MultiverseSignPortalsPluginBinder(this)); + registerEvents(SignPortalsListener.class); Logging.setDebugLevel(serviceLocator.getActiveService(CoreConfig.class).getGlobalDebug()); Logging.log(true, Level.INFO, " Enabled - By %s", StringFormatter.joinAnd(getDescription().getAuthors())); } + @Override public void onDisable() { - // The Usual shutdownDependencyInjection(); Logging.info("- Disabled"); } - private void initializeDependencyInjection() { - serviceLocator = PluginServiceLocatorFactory.get() - .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); - }); - } - @Override public PluginServiceLocator getServiceLocator() { return serviceLocator; diff --git a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java index d7d304e..f9ca6fc 100644 --- a/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java +++ b/src/main/java/org/mvplugins/multiverse/signportals/MultiverseSignPortalsPluginBinder.java @@ -1,10 +1,11 @@ package org.mvplugins.multiverse.signportals; import org.mvplugins.multiverse.core.inject.binder.JavaPluginBinder; +import org.mvplugins.multiverse.core.module.MultiverseModuleBinder; import org.mvplugins.multiverse.external.glassfish.hk2.utilities.binding.ScopedBindingBuilder; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; -public class MultiverseSignPortalsPluginBinder extends JavaPluginBinder { +public class MultiverseSignPortalsPluginBinder extends MultiverseModuleBinder { protected MultiverseSignPortalsPluginBinder(@NotNull MultiverseSignPortals plugin) { super(plugin); From 8dbc093ecc90d9a07513ebe03dbf856f68eccf4e Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Mon, 28 Apr 2025 20:06:27 +0800 Subject: [PATCH 09/12] Use our own gradle multiverse-plugin --- build.gradle | 128 ++++------------------- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle | 9 ++ 3 files changed, 33 insertions(+), 106 deletions(-) diff --git a/build.gradle b/build.gradle index 47ed002..78a65ba 100644 --- a/build.gradle +++ b/build.gradle @@ -1,34 +1,12 @@ plugins { - id 'java-library' - id 'maven-publish' id 'checkstyle' - id 'com.github.johnrengelman.shadow' version '7.1.2' + id 'org.mvplugins.multiverse-plugin' version '1.2.0' } -version = System.getenv('GITHUB_VERSION') ?: 'local' group = 'org.mvplugins.multiverse.signportals' description = 'Multiverse-SignPortals' -java { - toolchain { - languageVersion.set(JavaLanguageVersion.of(17)) - } -} - repositories { - mavenLocal() - mavenCentral() - - maven { - name = 'spigot' - url = uri('https://hub.spigotmc.org/nexus/content/repositories/snapshots/') - } - - maven { - name = 'onarandombox' - url = uri('https://repo.onarandombox.com/content/groups/public/') - } - maven { // todo: remove before mv5 release name = 'benwoo1110' @@ -36,48 +14,34 @@ repositories { } } -dependencies { - // Spigot - implementation('org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT') { - exclude group: 'junit', module: 'junit' - } +configure(apiDependencies) { + serverApiVersion = '1.18.2-R0.1-SNAPSHOT' + mockBukkitServerApiVersion = '1.21' + mockBukkitVersion = '4.31.1' +} +dependencies { // Core - implementation 'org.mvplugins.multiverse.core:multiverse-core:5.0.0-SNAPSHOT' + externalPlugin 'org.mvplugins.multiverse.core:multiverse-core:5.0.0-SNAPSHOT' // Utils - api('com.dumptruckman.minecraft:Logging:1.1.1') { - exclude group: 'org.bukkit', module: 'bukkit' + shadowed('com.dumptruckman.minecraft:Logging:1.1.1') { + exclude group: 'junit', module: 'junit' } } - -java { - withSourcesJar() - withJavadocJar() -} - -tasks.withType(JavaCompile).configureEach { - options.encoding = 'UTF-8' -} - -tasks.withType(Javadoc).configureEach { - options.encoding = 'UTF-8' +checkstyle { + toolVersion = '6.1.1' + configFile file('config/mv_checks.xml') + ignoreFailures = true } -configurations { - [apiElements, runtimeElements].each { - it.outgoing.artifacts.removeIf { it.buildDependencies.getDependencies(null).contains(jar) } - it.outgoing.artifact(shadowJar) - } +shadowJar { + relocate 'com.dumptruckman.minecraft.util.Logging', 'org.mvplugins.multiverse.signportals.util.MVSPLogging' + relocate 'com.dumptruckman.minecraft.util.DebugLog', 'org.mvplugins.multiverse.signportals.util.DebugFileLogger' } publishing { - publications { - maven(MavenPublication) { - from components.java - } - } repositories { maven { name = "GitHubPackages" @@ -87,58 +51,12 @@ publishing { password = System.getenv("GITHUB_TOKEN") } } - } -} - -processResources { - def props = [version: "${project.version}"] - inputs.properties props - filteringCharset 'UTF-8' - filesMatching('plugin.yml') { - expand props + maven { + // todo: remove before mv5 release + name = "multiverseBeta" + url = "https://repo.c0ding.party/multiverse-beta" + credentials(PasswordCredentials) + } } - - // This task should never be skipped. The tests depend on this having been run but we want the new version number - // that is created after tests are run and before we run again to publish. - outputs.upToDateWhen { false } -} - - -checkstyle { - toolVersion = '6.1.1' - configFile file('config/mv_checks.xml') - ignoreFailures = true -} - - -javadoc { - source = sourceSets.main.allJava - classpath = configurations.compileClasspath -} - - -project.configurations.api.canBeResolved = true - -shadowJar { - 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] - - archiveFileName = "$baseName-$version.$extension" -} - -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/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f398c33..5c40527 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle index 212c45f..0a0b710 100644 --- a/settings.gradle +++ b/settings.gradle @@ -2,4 +2,13 @@ * This file was generated by the Gradle 'init' task. */ +pluginManagement { + repositories { + gradlePluginPortal() + maven { + url = uri('https://repo.onarandombox.com/multiverse-releases') + } + } +} + rootProject.name = 'multiverse-signportals' From d632538fea18fc6c33498add9519db40f0b0de4c Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Mon, 28 Apr 2025 23:21:06 +0800 Subject: [PATCH 10/12] Add a fresh new banner --- README.md | 9 +++++---- config/multiverse-banner.png | Bin 0 -> 174706 bytes 2 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 config/multiverse-banner.png diff --git a/README.md b/README.md index dbeff43..737790a 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

-Multiverse Logo +Multiverse Logo

# Multiverse SignPortals @@ -8,7 +8,8 @@ [![hangar](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/hangar_vector.svg)](https://hangar.papermc.io/Multiverse/Multiverse-SignPortals) [![bukkit](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/supported/bukkit_vector.svg)](https://dev.bukkit.org/projects/Multiverse-SignPortals) -![GitHub release (with filter)](https://img.shields.io/github/v/release/multiverse/multiverse-signportals) +[![GitHub release (with filter)](https://img.shields.io/github/v/release/multiverse/multiverse-signportals)](https://github.com/Multiverse/Multiverse-SignPortals/releases) +[![Pre-Release](https://img.shields.io/github/v/release/multiverse/multiverse-signportals?include_prereleases&label=Pre-release)](https://github.com/Multiverse/Multiverse-SignPortals/releases) [![Discord](https://img.shields.io/discord/325459248047980545?label=discord&logo=discord)](https://discord.gg/NZtfKky) [![Support us on Patreon](https://img.shields.io/endpoint.svg?url=https%3A%2F%2Fshieldsio-patreon.vercel.app%2Fapi%3Fusername%3Ddumptruckman%26type%3Dpatrons&style=flat)](https://patreon.com/dumptruckman) @@ -17,7 +18,7 @@ [Multiverse SignPortals](https://dev.bukkit.org/projects/Multiverse-SignPortals) is an add-on Plugin for [Multiverse core](https://dev.bukkit.org/projects/multiverse-core) that allows you to create Signs that (on click) can teleport players to Multiverse destinations (worlds, anchors or even exact positions), With [Multiverse Command Destination](https://www.spigotmc.org/resources/multiverse-commanddestination.90232/) you can even make signs that run commands -Now it's time to create your very own server with Multiverse SignPortals, do check out our [Wiki](https://github.com/Multiverse/Multiverse-Core/wiki/Home-(SignPortals)) and [Usage Guide](https://github.com/Multiverse/Multiverse-Core/wiki/Basics-(SignPortals)) to get started. Feel free to hop onto our [Discord](https://discord.gg/NZtfKky) if you have any questions or just want to have a chat with us! +Now it's time to create your very own server with Multiverse SignPortals, do check out our [Wiki](https://mvplugins.org) and [Usage Guide](https://mvplugins.org/signportals/fundamentals/installation/) to get started. Feel free to hop onto our [Discord](https://discord.gg/NZtfKky) if you have any questions or just want to have a chat with us! ## Our other amazing sub-modules: @@ -38,7 +39,7 @@ Simply build the source with Gradle: **Want to help improve Multiverse SignPortals?** There are several ways you can support and contribute to the project. * Take a look at our "Bug: Unconfirmed" issues, where you can find issues that need extra testing and investigation. * Want others to love Multiverse too? You can join the [Multiverse Discord community](https://discord.gg/NZtfKky) and help others with issues and setup! -* A Multiverse guru? You can update our [Wiki](https://github.com/Multiverse/Multiverse-Core/wiki) with your latest tips, tricks and guides! The wiki open for all to edit and improve. +* A Multiverse guru? You can update our [Wiki](https://github.com/Multiverse/multiverse-web) with your latest tips, tricks and guides! The wiki open for all to edit and improve. * Love coding? You could look at some of our [issues](https://github.com/Multiverse/Multiverse-SignPortals/issues). We're always happy to receive bug fixes and feature additions as [pull requests](https://www.freecodecamp.org/news/how-to-make-your-first-pull-request-on-github-3/). * If you'd like to make a financial contribution to the project, do consider joining our [Patreon](https://www.patreon.com/dumptruckman) or make a one-time donation [here](https://paypal.me/dumptruckman)! diff --git a/config/multiverse-banner.png b/config/multiverse-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..9c9b23ff66108362f100e4206f956e9f1f95d831 GIT binary patch literal 174706 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 Date: Mon, 28 Apr 2025 23:23:08 +0800 Subject: [PATCH 11/12] Remove old title --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 737790a..86cab9b 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,6 @@ Multiverse Logo

-# Multiverse SignPortals - [![Modrinth](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/modrinth_vector.svg)](https://modrinth.com/plugin/Multiverse-SignPortals) [![hangar](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/available/hangar_vector.svg)](https://hangar.papermc.io/Multiverse/Multiverse-SignPortals) [![bukkit](https://cdn.jsdelivr.net/npm/@intergrav/devins-badges@3/assets/cozy/supported/bukkit_vector.svg)](https://dev.bukkit.org/projects/Multiverse-SignPortals) From bb4829c06f0629a328fd563c78168fbe6282ebab Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Tue, 29 Apr 2025 11:01:09 +0800 Subject: [PATCH 12/12] Prep for release --- build.gradle | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/build.gradle b/build.gradle index 78a65ba..22aaec3 100644 --- a/build.gradle +++ b/build.gradle @@ -7,11 +7,6 @@ group = 'org.mvplugins.multiverse.signportals' description = 'Multiverse-SignPortals' repositories { - maven { - // todo: remove before mv5 release - name = 'benwoo1110' - url = uri('https://repo.c0ding.party/multiverse-beta') - } } configure(apiDependencies) { @@ -51,12 +46,5 @@ publishing { password = System.getenv("GITHUB_TOKEN") } } - - maven { - // todo: remove before mv5 release - name = "multiverseBeta" - url = "https://repo.c0ding.party/multiverse-beta" - credentials(PasswordCredentials) - } } }