Invalidate plugin class cache with patcher info

This commit is contained in:
IzzelAliz 2021-08-30 14:15:04 +08:00
parent 19256c504a
commit 64d48c6a00
No known key found for this signature in database
GPG Key ID: EE50E123A11D8338
3 changed files with 27 additions and 4 deletions

View File

@ -3,6 +3,7 @@ package io.izzel.arclight.common.mod.util.remapper;
import com.google.common.hash.Hasher;
import com.google.common.hash.Hashing;
import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
import io.izzel.arclight.api.PluginPatcher;
import io.izzel.arclight.common.mod.ArclightMod;
import io.izzel.arclight.i18n.ArclightConfig;
import io.izzel.tools.product.Product;
@ -69,6 +70,20 @@ public abstract class ArclightClassCache implements AutoCloseable {
private final Path basePath = Paths.get(".arclight/class_cache");
private ScheduledExecutorService executor;
private static String currentVersionInfo() {
var builder = new StringBuilder();
var arclight = ModList.get().getModContainerById("arclight")
.orElseThrow(IllegalStateException::new).getModInfo().getVersion().toString();
builder.append(arclight);
for (PluginPatcher patcher : ArclightRemapper.INSTANCE.getPatchers()) {
builder.append('\0')
.append(patcher.getClass().getName())
.append('\0')
.append(patcher.version());
}
return builder.toString();
}
public Impl() {
if (!enabled) return;
executor = Executors.newSingleThreadScheduledExecutor(r -> {
@ -91,8 +106,7 @@ public abstract class ArclightClassCache implements AutoCloseable {
if (!Files.isDirectory(basePath)) {
Files.createDirectories(basePath);
}
String current = ModList.get().getModContainerById("arclight")
.orElseThrow(IllegalStateException::new).getModInfo().getVersion().toString();
String current = currentVersionInfo();
String store;
Path version = basePath.resolve(".version");
if (Files.exists(version)) {

View File

@ -2,6 +2,7 @@ package io.izzel.arclight.common.mod.util.remapper;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import io.izzel.arclight.api.PluginPatcher;
import io.izzel.arclight.api.Unsafe;
import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger;
import io.izzel.arclight.common.mod.util.remapper.patcher.ArclightPluginPatcher;
@ -57,6 +58,7 @@ public class ArclightRemapper {
private final List<PluginTransformer> transformerList = new ArrayList<>();
private final JarRemapper toBukkitRemapper;
private final JarRemapper toNmsRemapper;
private final List<PluginPatcher> patchers;
public ArclightRemapper() throws Exception {
this.toNmsMapping = new JarMapping();
@ -82,7 +84,7 @@ public class ArclightRemapper {
this.transformerList.add(ArclightInterfaceInvokerGen.INSTANCE);
this.transformerList.add(ArclightRedirectAdapter.INSTANCE);
this.transformerList.add(ClassLoaderAdapter.INSTANCE);
ArclightPluginPatcher.load(this.transformerList);
this.patchers = ArclightPluginPatcher.load(this.transformerList);
toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider());
this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping);
this.toNmsRemapper = new LenientJarRemapper(toNmsMapping);
@ -105,6 +107,10 @@ public class ArclightRemapper {
return transformerList;
}
public List<PluginPatcher> getPatchers() {
return patchers;
}
private static long pkgOffset, clOffset, mdOffset, fdOffset, mapOffset;
static {

View File

@ -14,6 +14,7 @@ import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
@ -35,7 +36,7 @@ public class ArclightPluginPatcher implements PluginTransformer {
}
}
public static void load(List<PluginTransformer> transformerList) {
public static List<PluginPatcher> load(List<PluginTransformer> transformerList) {
File pluginFolder = new File("plugins");
if (pluginFolder.exists()) {
ArclightMod.LOGGER.info("patcher.loading");
@ -51,9 +52,11 @@ public class ArclightPluginPatcher implements PluginTransformer {
list.sort(Comparator.comparing(PluginPatcher::priority));
ArclightMod.LOGGER.info("patcher.loaded", list.size());
transformerList.add(new ArclightPluginPatcher(list));
return list;
}
}
}
return Collections.emptyList();
}
private static Optional<PluginPatcher> loadFromJar(File file) {