From e1cae0d81d5bde71250dc623ac5bdfaefc526530 Mon Sep 17 00:00:00 2001
From: RaphiMC <50594595+RaphiMC@users.noreply.github.com>
Date: Fri, 9 Jun 2023 16:00:45 +0200
Subject: [PATCH] Added system to override Via jars
---
.../viafabricplus/ViaFabricPlus.java | 25 +++++----
.../viafabricplus/ViaJarReplacer.java | 52 +++++++++++++++++++
.../protocolhack/ProtocolHack.java | 8 +--
3 files changed, 71 insertions(+), 14 deletions(-)
create mode 100644 src/main/java/de/florianmichael/viafabricplus/ViaJarReplacer.java
diff --git a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
index bee964e6..f0317528 100644
--- a/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
+++ b/src/main/java/de/florianmichael/viafabricplus/ViaFabricPlus.java
@@ -19,20 +19,20 @@ package de.florianmichael.viafabricplus;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
-import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
-import de.florianmichael.viafabricplus.definition.v1_12_2.FontCacheFix;
-import de.florianmichael.viafabricplus.mappings.ItemReleaseVersionMappings;
-import de.florianmichael.viafabricplus.mappings.PackFormatsMappings;
-import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
-import de.florianmichael.viafabricplus.screen.impl.ClassicItemSelectionScreen;
-import de.florianmichael.viafabricplus.definition.c0_30.ClassiCubeAccountHandler;
-import de.florianmichael.viafabricplus.definition.c0_30.protocol.CustomClassicProtocolExtensions;
-import de.florianmichael.viafabricplus.definition.v1_8.ArmorPointCalculation;
import de.florianmichael.viafabricplus.base.event.FinishMinecraftLoadCallback;
import de.florianmichael.viafabricplus.base.event.PreLoadCallback;
-import de.florianmichael.viafabricplus.information.InformationSystem;
-import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
import de.florianmichael.viafabricplus.base.settings.SettingsSystem;
+import de.florianmichael.viafabricplus.definition.ChatLengthCalculation;
+import de.florianmichael.viafabricplus.definition.bedrock.BedrockAccountHandler;
+import de.florianmichael.viafabricplus.definition.c0_30.ClassiCubeAccountHandler;
+import de.florianmichael.viafabricplus.definition.c0_30.protocol.CustomClassicProtocolExtensions;
+import de.florianmichael.viafabricplus.definition.v1_12_2.FontCacheFix;
+import de.florianmichael.viafabricplus.definition.v1_8.ArmorPointCalculation;
+import de.florianmichael.viafabricplus.information.InformationSystem;
+import de.florianmichael.viafabricplus.mappings.ItemReleaseVersionMappings;
+import de.florianmichael.viafabricplus.mappings.PackFormatsMappings;
+import de.florianmichael.viafabricplus.protocolhack.ProtocolHack;
+import de.florianmichael.viafabricplus.screen.impl.ClassicItemSelectionScreen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -60,6 +60,9 @@ public class ViaFabricPlus {
private final InformationSystem informationSystem = new InformationSystem();
public void init() {
+ // Load overriding jars first so other code can access the new classes
+ ViaJarReplacer.loadOverridingJars();
+
PreLoadCallback.EVENT.invoker().onLoad();
// Classic Stuff
diff --git a/src/main/java/de/florianmichael/viafabricplus/ViaJarReplacer.java b/src/main/java/de/florianmichael/viafabricplus/ViaJarReplacer.java
new file mode 100644
index 00000000..df1838ca
--- /dev/null
+++ b/src/main/java/de/florianmichael/viafabricplus/ViaJarReplacer.java
@@ -0,0 +1,52 @@
+/*
+ * This file is part of ViaFabricPlus - https://github.com/FlorianMichael/ViaFabricPlus
+ * Copyright (C) 2021-2023 FlorianMichael/EnZaXD and contributors
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package de.florianmichael.viafabricplus;
+
+import net.lenni0451.reflect.ClassLoaders;
+import net.lenni0451.reflect.stream.RStream;
+
+import java.io.File;
+
+public class ViaJarReplacer {
+
+ public final static File VIA_JAR_OVERRIDING_FOLDER = new File(ViaFabricPlus.RUN_DIRECTORY, "jars");
+
+ public static void loadOverridingJars() {
+ try {
+ VIA_JAR_OVERRIDING_FOLDER.mkdirs();
+ final File[] files = VIA_JAR_OVERRIDING_FOLDER.listFiles();
+ if (files != null && files.length > 0) {
+ final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
+ try {
+ final ClassLoader actualLoader = RStream.of(oldLoader).fields().by("urlLoader").get();
+ Thread.currentThread().setContextClassLoader(actualLoader);
+ for (File file : files) {
+ if (file.getName().endsWith(".jar")) {
+ ClassLoaders.loadToFront(file.toURI().toURL());
+ ViaFabricPlus.LOGGER.info("Loaded overriding jar " + file.getName());
+ }
+ }
+ } finally {
+ Thread.currentThread().setContextClassLoader(oldLoader);
+ }
+ }
+ } catch (Throwable e) {
+ ViaFabricPlus.LOGGER.error("Failed to load overriding jars", e);
+ }
+ }
+}
diff --git a/src/main/java/de/florianmichael/viafabricplus/protocolhack/ProtocolHack.java b/src/main/java/de/florianmichael/viafabricplus/protocolhack/ProtocolHack.java
index 21bfdb4a..1bf6c85a 100644
--- a/src/main/java/de/florianmichael/viafabricplus/protocolhack/ProtocolHack.java
+++ b/src/main/java/de/florianmichael/viafabricplus/protocolhack/ProtocolHack.java
@@ -24,6 +24,7 @@ import com.viaversion.viaversion.api.Via;
import com.viaversion.viaversion.api.connection.UserConnection;
import com.viaversion.viaversion.connection.UserConnectionImpl;
import com.viaversion.viaversion.protocol.ProtocolPipelineImpl;
+import de.florianmichael.viafabricplus.ViaFabricPlus;
import de.florianmichael.viafabricplus.base.event.ChangeProtocolVersionCallback;
import de.florianmichael.viafabricplus.base.event.FinishViaVersionStartupCallback;
import de.florianmichael.viafabricplus.protocolhack.command.ViaFabricPlusVLCommandHandler;
@@ -32,7 +33,7 @@ import de.florianmichael.viafabricplus.protocolhack.impl.ViaFabricPlusVLLoader;
import de.florianmichael.viafabricplus.protocolhack.impl.platform.ViaFabricPlusViaLegacyPlatformImpl;
import de.florianmichael.viafabricplus.protocolhack.impl.platform.ViaFabricPlusViaVersionPlatformImpl;
import de.florianmichael.viafabricplus.protocolhack.netty.ViaFabricPlusVLLegacyPipeline;
-import io.netty.channel.*;
+import io.netty.channel.Channel;
import io.netty.util.AttributeKey;
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource;
@@ -45,7 +46,8 @@ import net.raphimc.vialoader.impl.platform.ViaBedrockPlatformImpl;
import net.raphimc.vialoader.util.VersionEnum;
import java.net.InetSocketAddress;
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
public class ProtocolHack {
public final static AttributeKey LOCAL_VIA_CONNECTION = AttributeKey.newInstance("viafabricplus-via-connection");
@@ -117,7 +119,7 @@ public class ProtocolHack {
}
public static void init() {
- ViaLoader.init(new ViaFabricPlusViaVersionPlatformImpl(null), new ViaFabricPlusVLLoader(), new ViaFabricPlusVLInjector(), new ViaFabricPlusVLCommandHandler(), ViaBackwardsPlatformImpl::new, ViaFabricPlusViaLegacyPlatformImpl::new, ViaAprilFoolsPlatformImpl::new, ViaBedrockPlatformImpl::new);
+ ViaLoader.init(new ViaFabricPlusViaVersionPlatformImpl(ViaFabricPlus.RUN_DIRECTORY), new ViaFabricPlusVLLoader(), new ViaFabricPlusVLInjector(), new ViaFabricPlusVLCommandHandler(), ViaBackwardsPlatformImpl::new, ViaFabricPlusViaLegacyPlatformImpl::new, ViaAprilFoolsPlatformImpl::new, ViaBedrockPlatformImpl::new);
initCommands();
FinishViaVersionStartupCallback.EVENT.invoker().onFinishViaVersionStartup();