Skip to content

Commit

Permalink
Fix mod detection
Browse files Browse the repository at this point in the history
  • Loading branch information
embeddedt committed May 3, 2024
1 parent 85a7a3f commit 6d5ed23
Showing 1 changed file with 45 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,21 +1,64 @@
package org.embeddedt.archaicfix.helpers;

import com.google.common.collect.ListMultimap;
import cpw.mods.fml.common.LoadController;
import cpw.mods.fml.common.Loader;
import cpw.mods.fml.common.ModContainer;
import cpw.mods.fml.relauncher.ReflectionHelper;
import net.minecraft.world.ChunkCoordIntPair;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import org.embeddedt.archaicfix.ArchaicLogger;
import org.embeddedt.archaicfix.config.ArchaicConfig;

import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.util.LinkedList;
import java.util.List;

public class CascadeDetectionHelper {
private static final ThreadLocal<LinkedList<ChunkCoordIntPair>> arch$populatingChunk = ThreadLocal.withInitial(LinkedList::new);

private static final LoadController controller = ReflectionHelper.getPrivateValue(Loader.class, Loader.instance(), "modController");
private static final ListMultimap<String, ModContainer> packageOwners = ReflectionHelper.getPrivateValue(LoadController.class, controller, "packageOwners");
private static final MethodHandle callingStackGetter;

static {
try {
callingStackGetter = MethodHandles.publicLookup().unreflect(ReflectionHelper.findMethod(LoadController.class, controller, new String[] { "getCallingStack" }));
} catch(ReflectiveOperationException e) {
throw new AssertionError(e);
}
}

private static Class<?>[] getCallingStack() {
try {
return (Class<?>[])callingStackGetter.invokeExact();
} catch(Throwable e) {
return new Class[0];
}
}

private static ModContainer findModContainer() {
for(Class<?> clz : getCallingStack()) {
if(clz.getName().startsWith("net.minecraft") || clz.getName().startsWith("org.embeddedt.archaicfix")) {
continue;
}
int idx = clz.getName().lastIndexOf('.');
if(idx == -1) {
continue;
}
String pkg = clz.getName().substring(0, idx);
List<ModContainer> containers = packageOwners.get(pkg);
if(containers != null) {
return containers.get(0);
}
}
return null;
}

private static void logCascadingWorldGeneration(Chunk chunk, LinkedList<ChunkCoordIntPair> stack)
{
ModContainer activeModContainer = Loader.instance().activeModContainer();
ModContainer activeModContainer = findModContainer();
String format = "{} loaded a new chunk {} in dimension {} ({}) while populating chunk {}, causing cascading worldgen lag.";

ChunkCoordIntPair pos = new ChunkCoordIntPair(chunk.xPosition, chunk.zPosition);
Expand Down

0 comments on commit 6d5ed23

Please sign in to comment.