Skip to content

Commit 0521b0a

Browse files
committed
fix: Crash with gtnhlib
Closes: #242
1 parent f50495f commit 0521b0a

5 files changed

Lines changed: 81 additions & 28 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ dependencies {
257257
compileOnly(deobf("optifine:optifine:1.7.10_hd_u_e7"))
258258

259259
compileOnly("com.gtnewhorizons.retrofuturabootstrap:RetroFuturaBootstrap:1.0.7")
260-
compileOnly("com.github.GTNewHorizons:GTNHLib:0.5.21:api")
260+
compileOnly("com.github.GTNewHorizons:GTNHLib:0.8.4")
261261

262262
compileOnly("com.github.basdxz:Apparatus:2.12.3:dev") { excludeDeps() }
263263
compileOnly("com.github.jss2a98aj:NotFine:0.2.5:dev") { excludeDeps() }

src/main/java/com/falsepattern/falsetweaks/asm/ASMFixerUtility.java

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,67 @@
2222

2323
package com.falsepattern.falsetweaks.asm;
2424

25+
import lombok.RequiredArgsConstructor;
26+
import lombok.SneakyThrows;
2527
import lombok.val;
2628

2729
import net.minecraft.launchwrapper.IClassTransformer;
30+
import net.minecraft.launchwrapper.Launch;
2831

32+
import java.lang.reflect.Field;
33+
import java.util.AbstractList;
2934
import java.util.List;
3035

3136
public class ASMFixerUtility {
32-
public static void removeGTNHLibHook(List<IClassTransformer> transformers) {
33-
val iter = transformers.iterator();
34-
while (iter.hasNext()) {
35-
val transformer = iter.next();
36-
if (transformer.getClass()
37-
.getName()
38-
.equals("com.gtnewhorizon.gtnhlib.core.transformer.TessellatorRedirectorTransformer")) {
39-
iter.remove();
40-
}
37+
@SneakyThrows
38+
public static void removeGTNHLibThreadingHook(Field f) {
39+
val transformers = (List<IClassTransformer>)f.get(Launch.classLoader);
40+
transformers.removeIf(ASMFixerUtility::isForbidden);
41+
f.set(Launch.classLoader, new ThreadSafeTransformerFilterList<>(transformers));
42+
}
43+
44+
private static boolean isForbidden(Object obj) {
45+
val n = obj.getClass().getName();
46+
return n.startsWith("com.gtnewhorizon.gtnhlib") && n.endsWith("TessellatorRedirectorTransformer");
47+
}
48+
49+
@RequiredArgsConstructor
50+
private static class ThreadSafeTransformerFilterList<T> extends AbstractList<T> {
51+
private final List<T> real;
52+
@Override
53+
public T get(int index) {
54+
return real.get(index);
55+
}
56+
57+
@Override
58+
public int size() {
59+
return real.size();
60+
}
61+
62+
@Override
63+
public boolean add(T t) {
64+
if (isForbidden(t))
65+
return false;
66+
return real.add(t);
67+
}
68+
69+
@Override
70+
public T set(int index, T element) {
71+
if (isForbidden(element))
72+
return null;
73+
return real.set(index, element);
74+
}
75+
76+
@Override
77+
public void add(int index, T element) {
78+
if (isForbidden(element))
79+
return;
80+
real.add(index, element);
81+
}
82+
83+
@Override
84+
public T remove(int index) {
85+
return real.remove(index);
4186
}
4287
}
4388
}

src/main/java/com/falsepattern/falsetweaks/asm/CoreLoadingPlugin.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
import org.spongepowered.asm.service.mojang.MixinServiceLaunchWrapper;
4040

4141
import net.minecraft.launchwrapper.IClassTransformer;
42+
import net.minecraft.launchwrapper.LaunchClassLoader;
4243
import cpw.mods.fml.relauncher.FMLLaunchHandler;
4344
import cpw.mods.fml.relauncher.IFMLLoadingPlugin;
4445

@@ -63,8 +64,12 @@ public class CoreLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader {
6364

6465
if (isClient) {
6566
if (ModuleConfig.THREADED_CHUNK_UPDATES) {
67+
try {
68+
val f = LaunchClassLoader.class.getDeclaredField("transformers");
69+
f.setAccessible(true);
70+
ASMFixerUtility.removeGTNHLibThreadingHook(f);
71+
} catch (Throwable ignores) {}
6672
ThreadingCompat.executeConfigFixes();
67-
pleaseDontBreakMyThreadedRendering();
6873
}
6974

7075
if (ModuleConfig.TEXTURE_OPTIMIZATIONS) {
@@ -81,19 +86,6 @@ public class CoreLoadingPlugin implements IFMLLoadingPlugin, IEarlyMixinLoader {
8186
}
8287
}
8388

84-
@SuppressWarnings("unchecked")
85-
private static void pleaseDontBreakMyThreadedRendering() {
86-
// Evil hack
87-
try {
88-
val theClass = Class.forName("com.gtnewhorizon.gtnhlib.core.transformer.TessellatorRedirectorTransformer");
89-
val exclusionsField = theClass.getDeclaredField("TransformerExclusions");
90-
exclusionsField.setAccessible(true);
91-
val exclusions = (List<String>) exclusionsField.get(null);
92-
exclusions.set(0, "");
93-
} catch (Throwable ignored) {
94-
}
95-
}
96-
9789
@Override
9890
public String[] getASMTransformerClass() {
9991
val mixinTweakClasses = GlobalProperties.<List<String>>get(MixinServiceLaunchWrapper.BLACKBOARD_KEY_TWEAKCLASSES);

src/main/java/com/falsepattern/falsetweaks/asm/MixinCompatHackTweaker.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,6 @@ public String[] getLaunchArguments() {
5555
val f = LaunchClassLoader.class.getDeclaredField("transformers");
5656
f.setAccessible(true);
5757
val transformers = (List<IClassTransformer>) f.get(Launch.classLoader);
58-
try {
59-
ASMFixerUtility.removeGTNHLibHook(transformers);
60-
} catch (Throwable ignored) {
61-
}
6258
transformers.add(CoreLoadingPlugin.FIELD_HACK_TF);
6359
return new String[0];
6460
}

src/main/java/com/falsepattern/falsetweaks/modules/threadedupdates/ThreadTessellator.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,25 @@
2323
package com.falsepattern.falsetweaks.modules.threadedupdates;
2424

2525
import com.falsepattern.falsetweaks.modules.threading.MainThreadContainer;
26+
import com.gtnewhorizon.gtnhlib.api.CapturingTesselator;
2627
import lombok.val;
2728

2829
import net.minecraft.client.renderer.Tessellator;
30+
import cpw.mods.fml.common.Loader;
2931

3032
public class ThreadTessellator {
3133
private static final ThreadLocal<Tessellator> TESS = ThreadLocal.withInitial(Tessellator::new);
34+
private static final boolean GTNHLIB_PRESENT = Loader.isModLoaded("gtnhlib");
3235

3336
public static Tessellator getThreadTessellator() {
37+
if (GTNHLIB_PRESENT) {
38+
return GTNHLibInterop.getThreadTessellator();
39+
} else {
40+
return getThreadTessellatorRaw();
41+
}
42+
}
43+
44+
private static Tessellator getThreadTessellatorRaw() {
3445
if (MainThreadContainer.isMainThread()) {
3546
return mainThreadTessellator();
3647
} else {
@@ -47,4 +58,13 @@ public static Tessellator swapMainTessellator(Tessellator tess) {
4758
Tessellator.instance = tess;
4859
return old;
4960
}
61+
62+
private static class GTNHLibInterop {
63+
public static Tessellator getThreadTessellator() {
64+
if (CapturingTesselator.isCapturing()) {
65+
return CapturingTesselator.getThreadTesselator();
66+
}
67+
return getThreadTessellatorRaw();
68+
}
69+
}
5070
}

0 commit comments

Comments
 (0)