Skip to content

Commit 4bd8d77

Browse files
committed
feat: add client support
1 parent e5c296f commit 4bd8d77

11 files changed

Lines changed: 136 additions & 50 deletions

File tree

build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@ dependencies {
2626
implementation "org.apache.logging.log4j:log4j-api:2.11.2"
2727
implementation "org.apache.logging.log4j:log4j-core:2.11.2"
2828
compileOnly "net.md-5:SpecialSource:1.8.6"
29-
compileOnly "cpw.mods:modlauncher:6.1.1"
30-
compileOnly "org.spongepowered:mixin:0.8"
29+
compileOnly "cpw.mods:modlauncher:8.0.6"
30+
compileOnly "org.spongepowered:mixin:0.8.2"
3131
}
3232

3333
group = theGroup

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
theName=Stream
2-
theVersion=1.0.1
2+
theVersion=1.0.2
33
theGroup=systems.conduit
44
systemProp.file.encoding=utf-8

src/main/java/systems/conduit/stream/Constants.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,14 @@ public class Constants {
2323
public static final Path CONDUIT_CACHE = Paths.get("caches", "conduit");
2424
public static Path MINECRAFT_PATH = Paths.get(".minecraft");
2525

26-
public static final Path LIBRARIES_PATH = Paths.get(".libs");
26+
// TODO: Detect side and use .libs for server
27+
public static final Path LIBRARIES_PATH = Paths.get("libraries");
2728

2829
public static Path VERSION_JSON_PATH;
29-
public static Path SERVER_JAR_PATH;
30-
public static Path SERVER_MAPPED_JAR_PATH;
31-
public static Path SERVER_MAPPINGS_PATH;
32-
public static Path SERVER_MAPPINGS_CONVERTED_PATH;
30+
public static Path JAR_PATH;
31+
public static Path MAPPED_JAR_PATH;
32+
public static Path MAPPINGS_PATH;
33+
public static Path MAPPINGS_CONVERTED_PATH;
3334

3435
public static final Path MIXINS_PATH = Paths.get(".mixins");
3536
public static Path CONDUIT_MIXIN_PATH;
@@ -50,21 +51,27 @@ public class Constants {
5051
public static final String USER_AGENT = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11";
5152

5253
public static final String MAIN_SERVER_FILE = "net.minecraft.server.Main";
54+
public static final String MAIN_CLIENT_FILE = "net.minecraft.client.main.Main";
5355
public static final String MAIN_CONDUIT_FILE = "systems.conduit.main.Conduit";
5456

55-
public static void setMinecraftPaths(Path basePath, String minecraftVersion) {
57+
public static void setMinecraftPaths(Side side, Path basePath, String minecraftVersion) {
5658
MINECRAFT_VERSION = minecraftVersion;
5759
if (basePath != null) MINECRAFT_PATH = basePath.resolve(MINECRAFT_PATH);
5860
VERSION_JSON_PATH = MINECRAFT_PATH.resolve(MINECRAFT_VERSION + ".json");
59-
SERVER_JAR_PATH = MINECRAFT_PATH.resolve("server-" + MINECRAFT_VERSION + ".jar");
60-
SERVER_MAPPED_JAR_PATH = MINECRAFT_PATH.resolve("server-" + MINECRAFT_VERSION + "-remapped.jar");
61-
SERVER_MAPPINGS_PATH = MINECRAFT_PATH.resolve("server-" + MINECRAFT_VERSION + "-mappings.txt");
62-
SERVER_MAPPINGS_CONVERTED_PATH = MINECRAFT_PATH.resolve("server-" + MINECRAFT_VERSION + "-mappings-converted.txt");
61+
JAR_PATH = MINECRAFT_PATH.resolve(side.name().toLowerCase() + "-" + MINECRAFT_VERSION + ".jar");
62+
MAPPED_JAR_PATH = MINECRAFT_PATH.resolve(side.name().toLowerCase() + "-" + MINECRAFT_VERSION + "-remapped.jar");
63+
MAPPINGS_PATH = MINECRAFT_PATH.resolve(side.name().toLowerCase() + "-" + MINECRAFT_VERSION + "-mappings.txt");
64+
MAPPINGS_CONVERTED_PATH = MINECRAFT_PATH.resolve(side.name().toLowerCase() + "-" + MINECRAFT_VERSION + "-mappings-converted.txt");
6365
}
6466

6567
public static void setConduitPaths(String conduitVersion) {
6668
CONDUIT_VERSION = conduitVersion;
6769
CONDUIT_MIXIN_PATH = MIXINS_PATH.resolve("Conduit-" + CONDUIT_VERSION + ".jar");
6870
CONDUIT_DOWNLOAD_PATH = CONDUIT_REPO + "systems/conduit/Conduit/" + CONDUIT_VERSION + "/Conduit-" + CONDUIT_VERSION + ".jar";
6971
}
72+
73+
public enum Side {
74+
CLIENT,
75+
SERVER
76+
}
7077
}

src/main/java/systems/conduit/stream/SharedLaunch.java

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ public static void downloadDefaultLibraries(Path basePath, Callback<File> callba
5454
LibraryProcessor.downloadLibrary("default libraries", basePath, defaults.getLibs(), callback);
5555
}
5656

57-
public static void setupMinecraft(Path basePath, String version, Callback<File> callback) {
57+
public static void setupMinecraft(Constants.Side side, Path basePath, String version, Callback<File> callback) {
5858
if (version == null) {
5959
Logger.fatal("Can not find minecraft version");
6060
System.exit(0);
6161
}
6262
// Set correct paths
63-
Constants.setMinecraftPaths(basePath, version);
63+
Constants.setMinecraftPaths(side, basePath, version);
6464
// Make sure we have the correct directories
6565
if (!Constants.MINECRAFT_PATH.toFile().exists() && !Constants.MINECRAFT_PATH.toFile().mkdirs()) {
6666
Logger.fatal("Failed to make minecraft directory");
@@ -71,7 +71,7 @@ public static void setupMinecraft(Path basePath, String version, Callback<File>
7171
try (InputStreamReader manifestReader = new InputStreamReader(new URL(Constants.VERSION_MANIFEST_ENDPOINT).openStream())) {
7272
MinecraftVersionManifest manifest = new Gson().fromJson(manifestReader, MinecraftVersionManifest.class);
7373
Optional<MinecraftVersionManifestType> versionInfo = getVersion(manifest, Constants.MINECRAFT_VERSION);
74-
// Read version json and get server info
74+
// Read version json and get info
7575
if (versionInfo.isPresent() && versionInfo.get().getUrl() != null && !versionInfo.get().getUrl().isEmpty()) {
7676
try {
7777
Logger.info("Downloading version json");
@@ -105,7 +105,7 @@ public static void setupMinecraft(Path basePath, String version, Callback<File>
105105
// Download libraries
106106
List<JsonLibraryInfo> minecraftLibraries = new ArrayList<>();
107107
for (MinecraftLibrary minecraftLibrary : minecraftVersion.getLibraries()) {
108-
// Should not need mac only for a server. I think?
108+
// Should not need mac only. I think?
109109
if (!minecraftLibrary.isMac()) {
110110
String[] minecraftLib = minecraftLibrary.getName().split(":");
111111
minecraftLibraries.add(new JsonLibraryInfo("maven", minecraftLib[0], minecraftLib[1], minecraftLib[2], Constants.MINECRAFT_REPO));
@@ -114,47 +114,49 @@ public static void setupMinecraft(Path basePath, String version, Callback<File>
114114
// Download all the Minecraft libraries
115115
LibraryProcessor.downloadLibrary("Minecraft libraries", basePath, minecraftLibraries, callback);
116116
// Download Minecraft and patch if we don't have the file
117-
if (!Constants.SERVER_MAPPED_JAR_PATH.toFile().exists()) {
118-
// Download server
119-
if (!minecraftVersion.getDownloads().getServer().getUrl().isEmpty()) {
117+
if (!Constants.MAPPED_JAR_PATH.toFile().exists()) {
118+
// Download jar
119+
String jarDownload = side == Constants.Side.SERVER ? minecraftVersion.getDownloads().getServer().getUrl() : minecraftVersion.getDownloads().getClient().getUrl();
120+
if (!jarDownload.isEmpty()) {
120121
try {
121-
Logger.info("Downloading Minecraft server (" + Constants.MINECRAFT_VERSION + ")");
122-
downloadFile(new URL(minecraftVersion.getDownloads().getServer().getUrl()), Constants.SERVER_JAR_PATH.toFile());
122+
Logger.info("Downloading Minecraft " + side.name().toLowerCase() + " (" + Constants.MINECRAFT_VERSION + ")");
123+
downloadFile(new URL(jarDownload), Constants.JAR_PATH.toFile());
123124
} catch (IOException e) {
124-
Logger.exception("Error creating server url", e);
125+
Logger.exception("Error creating " + side.name().toLowerCase() + " url", e);
125126
System.exit(0);
126127
}
127128
} else {
128-
Logger.fatal("Error reading Minecraft server url");
129+
Logger.fatal("Error reading Minecraft " + side.name().toLowerCase() + " url");
129130
System.exit(0);
130131
}
131132
// Cleanup Minecraft
132133
Logger.info("Cleaning up Minecraft");
133-
deleteMinecraftTrash(Constants.SERVER_JAR_PATH.toFile());
134+
//deleteMinecraftTrash(Constants.JAR_PATH.toFile());
134135
Logger.info("Cleaned up Minecraft");
135-
// Download server mappings
136-
if (!minecraftVersion.getDownloads().getServerMappings().getUrl().isEmpty()) {
136+
// Download mappings
137+
String mappingsDownload = side == Constants.Side.SERVER ? minecraftVersion.getDownloads().getServerMappings().getUrl() : minecraftVersion.getDownloads().getClientMappings().getUrl();
138+
if (!mappingsDownload.isEmpty()) {
137139
try {
138-
Logger.info("Downloading server mappings");
139-
downloadFile(new URL(minecraftVersion.getDownloads().getServerMappings().getUrl()), Constants.SERVER_MAPPINGS_PATH.toFile());
140+
Logger.info("Downloading " + side.name().toLowerCase() + " mappings");
141+
downloadFile(new URL(mappingsDownload), Constants.MAPPINGS_PATH.toFile());
140142
} catch (IOException e) {
141-
Logger.exception("Error creating server mappings url", e);
143+
Logger.exception("Error creating " + side.name().toLowerCase() + " mappings url", e);
142144
System.exit(0);
143145
}
144146
} else {
145-
Logger.fatal("Error reading Minecraft server mappings url");
147+
Logger.fatal("Error reading Minecraft " + side.name().toLowerCase() + " mappings url");
146148
System.exit(0);
147149
}
148150
// Convert Minecraft mappings
149151
Logger.info("Converting Minecraft mappings");
150-
new Mojang2Tsrg(Constants.SERVER_MAPPINGS_PATH, Constants.SERVER_MAPPINGS_CONVERTED_PATH);
152+
new Mojang2Tsrg(Constants.MAPPINGS_PATH, Constants.MAPPINGS_CONVERTED_PATH);
151153
// Remapping Minecraft
152-
Logger.info("Remapping Minecraft (This might take a bit)");
154+
Logger.info("Remapping Minecraft " + side.name().toLowerCase() + " (This might take a bit)");
153155
ClassLoader classLoader = new URLClassLoader(specialSourcePaths.toArray(new URL[]{}), ClassLoader.getSystemClassLoader());
154156
String[] specialSourceArgs = Stream.of(
155-
"--in-jar", Constants.SERVER_JAR_PATH.toFile().getAbsolutePath(),
156-
"--out-jar", Constants.SERVER_MAPPED_JAR_PATH.toFile().getAbsolutePath(),
157-
"--srg-in", Constants.SERVER_MAPPINGS_CONVERTED_PATH.toFile().getAbsolutePath(),
157+
"--in-jar", Constants.JAR_PATH.toFile().getAbsolutePath(),
158+
"--out-jar", Constants.MAPPED_JAR_PATH.toFile().getAbsolutePath(),
159+
"--srg-in", Constants.MAPPINGS_CONVERTED_PATH.toFile().getAbsolutePath(),
158160
"--quiet"
159161
).toArray(String[]::new);
160162
// Run remapping Minecraft
@@ -164,10 +166,11 @@ public static void setupMinecraft(Path basePath, String version, Callback<File>
164166
method.invoke(null, (Object) specialSourceArgs);
165167
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | ClassNotFoundException e) {
166168
Logger.exception("Error remapping Minecraft", e);
169+
e.printStackTrace();
167170
System.exit(0);
168171
}
169-
Constants.SERVER_JAR_PATH.toFile().delete();
170-
Constants.SERVER_MAPPINGS_CONVERTED_PATH.toFile().delete();
172+
Constants.JAR_PATH.toFile().delete();
173+
Constants.MAPPINGS_CONVERTED_PATH.toFile().delete();
171174
Logger.info("Remapped Minecraft");
172175
}
173176
}

src/main/java/systems/conduit/stream/gradle/StreamGradlePlugin.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public class StreamGradlePlugin implements Plugin<Project> {
2020

2121
@Override
2222
public void apply(Project project) {
23+
// TODO: ADD CONFIG
24+
Constants.Side side = Constants.Side.SERVER;
2325
// Register Conduit info
2426
ConduitExtension extension = project.getExtensions().create("conduit", ConduitExtension.class, project);
2527
// Project Defaults
@@ -63,9 +65,9 @@ public void apply(Project project) {
6365
// Make sure minecraft is present. It always should be if done right.
6466
if (extension.minecraft != null) {
6567
// Download/load minecraft libraries and download and remap minecraft if need to
66-
SharedLaunch.setupMinecraft(cacheFolder, extension.minecraft, registerDependency);
68+
SharedLaunch.setupMinecraft(side, cacheFolder, extension.minecraft, registerDependency);
6769
// Load minecraft
68-
registerDependency.callback(Constants.SERVER_MAPPED_JAR_PATH.toFile());
70+
registerDependency.callback(Constants.MAPPED_JAR_PATH.toFile());
6971
}
7072
});
7173
}

src/main/java/systems/conduit/stream/json/minecraft/MinecraftDownload.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,15 @@
44

55
public class MinecraftDownload {
66

7+
@Getter private MinecraftVersionInfo client = new MinecraftVersionInfo();
78
@Getter private MinecraftVersionInfo server = new MinecraftVersionInfo();
9+
private MinecraftVersionInfo client_mappings = new MinecraftVersionInfo();
810
private MinecraftVersionInfo server_mappings = new MinecraftVersionInfo();
911

12+
public MinecraftVersionInfo getClientMappings() {
13+
return client_mappings;
14+
}
15+
1016
public MinecraftVersionInfo getServerMappings() {
1117
return server_mappings;
1218
}

src/main/java/systems/conduit/stream/launcher/Agent.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ protected static void addClassPath(File f) {
3030
}
3131
} catch (Throwable e) {
3232
System.out.println("Add to classpath error!");
33-
System.out.println(e.getMessage());
34-
System.exit(0);
33+
e.printStackTrace();
34+
//System.exit(0);
3535
}
3636
}
3737
}

src/main/java/systems/conduit/stream/launcher/LauncherStart.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
import com.google.gson.GsonBuilder;
55
import cpw.mods.modlauncher.Launcher;
66
import systems.conduit.stream.*;
7-
import systems.conduit.stream.json.download.JsonLibraries;
87
import systems.conduit.stream.json.JsonStream;
8+
import systems.conduit.stream.json.download.JsonLibraries;
99

1010
import java.io.*;
1111
import java.net.URL;
@@ -26,6 +26,9 @@ public class LauncherStart {
2626
public static final List<Path> PATHS = new ArrayList<>();
2727

2828
public static void main(String... args) {
29+
// TODO MAKE CONFIG
30+
Constants.Side side = Constants.Side.SERVER;
31+
// Defaults
2932
System.setProperty("http.agent", Constants.USER_AGENT);
3033
Logger.shouldUseLogger = true;
3134
System.out.println("Starting launcher...");
@@ -59,19 +62,19 @@ public static void main(String... args) {
5962
Logger.info("Setting up Minecraft");
6063
if (!Constants.DEBUG) {
6164
if (stream != null) {
62-
SharedLaunch.setupMinecraft(null, stream.getMinecraft().getVersion(), registerJar);
65+
SharedLaunch.setupMinecraft(side, null, stream.getMinecraft().getVersion(), registerJar);
6366
} else {
6467
Logger.fatal("Error parsing stream json!");
6568
System.exit(0);
6669
}
6770
} else {
68-
SharedLaunch.setupMinecraft(null, Constants.MINECRAFT_VERSION, registerJar);
71+
SharedLaunch.setupMinecraft(side, null, Constants.MINECRAFT_VERSION, registerJar);
6972
}
7073
Logger.info("Set up Minecraft");
7174
// Load minecraft
7275
if (!Constants.DEBUG) {
7376
Logger.info("Loading Minecraft remapped");
74-
LauncherStart.PATHS.add(Constants.SERVER_MAPPED_JAR_PATH);
77+
LauncherStart.PATHS.add(Constants.MAPPED_JAR_PATH);
7578
Logger.info("Loaded Minecraft remapped");
7679
}
7780
// Create the mixins folder
@@ -135,7 +138,7 @@ public static void main(String... args) {
135138
}
136139
// Start modlauncher
137140
Logger.info("Starting modlauncher...");
138-
Launcher.main(Stream.concat(Stream.of("--launchTarget", "minecraft-server"), Arrays.stream(args)).toArray(String[]::new));
141+
Launcher.main(Stream.concat(Stream.of("--launchTarget", "minecraft-" + side.name().toLowerCase()), Arrays.stream(args)).toArray(String[]::new));
139142
}
140143

141144
private static List<String> findMixinEntry(JarFile file) {
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package systems.conduit.stream.launcher.services;
2+
3+
import cpw.mods.modlauncher.api.ILaunchHandlerService;
4+
import cpw.mods.modlauncher.api.ITransformingClassLoader;
5+
import cpw.mods.modlauncher.api.ITransformingClassLoaderBuilder;
6+
import org.spongepowered.asm.mixin.Mixins;
7+
import systems.conduit.stream.Constants;
8+
import systems.conduit.stream.Logger;
9+
import systems.conduit.stream.launcher.LauncherStart;
10+
11+
import java.io.File;
12+
import java.lang.reflect.Method;
13+
import java.nio.file.Path;
14+
import java.util.concurrent.Callable;
15+
16+
public class ClientLaunchHandlerService implements ILaunchHandlerService {
17+
18+
@Override
19+
public void configureTransformationClassLoader(final ITransformingClassLoaderBuilder builder) {
20+
// Add transformation paths
21+
LauncherStart.PATHS.forEach(builder::addTransformationPath);
22+
// Load Minecraft and Conduit jars if in debug
23+
if (Constants.DEBUG) {
24+
Path minecraft = getLoadedJar(Constants.MAIN_CLIENT_FILE);
25+
if (minecraft != null) {
26+
Logger.info("Transforming Minecraft remapped");
27+
builder.addTransformationPath(minecraft);
28+
Logger.info("Transformed Minecraft remapped");
29+
}
30+
Path conduit = getLoadedJar(Constants.MAIN_CONDUIT_FILE);
31+
if (conduit != null) {
32+
Logger.info("Transforming Conduit");
33+
builder.addTransformationPath(conduit);
34+
Logger.info("Transformed Conduit");
35+
}
36+
}
37+
}
38+
39+
@Override
40+
public Callable<Void> launchService(String[] args, ITransformingClassLoader launchClassLoader) {
41+
// Add mixins to configure
42+
LauncherStart.MIXINS.forEach(Mixins::addConfiguration);
43+
return () -> {
44+
final Class<?> mcClass = Class.forName(Constants.MAIN_CLIENT_FILE, true, launchClassLoader.getInstance());
45+
final Method mcClassMethod = mcClass.getMethod("main", String[].class);
46+
mcClassMethod.invoke(null, (Object) args);
47+
return null;
48+
};
49+
}
50+
51+
private Path getLoadedJar(String className) {
52+
// Returns the jars from the classpath if loaded by intellij
53+
try {
54+
return new File(Class.forName(className).getProtectionDomain().getCodeSource().getLocation().toURI()).toPath();
55+
} catch (Exception ignored) {
56+
return null;
57+
}
58+
}
59+
60+
@Override
61+
public String name() {
62+
return "minecraft-client";
63+
}
64+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
systems.conduit.stream.launcher.services.ClientLaunchHandlerService
12
systems.conduit.stream.launcher.services.ServerLaunchHandlerService

0 commit comments

Comments
 (0)