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.Hasher;
import com.google.common.hash.Hashing; import com.google.common.hash.Hashing;
import cpw.mods.modlauncher.api.LamdbaExceptionUtils; import cpw.mods.modlauncher.api.LamdbaExceptionUtils;
import io.izzel.arclight.api.PluginPatcher;
import io.izzel.arclight.common.mod.ArclightMod; import io.izzel.arclight.common.mod.ArclightMod;
import io.izzel.arclight.i18n.ArclightConfig; import io.izzel.arclight.i18n.ArclightConfig;
import io.izzel.tools.product.Product; 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 final Path basePath = Paths.get(".arclight/class_cache");
private ScheduledExecutorService executor; 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() { public Impl() {
if (!enabled) return; if (!enabled) return;
executor = Executors.newSingleThreadScheduledExecutor(r -> { executor = Executors.newSingleThreadScheduledExecutor(r -> {
@ -91,8 +106,7 @@ public abstract class ArclightClassCache implements AutoCloseable {
if (!Files.isDirectory(basePath)) { if (!Files.isDirectory(basePath)) {
Files.createDirectories(basePath); Files.createDirectories(basePath);
} }
String current = ModList.get().getModContainerById("arclight") String current = currentVersionInfo();
.orElseThrow(IllegalStateException::new).getModInfo().getVersion().toString();
String store; String store;
Path version = basePath.resolve(".version"); Path version = basePath.resolve(".version");
if (Files.exists(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.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import io.izzel.arclight.api.PluginPatcher;
import io.izzel.arclight.api.Unsafe; import io.izzel.arclight.api.Unsafe;
import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger; import io.izzel.arclight.common.mod.util.log.ArclightI18nLogger;
import io.izzel.arclight.common.mod.util.remapper.patcher.ArclightPluginPatcher; 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 List<PluginTransformer> transformerList = new ArrayList<>();
private final JarRemapper toBukkitRemapper; private final JarRemapper toBukkitRemapper;
private final JarRemapper toNmsRemapper; private final JarRemapper toNmsRemapper;
private final List<PluginPatcher> patchers;
public ArclightRemapper() throws Exception { public ArclightRemapper() throws Exception {
this.toNmsMapping = new JarMapping(); this.toNmsMapping = new JarMapping();
@ -82,7 +84,7 @@ public class ArclightRemapper {
this.transformerList.add(ArclightInterfaceInvokerGen.INSTANCE); this.transformerList.add(ArclightInterfaceInvokerGen.INSTANCE);
this.transformerList.add(ArclightRedirectAdapter.INSTANCE); this.transformerList.add(ArclightRedirectAdapter.INSTANCE);
this.transformerList.add(ClassLoaderAdapter.INSTANCE); this.transformerList.add(ClassLoaderAdapter.INSTANCE);
ArclightPluginPatcher.load(this.transformerList); this.patchers = ArclightPluginPatcher.load(this.transformerList);
toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider()); toBukkitMapping.setFallbackInheritanceProvider(GlobalClassRepo.inheritanceProvider());
this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping); this.toBukkitRemapper = new LenientJarRemapper(toBukkitMapping);
this.toNmsRemapper = new LenientJarRemapper(toNmsMapping); this.toNmsRemapper = new LenientJarRemapper(toNmsMapping);
@ -105,6 +107,10 @@ public class ArclightRemapper {
return transformerList; return transformerList;
} }
public List<PluginPatcher> getPatchers() {
return patchers;
}
private static long pkgOffset, clOffset, mdOffset, fdOffset, mapOffset; private static long pkgOffset, clOffset, mdOffset, fdOffset, mapOffset;
static { static {

View File

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