diff --git a/launcher/src/main/java/space/vectrix/ignite/IgniteBootstrap.java b/launcher/src/main/java/space/vectrix/ignite/IgniteBootstrap.java index fe35687..64bfe39 100644 --- a/launcher/src/main/java/space/vectrix/ignite/IgniteBootstrap.java +++ b/launcher/src/main/java/space/vectrix/ignite/IgniteBootstrap.java @@ -142,7 +142,7 @@ private void run(final String@NotNull [] args) { Logger.info("Preparing the game..."); // Add the game. - final Path gameJar = Blackboard.raw(Blackboard.GAME_JAR); + final Path gameJar = gameProvider.gamePath(); try { IgniteAgent.addJar(gameJar); diff --git a/launcher/src/main/java/space/vectrix/ignite/game/VelocityGameLocator.java b/launcher/src/main/java/space/vectrix/ignite/game/VelocityGameLocator.java new file mode 100644 index 0000000..8d3f879 --- /dev/null +++ b/launcher/src/main/java/space/vectrix/ignite/game/VelocityGameLocator.java @@ -0,0 +1,104 @@ +/* + * This file is part of Ignite, licensed under the MIT License (MIT). + * + * Copyright (c) vectrix.space + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ +package space.vectrix.ignite.game; + +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.jar.JarFile; +import java.util.stream.Stream; +import org.jetbrains.annotations.NotNull; +import space.vectrix.ignite.Blackboard; +import space.vectrix.ignite.IgniteBootstrap; + +/** + * Provides a game locator for Velocity. + * + * @author vectrix + * @since 1.0.2 + */ +public final class VelocityGameLocator implements GameLocatorService { + private VelocityGameProvider provider; + + @Override + public @NotNull String id() { + return "velocity"; + } + + @Override + public @NotNull String name() { + return "Velocity"; + } + + @Override + public int priority() { + return 50; + } + + @Override + public boolean shouldApply() { + final Path path = Blackboard.get(Blackboard.GAME_JAR).orElseGet(() -> Paths.get("./velocity.jar")); + try(final JarFile jarFile = new JarFile(path.toFile())) { + return jarFile.getJarEntry("default-velocity.toml") != null; + } catch(final IOException exception) { + return false; + } + } + + @Override + public void apply(final @NotNull IgniteBootstrap bootstrap) throws Throwable { + Blackboard.compute(Blackboard.GAME_TARGET, () -> Blackboard.get(Blackboard.GAME_TARGET).orElse("com.velocitypowered.proxy.Velocity")); + + // Create the game provider. + if(this.provider == null) { + this.provider = new VelocityGameProvider(); + } + + // Locate the game jar. + if(!Blackboard.get(Blackboard.GAME_JAR).isPresent()) { + Blackboard.put(Blackboard.GAME_JAR, this.provider.gamePath()); + } + } + + @Override + public @NotNull GameProvider locate() { + return this.provider; + } + + /* package */ static final class VelocityGameProvider implements GameProvider { + /* package */ VelocityGameProvider() { + } + + @Override + public @NotNull Stream gameLibraries() { + return Stream.empty(); + } + + @Override + public @NotNull Path gamePath() { + return Blackboard.get(Blackboard.GAME_JAR).orElseGet(() -> Paths.get("./velocity.jar")); + } + } +} diff --git a/launcher/src/main/java/space/vectrix/ignite/util/IgniteExclusions.java b/launcher/src/main/java/space/vectrix/ignite/util/IgniteExclusions.java index ff2b482..9eb6a1e 100644 --- a/launcher/src/main/java/space/vectrix/ignite/util/IgniteExclusions.java +++ b/launcher/src/main/java/space/vectrix/ignite/util/IgniteExclusions.java @@ -54,6 +54,10 @@ public final class IgniteExclusions { "org.spongepowered.asm.", "com.llamalad7.mixinextras.", + // Logging + "org.slf4j.", + "org.apache.logging.log4j.", + // Access Widener "net.fabricmc.accesswidener.", }; diff --git a/launcher/src/main/resources/META-INF/services/space.vectrix.ignite.game.GameLocatorService b/launcher/src/main/resources/META-INF/services/space.vectrix.ignite.game.GameLocatorService index a482d72..557ca6e 100644 --- a/launcher/src/main/resources/META-INF/services/space.vectrix.ignite.game.GameLocatorService +++ b/launcher/src/main/resources/META-INF/services/space.vectrix.ignite.game.GameLocatorService @@ -1,4 +1,5 @@ space.vectrix.ignite.game.SpigotGameLocator space.vectrix.ignite.game.PaperGameLocator +space.vectrix.ignite.game.VelocityGameLocator space.vectrix.ignite.game.LegacyPaperGameLocator space.vectrix.ignite.game.DummyGameLocator diff --git a/readme.md b/readme.md index a0b970d..88a8075 100644 --- a/readme.md +++ b/readme.md @@ -161,6 +161,9 @@ The following targets could use the following flags: - The classpath to the paperclip entry point. (e.g `-Dignite.paper.target=io.papermc.paperclip.Paperclip`) - The minecraft server version paperclip will be patching. (e.g `-Dignite.paper.version=1.12.2`) +- Velocity: + - Service name: `velocity` (e.g `-Dignite.locator=velocity`) + ## Building __Note:__ If you do not have [Gradle] installed then use `./gradlew` for Unix systems or Git Bash and gradlew.bat for Windows systems in place of any 'gradle' command.