diff --git a/build.gradle b/build.gradle index 0e4577d..8484448 100644 --- a/build.gradle +++ b/build.gradle @@ -3,33 +3,30 @@ buildscript { jcenter() maven { url = 'https://maven.fabricmc.net/' } } + dependencies { - classpath "net.fabricmc:fabric-loom:0.2.5-SNAPSHOT" + classpath 'net.fabricmc:fabric-loom:0.2.6-SNAPSHOT' } } apply plugin: "java" -apply plugin: net.fabricmc.loom.LoomGradlePlugin +apply plugin: "fabric-loom" sourceCompatibility = 1.8 targetCompatibility = 1.8 -dependencies { - minecraft "com.mojang:minecraft:19w35a" - mappings "net.fabricmc:yarn:19w35a+build.1" - modCompile "net.fabricmc:fabric-loader:0.6.1+build.164" -// modCompile "net.fabricmc.fabric-api:fabric-api:0.3.2+build.217-1.15" +repositories { + maven { url = 'https://maven.fabricmc.net/' } } -def travisBuildNumber = System.getenv("TRAVIS_BUILD_NUMBER") -def versionSuffix = travisBuildNumber != null ? travisBuildNumber : "SNAPSHOT" +dependencies { + minecraft "com.mojang:minecraft:${project.minecraft_version}" + mappings "net.fabricmc:yarn:${project.yarn_version}" + modCompile "net.fabricmc:fabric-loader:${project.loader_version}" +} -version "1.0.1" -group "org.dimdev.toomanycrashes" -archivesBaseName = "TooManyCrashes" - -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +version "1.0.2" +archivesBaseName = "too-many-crashes" processResources { filesMatching("fabric.mod.json") { @@ -39,12 +36,6 @@ processResources { inputs.property "version", project.version } -task sourcesJar(type: Jar, dependsOn: classes) { - classifier "sources" - from sourceSets.main.allSource -} - artifacts { archives jar - archives sourcesJar } diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..cc9e188 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,3 @@ +minecraft_version=1.15 +yarn_version=1.15+build.1 +loader_version=0.7.2+build.174 diff --git a/src/main/java/org/dimdev/toomanycrashes/CrashScreen.java b/src/main/java/org/dimdev/toomanycrashes/CrashScreen.java index db1c938..ce0f1f1 100644 --- a/src/main/java/org/dimdev/toomanycrashes/CrashScreen.java +++ b/src/main/java/org/dimdev/toomanycrashes/CrashScreen.java @@ -2,15 +2,10 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.minecraft.client.font.TextRenderer; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; -import net.minecraft.util.SystemUtil; import net.minecraft.util.crash.CrashReport; -import net.minecraft.util.math.Box; - -import java.io.File; @Environment(EnvType.CLIENT) public class CrashScreen extends ProblemScreen { @@ -23,7 +18,7 @@ public CrashScreen(CrashReport report) { public void init() { super.init(); ButtonWidget mainMenuButton = new ButtonWidget(width / 2 - 155, height / 4 + 120 + 12, 150, 20, I18n.translate("gui.toTitle"), - button -> minecraft.openScreen(new TitleScreen())); + button -> minecraft.openScreen(new TitleScreen())); if (ModConfig.instance().disableReturnToMainMenu) { mainMenuButton.active = false; diff --git a/src/main/java/org/dimdev/toomanycrashes/CrashUtils.java b/src/main/java/org/dimdev/toomanycrashes/CrashUtils.java index 2311096..cbb2150 100644 --- a/src/main/java/org/dimdev/toomanycrashes/CrashUtils.java +++ b/src/main/java/org/dimdev/toomanycrashes/CrashUtils.java @@ -7,19 +7,18 @@ import org.apache.logging.log4j.Logger; import java.io.File; -import java.text.SimpleDateFormat; -import java.util.Date; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; public final class CrashUtils { - private static final Logger LOGGER = LogManager.getLogger("TMC"); - private static boolean isClient; + private static boolean clientSide; static { try { - isClient = MinecraftClient.getInstance() != null; + clientSide = MinecraftClient.getInstance() != null; } catch (NoClassDefFoundError e) { - isClient = false; + clientSide = false; } } @@ -27,8 +26,8 @@ public static void outputReport(CrashReport report) { try { if (report.getFile() == null) { String reportName = "crash-"; - reportName += new SimpleDateFormat("yyyy-MM-dd_HH.mm.ss").format(new Date()); - reportName += isClient && MinecraftClient.getInstance().isOnThread() ? "-client" : "-server"; + reportName += LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + reportName += clientSide && MinecraftClient.getInstance().isOnThread() ? "-client" : "-server"; reportName += ".txt"; File reportsDir = new File(FabricLoader.getInstance().getGameDirectory(), "crash-reports"); @@ -40,8 +39,11 @@ public static void outputReport(CrashReport report) { LOGGER.fatal("Failed saving report", e); } - LOGGER.fatal("Minecraft ran into a problem! " + (report.getFile() != null ? "Report saved to: " + report.getFile() : - "Crash report could not be saved.") + "\n" + - report.asString()); + LOGGER.fatal( + "Minecraft ran into a problem! " + + (report.getFile() != null ? "Report saved to: " + report.getFile() : "Crash report could not be saved.") + + "\n" + + report.asString() + ); } } diff --git a/src/main/java/org/dimdev/toomanycrashes/ModConfig.java b/src/main/java/org/dimdev/toomanycrashes/ModConfig.java index a4c3c1b..bcd09eb 100644 --- a/src/main/java/org/dimdev/toomanycrashes/ModConfig.java +++ b/src/main/java/org/dimdev/toomanycrashes/ModConfig.java @@ -11,7 +11,6 @@ import java.io.IOException; public class ModConfig { - private static final File CONFIG_FILE = new File(FabricLoader.getInstance().getConfigDirectory(), "toomanycrashes.json"); private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create(); private static ModConfig instance = null; diff --git a/src/main/java/org/dimdev/toomanycrashes/PatchedClient.java b/src/main/java/org/dimdev/toomanycrashes/PatchedClient.java index 0c0d51c..520e9c9 100644 --- a/src/main/java/org/dimdev/toomanycrashes/PatchedClient.java +++ b/src/main/java/org/dimdev/toomanycrashes/PatchedClient.java @@ -3,6 +3,5 @@ import net.minecraft.util.crash.CrashReport; public interface PatchedClient { - void displayInitErrorScreen(CrashReport report); } diff --git a/src/main/java/org/dimdev/toomanycrashes/PatchedIntegratedServer.java b/src/main/java/org/dimdev/toomanycrashes/PatchedIntegratedServer.java index 89484e1..99bf149 100644 --- a/src/main/java/org/dimdev/toomanycrashes/PatchedIntegratedServer.java +++ b/src/main/java/org/dimdev/toomanycrashes/PatchedIntegratedServer.java @@ -1,6 +1,5 @@ package org.dimdev.toomanycrashes; public interface PatchedIntegratedServer { - - void setCrashNextTick(); + void scheduleCrash(); } diff --git a/src/main/java/org/dimdev/toomanycrashes/ProblemScreen.java b/src/main/java/org/dimdev/toomanycrashes/ProblemScreen.java index 78a2bdf..f1484c2 100644 --- a/src/main/java/org/dimdev/toomanycrashes/ProblemScreen.java +++ b/src/main/java/org/dimdev/toomanycrashes/ProblemScreen.java @@ -3,12 +3,11 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.fabricmc.loader.api.metadata.ModMetadata; -import net.minecraft.client.gui.screen.ConfirmChatLinkScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.widget.ButtonWidget; import net.minecraft.client.resource.language.I18n; import net.minecraft.text.LiteralText; -import net.minecraft.util.SystemUtil; +import net.minecraft.util.Util; import net.minecraft.util.crash.CrashReport; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -16,24 +15,20 @@ import org.dimdev.utils.HasteUpload; import java.io.File; -import java.lang.reflect.Field; -import java.net.URI; import java.util.ArrayList; import java.util.List; import java.util.Set; @Environment(EnvType.CLIENT) public abstract class ProblemScreen extends Screen { - private static final Logger LOGGER = LogManager.getLogger(); - protected final CrashReport report; - private String hasteLink = null; + private String reportLink = null; private String modListString = null; - protected int xLeft = Integer.MAX_VALUE; - protected int xRight = Integer.MIN_VALUE; - protected int yTop = Integer.MAX_VALUE; - protected int yBottom = Integer.MIN_VALUE; + protected int fileNameLeft = Integer.MAX_VALUE; + protected int fileNameRight = Integer.MIN_VALUE; + protected int fileNameTop = Integer.MAX_VALUE; + protected int fileNameBottom = Integer.MIN_VALUE; protected ProblemScreen(CrashReport report) { super(new LiteralText("")); @@ -45,21 +40,11 @@ public void init() { addButton(new ButtonWidget(width / 2 - 155 + 160, height / 4 + 120 + 12, 150, 20, I18n.translate("toomanycrashes.gui.getLink"), buttonWidget -> { try { - if (hasteLink == null) { - hasteLink = HasteUpload.uploadToHaste(ModConfig.instance().hasteURL, "mccrash", report.asString()); + if (reportLink == null) { + reportLink = HasteUpload.uploadToHaste(ModConfig.instance().hasteURL, "mccrash", report.asString()); } - Field uriField; - //noinspection JavaReflectionMemberAccess - uriField = Screen.class.getDeclaredField("clickedLink"); - uriField.setAccessible(true); - uriField.set(ProblemScreen.this, new URI(hasteLink)); - minecraft.openScreen(new ConfirmChatLinkScreen(b -> { - if (b) { - SystemUtil.getOperatingSystem().open(hasteLink); - } - this.minecraft.openScreen(this); - }, hasteLink, false)); + Util.getOperatingSystem().open(reportLink); } catch (Throwable e) { LOGGER.error("Exception when crash menu button clicked:", e); buttonWidget.setMessage(I18n.translate("toomanycrashes.gui.failed")); @@ -70,10 +55,11 @@ public void init() { @Override public boolean mouseClicked(double x, double y, int int_1) { - if (x >= xLeft && x <= xRight && y >= yTop && y <= yBottom) { + if (x >= fileNameLeft && x <= fileNameRight && y >= fileNameTop && y <= fileNameBottom) { File file = report.getFile(); + if (file != null) { - SystemUtil.getOperatingSystem().open(file); + Util.getOperatingSystem().open(file); } } return super.mouseClicked(x, y, int_1); @@ -106,11 +92,11 @@ protected String getModListString() { protected void drawFileNameString(int y) { String fileNameString = report.getFile() != null ? "\u00A7n" + report.getFile().getName() : I18n.translate("toomanycrashes.crashscreen.reportSaveFailed"); - int stLen = font.getStringWidth(fileNameString); - xLeft = width / 2 - stLen / 2; - xRight = width / 2 + stLen / 2; - drawString(font, fileNameString, xLeft, y += 11, 0x00FF00); - yTop = y; - yBottom = y + 10; + int length = font.getStringWidth(fileNameString); + fileNameLeft = width / 2 - length / 2; + fileNameRight = width / 2 + length / 2; + drawString(font, fileNameString, fileNameLeft, y += 11, 0x00FF00); + fileNameTop = y; + fileNameBottom = y + 10; } } diff --git a/src/main/java/org/dimdev/toomanycrashes/StacktraceDeobfuscator.java b/src/main/java/org/dimdev/toomanycrashes/StacktraceDeobfuscator.java index 99dadce..0dc1d7e 100644 --- a/src/main/java/org/dimdev/toomanycrashes/StacktraceDeobfuscator.java +++ b/src/main/java/org/dimdev/toomanycrashes/StacktraceDeobfuscator.java @@ -1,36 +1,128 @@ package org.dimdev.toomanycrashes; -import java.io.BufferedReader; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import net.fabricmc.loader.api.FabricLoader; +import net.fabricmc.tinyremapper.IMappingProvider; +import net.fabricmc.tinyremapper.TinyUtils; +import net.minecraft.SharedConstants; +import org.apache.commons.io.IOUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + import java.io.IOException; -import java.io.InputStreamReader; -import java.util.ArrayDeque; -import java.util.Collections; -import java.util.Deque; -import java.util.HashMap; -import java.util.Map; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; +import java.util.*; +import java.util.jar.JarEntry; +import java.util.jar.JarInputStream; public final class StacktraceDeobfuscator { + private static final Logger LOGGER = LogManager.getLogger(); + private static final Path MAPPINGS_DIRECTORY = FabricLoader.getInstance().getConfigDirectory().toPath().resolve("toomanycrashes"); + private static final long MAPPING_CACHE_TIME = 14 * 24 * 60 * 60 * 1000; + private static final Map mappings = new HashMap<>(); - public static final String MAPPINGS = "mappings/mappings.tiny"; - private static Map mappings = null; + static { + try { + Files.createDirectories(MAPPINGS_DIRECTORY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } public static void init() { - Map mappings = new HashMap<>(); - try (BufferedReader mappingReader = new BufferedReader( - new InputStreamReader(StacktraceDeobfuscator.class.getClassLoader().getResourceAsStream(MAPPINGS)))) { - // TinyUtils.read( - // mappingReader, - // "intermediary", - // "named", - // (key, value) -> mappings.put(key.replace('/', '.'), value.replace('/', '.')), - // (intermediary, named) -> mappings.put(intermediary.name, named.name), - // (intermediary, named) -> mappings.put(intermediary.name, named.name) - // ); todo no more named + mappings.clear(); + String version = SharedConstants.getGameVersion().getName(); + Path infoFile = MAPPINGS_DIRECTORY.resolve("mapping-info"); + String[] mappingInfo = read(infoFile, "none 0 0").split(" "); + Path mappingsFile = MAPPINGS_DIRECTORY.resolve(mappingInfo[0] + "-" + mappingInfo[1] + ".tinyv2"); + + if (!mappingInfo[0].equals(version) || System.currentTimeMillis() - Integer.parseInt(mappingInfo[2]) > MAPPING_CACHE_TIME || !Files.exists(mappingsFile)) { + try { + LOGGER.info("Updating mappings"); + + Map builds = new Gson().fromJson( + IOUtils.toString(new URL("https://maven.fabricmc.net/net/fabricmc/yarn/versions.json"), StandardCharsets.UTF_8), + TypeToken.getParameterized(Map.class, String.class, int[].class).getType() + ); + + int[] buildsForVersion = builds.get(version); + + if (buildsForVersion == null) { + throw new RuntimeException("no yarn version for " + version); + } + + int build = buildsForVersion[buildsForVersion.length - 1]; + + if (Integer.parseInt(mappingInfo[1]) != build) { + String mavenVersion = version + "+build." + build; + String mappings = null; + + try (JarInputStream jin = new JarInputStream( + new URL("https://maven.fabricmc.net/net/fabricmc/yarn/" + mavenVersion + "/yarn-" + mavenVersion + "-v2.jar").openStream())) { + JarEntry entry; + while ((entry = jin.getNextJarEntry()) != null) { + if (entry.getName().equals("mappings/mappings.tiny")) { + mappings = IOUtils.toString(jin, StandardCharsets.UTF_8); + break; + } + } + } + + if (mappings == null) { + throw new RuntimeException("mappings jar didn't contain mappings"); + } + + Files.write(infoFile, (version + " " + build + " " + System.currentTimeMillis()).getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); + Files.write(mappingsFile, mappings.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE); + } + } catch (Throwable t) { + if (Files.exists(mappingsFile)) { + LOGGER.error("failed to update mappings", t); + } else { + throw new RuntimeException("failed to update mappings", t); + } + } + } + + TinyUtils.createTinyMappingProvider(mappingsFile, "intermediary", "named").load(new IMappingProvider.MappingAcceptor() { + @Override + public void acceptClass(String srcName, String dstName) { + mappings.put(srcName, dstName); + } + + @Override + public void acceptMethod(IMappingProvider.Member method, String dstName) { + mappings.put(method.name, dstName); + } + + @Override + public void acceptMethodArg(IMappingProvider.Member method, int lvIndex, String dstName) {} + + @Override + public void acceptMethodVar(IMappingProvider.Member method, int lvIndex, int startOpIdx, int asmIndex, String dstName) {} + + @Override + public void acceptField(IMappingProvider.Member field, String dstName) { + mappings.put(field.name, dstName); + } + }); + } + + private static String read(Path path, String fallback) { + if (!Files.exists(path)) { + return fallback; + } + + try { + return new String(Files.readAllBytes(path), StandardCharsets.UTF_8); } catch (IOException e) { throw new RuntimeException(e); } - - StacktraceDeobfuscator.mappings = mappings; } public static void deobfuscateThrowable(Throwable t) { @@ -82,6 +174,7 @@ public static String getFileName(String className) { public static void main(String[] args) { init(); + for (Map.Entry entry : mappings.entrySet()) { System.out.println(entry.getKey() + " <=> " + entry.getValue()); } diff --git a/src/main/java/org/dimdev/toomanycrashes/StateManager.java b/src/main/java/org/dimdev/toomanycrashes/StateManager.java index b21e607..db861b8 100644 --- a/src/main/java/org/dimdev/toomanycrashes/StateManager.java +++ b/src/main/java/org/dimdev/toomanycrashes/StateManager.java @@ -11,14 +11,12 @@ * registered here. */ public class StateManager { - - // Use WeakReference to allow garbage collection, preventing memory leaks - private static Set> resettableRefs = new HashSet<>(); + private static final Set> RESETTABLES = new HashSet<>(); public static void resetStates() { - Iterator> iterator = resettableRefs.iterator(); + Iterator> iterator = RESETTABLES.iterator(); while (iterator.hasNext()) { - WeakReference ref = iterator.next(); + WeakReference ref = iterator.next(); if (ref.get() != null) { ref.get().resetState(); } else { @@ -27,10 +25,9 @@ public static void resetStates() { } } - public interface IResettable { - + public interface Resettable { default void register() { - resettableRefs.add(new WeakReference<>(this)); + RESETTABLES.add(new WeakReference<>(this)); } void resetState(); diff --git a/src/main/java/org/dimdev/toomanycrashes/TooManyCrashes.java b/src/main/java/org/dimdev/toomanycrashes/TooManyCrashes.java index 2399c50..776974c 100644 --- a/src/main/java/org/dimdev/toomanycrashes/TooManyCrashes.java +++ b/src/main/java/org/dimdev/toomanycrashes/TooManyCrashes.java @@ -20,7 +20,7 @@ public class TooManyCrashes implements ModInitializer { public void onInitialize() { ModConfig.instance(); trustIdenTrust(); - //initStacktraceDeobfuscator(); + initStacktraceDeobfuscator(); } private void trustIdenTrust() { @@ -35,15 +35,12 @@ private void trustIdenTrust() { } private void initStacktraceDeobfuscator() { - LOGGER.info("Initializing StacktraceDeobfuscator"); try { StacktraceDeobfuscator.init(); } catch (Exception e) { LOGGER.error("Failed to load mappings!", e); } - LOGGER.info("Done initializing StacktraceDeobfuscator"); - // Install the log exception deobfuscation rewrite policy DeobfuscatingRewritePolicy.install(); } } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinTileEntity.java b/src/main/java/org/dimdev/toomanycrashes/mixins/BlockEntityMixin.java similarity index 82% rename from src/main/java/org/dimdev/toomanycrashes/mixins/MixinTileEntity.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/BlockEntityMixin.java index 8180e52..d14d0c1 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinTileEntity.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/BlockEntityMixin.java @@ -9,16 +9,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = BlockEntity.class, priority = 10000) -public class MixinTileEntity { - - private boolean noNBT = false; +public class BlockEntityMixin { + private boolean skipNbt = false; @Inject(method = "populateCrashReport", at = @At("TAIL")) private void onPopulateCrashReport(CrashReportSection section, CallbackInfo ci) { - if (!noNBT) { - noNBT = true; + if (!skipNbt) { + skipNbt = true; section.add("Block Entity NBT", () -> ((BlockEntity) (Object) this).toTag(new CompoundTag()).toString()); - noNBT = false; + skipNbt = false; } } } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReport.java b/src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportMixin.java similarity index 98% rename from src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReport.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportMixin.java index 0d546fb..8478da5 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReport.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportMixin.java @@ -25,8 +25,7 @@ import java.util.Set; @Mixin(value = CrashReport.class, priority = 500) -public abstract class MixinCrashReport implements PatchedCrashReport { - +public abstract class CrashReportMixin implements PatchedCrashReport { private static final boolean ANNOYING_EASTER_EGG_DISABLED = true; @Shadow @Final private CrashReportSection systemDetailsSection; @Shadow @Final private List otherSections; diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReportSection.java b/src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportSectionMixin.java similarity index 82% rename from src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReportSection.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportSectionMixin.java index e230c59..bc60e89 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinCrashReportSection.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/CrashReportSectionMixin.java @@ -11,31 +11,29 @@ import java.util.List; @Mixin(CrashReportSection.class) -public class MixinCrashReportSection { - +public class CrashReportSectionMixin { @Shadow @Final private String title; @Shadow @Final private List elements; @Shadow private StackTraceElement[] stackTrace; /** - * @reason Disable stack trace pruning + * Disable stack trace trimming (causes confusing stack traces) */ @Overwrite - public void method_580(int size) { - } + public void trimStackTraceEnd(int size) {} /** - * @reason Disable stack trace pruning, deobfuscate stack trace + * Disable stack trace pruning (causes confusing stack traces) */ @Overwrite - public int trimStackTrace(int prune) { + public int initStackTrace(int prune) { stackTrace = StacktraceDeobfuscator.deobfuscateStacktrace(Thread.currentThread().getStackTrace()); return stackTrace.length; } /** - * @reason Improve crash report formatting - **/ + * Improve crash report formatting + */ @Overwrite public void addStackTrace(StringBuilder builder) { builder.append("-- ").append(title).append(" --\n"); @@ -45,8 +43,8 @@ public void addStackTrace(StringBuilder builder) { String sectionIndent = " "; builder.append(sectionIndent) - .append(element.invokeGetName()) - .append(": "); + .append(element.invokeGetName()) + .append(": "); StringBuilder indent = new StringBuilder(sectionIndent + " "); for (char ignored : element.invokeGetName().toCharArray()) { diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinEntity.java b/src/main/java/org/dimdev/toomanycrashes/mixins/EntityMixin.java similarity index 82% rename from src/main/java/org/dimdev/toomanycrashes/mixins/MixinEntity.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/EntityMixin.java index cb2c95c..33878d7 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinEntity.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/EntityMixin.java @@ -9,16 +9,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(value = Entity.class, priority = 10000) -public class MixinEntity { - - private boolean noNBT = false; +public class EntityMixin { + private boolean skipNbt = false; @Inject(method = "populateCrashReport", at = @At("TAIL")) private void onPopulateCrashReport(CrashReportSection section, CallbackInfo ci) { - if (!noNBT) { - noNBT = true; + if (!skipNbt) { + skipNbt = true; section.add("Entity NBT", () -> ((Entity) (Object) this).toTag(new CompoundTag()).toString()); - noNBT = false; + skipNbt = false; } } } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinIntegratedServer.java b/src/main/java/org/dimdev/toomanycrashes/mixins/IntegratedServerMixin.java similarity index 79% rename from src/main/java/org/dimdev/toomanycrashes/mixins/MixinIntegratedServer.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/IntegratedServerMixin.java index 2d38cbb..230cfee 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/MixinIntegratedServer.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/IntegratedServerMixin.java @@ -10,18 +10,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(IntegratedServer.class) -public class MixinIntegratedServer implements PatchedIntegratedServer { - - private boolean crashNextTick = false; +public class IntegratedServerMixin implements PatchedIntegratedServer { + private boolean crashScheduled = false; @Override - public void setCrashNextTick() { - crashNextTick = true; + public void scheduleCrash() { + crashScheduled = true; } @Inject(method = "tick(Ljava/util/function/BooleanSupplier;)V", at = @At("HEAD")) private void beforeTick(CallbackInfo ci) { - if (crashNextTick) { + if (crashScheduled) { throw new CrashException(new CrashReport("Manually triggered server-side debug crash", new Throwable())); } } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinBufferBuilder.java b/src/main/java/org/dimdev/toomanycrashes/mixins/client/BufferBuilderMixin.java similarity index 83% rename from src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinBufferBuilder.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/client/BufferBuilderMixin.java index 0fb0b1f..6306ec9 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinBufferBuilder.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/client/BufferBuilderMixin.java @@ -9,14 +9,13 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BufferBuilder.class) -public abstract class MixinBufferBuilder implements StateManager.IResettable { - +public abstract class BufferBuilderMixin implements StateManager.Resettable { @Shadow private boolean building; @Shadow public abstract void end(); @Inject(method = "", at = @At("RETURN")) - public void onInit(int bufferSizeIn, CallbackInfo ci) { + private void onInit(int bufferSizeIn, CallbackInfo ci) { register(); } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/client/ClientMainMixin.java b/src/main/java/org/dimdev/toomanycrashes/mixins/client/ClientMainMixin.java deleted file mode 100644 index 13cf03d..0000000 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/client/ClientMainMixin.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.dimdev.toomanycrashes.mixins.client; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.main.Main; -import net.minecraft.util.crash.CrashReport; -import org.dimdev.toomanycrashes.PatchedClient; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Redirect; - -@Mixin(Main.class) -public class ClientMainMixin { - - @Redirect(method = "main([Ljava/lang/String;)V", - at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;printCrashReport(Lnet/minecraft/util/crash/CrashReport;)V")) - private static void redirectPrintCrash(MinecraftClient client, CrashReport crashReport) { - ((PatchedClient) client).displayInitErrorScreen(crashReport); - } -} diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinKeyboard.java b/src/main/java/org/dimdev/toomanycrashes/mixins/client/KeyboardMixin.java similarity index 82% rename from src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinKeyboard.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/client/KeyboardMixin.java index f7956f8..9abbaa6 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinKeyboard.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/client/KeyboardMixin.java @@ -10,20 +10,21 @@ import org.dimdev.toomanycrashes.PatchedIntegratedServer; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Keyboard.class) -public abstract class MixinKeyboard { - +public abstract class KeyboardMixin { @Shadow @Final private MinecraftClient client; @Shadow private long debugCrashStartTime; /** - * @reason Replaces the vanilla F3 + C logic to immediately crash rather than requiring + * Replaces the vanilla F3 + C logic to immediately crash rather than requiring * that the buttons are pressed for 6 seconds and add more crash types: * F3 + C - Client crash - * Ctrl + F3 + C - GL illegal access crash + * Ctrl + F3 + C - JVM crash * Alt + F3 + C - Integrated server crash * Shift + F3 + C - Scheduled client task exception * Alt + Shift + F3 + C - Scheduled server task exception @@ -31,8 +32,8 @@ public abstract class MixinKeyboard { * Note: Left Shift + F3 + C doesn't work on most keyboards, see http://keyboardchecker.com/ * Use the right shift instead. */ - @Overwrite - public void pollDebugCrash() { + @Inject(method = "pollDebugCrash", at = @At("HEAD"), cancellable = true) + private void beforePollDebugCrash(CallbackInfo ci) { if (debugCrashStartTime > 0L && System.currentTimeMillis() - debugCrashStartTime >= 0) { // TODO: if the client crashes between F3 + C is pressed and pollDebugCrash is called, // debugCrashStartTime isn't reset and the client will crash again when joining @@ -40,7 +41,7 @@ public void pollDebugCrash() { debugCrashStartTime = -1; if (Screen.hasControlDown()) { - GlfwUtil.method_15973(); + GlfwUtil.makeJvmCrash(); } else if (Screen.hasShiftDown()) { if (Screen.hasAltDown()) { if (client.isIntegratedServerRunning()) { @@ -56,12 +57,14 @@ public void pollDebugCrash() { } else { if (Screen.hasAltDown()) { if (client.isIntegratedServerRunning()) { - ((PatchedIntegratedServer) client.getServer()).setCrashNextTick(); + ((PatchedIntegratedServer) client.getServer()).scheduleCrash(); } } else { throw new CrashException(new CrashReport("Manually triggered client-side debug crash", new Throwable())); } } } + + ci.cancel(); } } diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MainMixin.java b/src/main/java/org/dimdev/toomanycrashes/mixins/client/MainMixin.java new file mode 100644 index 0000000..9b737ed --- /dev/null +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/client/MainMixin.java @@ -0,0 +1,21 @@ +package org.dimdev.toomanycrashes.mixins.client; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.main.Main; +import net.minecraft.util.crash.CrashReport; +import org.dimdev.toomanycrashes.PatchedClient; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(Main.class) +public class MainMixin { + @Redirect(method = "main([Ljava/lang/String;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/MinecraftClient;printCrashReport(Lnet/minecraft/util/crash/CrashReport;)V")) + private static void printCrash(CrashReport crashReport) { + if (MinecraftClient.getInstance() != null) { + ((PatchedClient) MinecraftClient.getInstance()).displayInitErrorScreen(crashReport); + } else { + MinecraftClient.printCrashReport(crashReport); + } + } +} diff --git a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinMinecraftClient.java b/src/main/java/org/dimdev/toomanycrashes/mixins/client/MinecraftClientMixin.java similarity index 64% rename from src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinMinecraftClient.java rename to src/main/java/org/dimdev/toomanycrashes/mixins/client/MinecraftClientMixin.java index 1a5d574..d24aa56 100644 --- a/src/main/java/org/dimdev/toomanycrashes/mixins/client/MixinMinecraftClient.java +++ b/src/main/java/org/dimdev/toomanycrashes/mixins/client/MinecraftClientMixin.java @@ -5,35 +5,27 @@ import net.minecraft.client.Keyboard; import net.minecraft.client.MinecraftClient; import net.minecraft.client.Mouse; -import net.minecraft.client.font.FontManager; import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gl.GlFramebuffer; +import net.minecraft.client.gl.Framebuffer; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.client.gui.screen.SaveLevelScreen; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.TitleScreen; import net.minecraft.client.network.ClientPlayNetworkHandler; import net.minecraft.client.options.GameOptions; -import net.minecraft.client.resource.ClientResourcePackContainer; -import net.minecraft.client.resource.language.LanguageManager; import net.minecraft.client.sound.SoundManager; import net.minecraft.client.texture.TextureManager; import net.minecraft.client.util.Window; -import net.minecraft.resource.ReloadableResourceManager; -import net.minecraft.resource.ResourcePackContainerManager; import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; import net.minecraft.util.Identifier; -import net.minecraft.util.NonBlockingThreadExecutor; import net.minecraft.util.crash.CrashException; import net.minecraft.util.crash.CrashReport; +import net.minecraft.util.thread.ReentrantThreadExecutor; import org.apache.logging.log4j.Logger; -import org.dimdev.toomanycrashes.CrashScreen; -import org.dimdev.toomanycrashes.CrashUtils; -import org.dimdev.toomanycrashes.InitErrorScreen; -import org.dimdev.toomanycrashes.PatchedClient; -import org.dimdev.toomanycrashes.StateManager; +import org.dimdev.toomanycrashes.*; import org.dimdev.utils.GlUtil; +import org.lwjgl.opengl.GL11; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Overwrite; @@ -44,104 +36,78 @@ import java.util.concurrent.CompletableFuture; @Mixin(MinecraftClient.class) -@SuppressWarnings("StaticVariableMayNotBeInitialized") -public abstract class MixinMinecraftClient extends NonBlockingThreadExecutor implements PatchedClient { - +public abstract class MinecraftClientMixin extends ReentrantThreadExecutor implements PatchedClient { + // @formatter:off @Shadow public static byte[] memoryReservedForCrash; @Shadow @Final public static Identifier DEFAULT_TEXT_RENDERER_ID; @Shadow @Final public static boolean IS_SYSTEM_MAC; - // @formatter:off @Shadow @Final private static Logger LOGGER; @Shadow public GameOptions options; @Shadow public InGameHud inGameHud; @Shadow public Screen currentScreen; @Shadow public TextureManager textureManager; @Shadow public TextRenderer textRenderer; -// @Shadow public abstract void method_1550(ClientWorld world, Gui loadingGui); @Shadow public Window window; @Shadow public Mouse mouse; @Shadow @Final public File runDirectory; @Shadow public Keyboard keyboard; - @Shadow volatile boolean isRunning; - @Shadow private boolean crashed; + @Shadow volatile boolean running; @Shadow private CrashReport crashReport; - @Shadow private int attackCooldown; - @Shadow private GlFramebuffer framebuffer; - @Shadow private ReloadableResourceManager resourceManager; + @Shadow private Framebuffer framebuffer; @Shadow private SoundManager soundManager; - @Shadow private LanguageManager languageManager; - @Shadow private FontManager fontManager; - @Shadow @Final private ResourcePackContainerManager resourcePackContainerManager; @Shadow @Final private Queue renderTaskQueue; private int clientCrashCount = 0; private int serverCrashCount = 0; - public MixinMinecraftClient(String string_1) { - super(string_1); - } - - @Shadow private void init() {} - + public MinecraftClientMixin(String string_1) { super(string_1); } @Shadow public void openScreen(Screen gui) {} - // @formatter:on - - @Shadow public CrashReport populateCrashReport(CrashReport report) { return null; } - - @Shadow public void close() {} - + @Shadow public CrashReport addDetailsToCrashReport(CrashReport report) { return null; } + @Shadow @Override public void close() {} @Shadow public abstract ClientPlayNetworkHandler getNetworkHandler(); - - @Shadow public abstract void updateDisplay(boolean respectFramerateLimit); - - @Shadow protected abstract void render(boolean boolean_1); - + @Shadow protected abstract void render(boolean tick); @Shadow public abstract CompletableFuture reloadResources(); - @Shadow public abstract boolean forcesUnicodeFont(); - @Shadow public abstract void stop(); - @Shadow public abstract void disconnect(Screen screen); + // @formatter:on /** - * @author runemoro - * @reason Allows the player to choose to return to the title screen after a crash, or get + * Allows the player to choose to return to the title screen after a crash, or get * a pasteable link to the crash report on paste.dimdev.org. */ @Overwrite - public void start() { - while (isRunning) { - if (!crashed || crashReport == null) { - try { - render(true); - } catch (CrashException e) { - clientCrashCount++; - populateCrashReport(e.getReport()); - addInfoToCrash(e.getReport()); - resetGameState(); - LOGGER.fatal("Reported exception thrown!", e); - displayCrashScreen(e.getReport()); - } catch (Throwable e) { - clientCrashCount++; - CrashReport report = new CrashReport("Unexpected error", e); - - populateCrashReport(report); - addInfoToCrash(report); - resetGameState(); - LOGGER.fatal("Unreported exception thrown!", e); - displayCrashScreen(report); - } - } else { + public void run() { + while (running) { + if (crashReport != null) { serverCrashCount++; - addInfoToCrash(crashReport); + addCrashCountToReport(crashReport); resetGameState(); displayCrashScreen(crashReport); - crashed = false; crashReport = null; } + + try { + render(true); + } catch (CrashException e) { + clientCrashCount++; + addDetailsToCrashReport(e.getReport()); + addCrashCountToReport(e.getReport()); + resetGameState(); + LOGGER.fatal("Reported exception thrown!", e); + displayCrashScreen(e.getReport()); + } catch (Throwable e) { + clientCrashCount++; + CrashReport report = new CrashReport("Unexpected error", e); + + addDetailsToCrashReport(report); + addCrashCountToReport(report); + resetGameState(); + LOGGER.fatal("Unreported exception thrown!", e); + displayCrashScreen(report); + } } } - public void addInfoToCrash(CrashReport report) { + public void addCrashCountToReport(CrashReport report) { report.getSystemDetailsSection().add("Client Crashes Since Restart", () -> String.valueOf(clientCrashCount)); report.getSystemDetailsSection().add("Integrated Server Crashes Since Restart", () -> String.valueOf(serverCrashCount)); } @@ -152,8 +118,8 @@ public void displayInitErrorScreen(CrashReport report) { try { GlUtil.resetState(); - isRunning = true; - runGUILoop(new InitErrorScreen(report)); + running = true; + runGuiLoop(new InitErrorScreen(report)); } catch (Throwable t) { LOGGER.error("An uncaught exception occured while displaying the init error screen, making normal report instead", t); printCrashReport(report); @@ -161,34 +127,46 @@ public void displayInitErrorScreen(CrashReport report) { } } - private void runGUILoop(Screen screen) { + private void runGuiLoop(Screen screen) { openScreen(screen); - while (isRunning && currentScreen != null && !(currentScreen instanceof TitleScreen)) { + while (running && currentScreen != null && !(currentScreen instanceof TitleScreen)) { window.setPhase("TooManyCrashes GUI Loop"); + if (GLX._shouldClose(window)) { stop(); } - attackCooldown = 10000; - currentScreen.tick(); + textureManager.tick(); + currentScreen.getClass().getCanonicalName(); + soundManager.tick(true); mouse.updateMouse(); - GLX._pollEvents(); RenderSystem.pushMatrix(); - RenderSystem.clear(16640, IS_SYSTEM_MAC); + + RenderSystem.clear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT, IS_SYSTEM_MAC); framebuffer.beginWrite(true); RenderSystem.enableTexture(); - RenderSystem.viewport(0, 0, window.getWidth(), window.getHeight()); - RenderSystem.matrixMode(5889); + RenderSystem.clear(0xFF, IS_SYSTEM_MAC); + RenderSystem.matrixMode(GL11.GL_PROJECTION); RenderSystem.loadIdentity(); - RenderSystem.matrixMode(5888); + + RenderSystem.ortho( + 0, + window.getFramebufferWidth() / window.getScaleFactor(), + window.getFramebufferHeight() / window.getScaleFactor(), + 0, + 1000, + 3000 + ); + + RenderSystem.matrixMode(GL11.GL_MODELVIEW); RenderSystem.loadIdentity(); - window.method_4493(IS_SYSTEM_MAC); + RenderSystem.translatef(0, 0, -2000); + RenderSystem.clear(0xFF, IS_SYSTEM_MAC); - RenderSystem.clear(256, IS_SYSTEM_MAC); currentScreen.render( (int) (mouse.getX() * window.getScaledWidth() / window.getWidth()), (int) (mouse.getY() * window.getScaledHeight() / window.getHeight()), @@ -197,13 +175,13 @@ private void runGUILoop(Screen screen) { framebuffer.endWrite(); RenderSystem.popMatrix(); + RenderSystem.pushMatrix(); framebuffer.draw(window.getWidth(), window.getHeight()); RenderSystem.popMatrix(); - RenderSystem.pushMatrix(); - window.method_4493(IS_SYSTEM_MAC); - RenderSystem.popMatrix(); - updateDisplay(true); + + window.setFullscreen(); + RenderSystem.limitDisplayFPS(60); Thread.yield(); } } @@ -212,30 +190,22 @@ public void displayCrashScreen(CrashReport report) { try { CrashUtils.outputReport(report); - // Reset hasCrashed - crashed = false; - // Vanilla does this when switching to main menu but not our custom crash screen // nor the out of memory screen (see https://bugs.mojang.com/browse/MC-128953) options.debugEnabled = false; inGameHud.getChatHud().clear(true); // Display the crash screen - runGUILoop(new CrashScreen(report)); + runGuiLoop(new CrashScreen(report)); } catch (Throwable t) { - // The crash screen has crashed. Report it normally instead. LOGGER.error("An uncaught exception occured while displaying the crash screen, making normal report instead", t); printCrashReport(report); System.exit(report.getFile() != null ? -1 : -2); } } - /** - * @author Runemoro - * @reason Substitute - */ @Overwrite - public void printCrashReport(CrashReport report) { + public static void printCrashReport(CrashReport report) { CrashUtils.outputReport(report); } @@ -287,8 +257,7 @@ public void resetGameState() { } /** - * @author runemoro - * @reason Disconnect from the current world and free memory, using a memory reserve + * Disconnect from the current world and free memory, using a memory reserve * to make sure that an OutOfMemory doesn't happen while doing this. *

* Bugs Fixed: diff --git a/src/main/java/org/dimdev/utils/GlUtil.java b/src/main/java/org/dimdev/utils/GlUtil.java index 5071f53..f096a32 100644 --- a/src/main/java/org/dimdev/utils/GlUtil.java +++ b/src/main/java/org/dimdev/utils/GlUtil.java @@ -1,163 +1,153 @@ package org.dimdev.utils; -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.class_4493; -import net.minecraft.client.render.GuiLighting; -import org.lwjgl.opengl.GL; -import org.lwjgl.opengl.GL11; -import org.lwjgl.opengl.GL12; -import org.lwjgl.opengl.GL13; -import org.lwjgl.opengl.GL14; -import org.lwjgl.opengl.GL15; - public class GlUtil { public static void resetState() { - // Clear matrix stack - RenderSystem.matrixMode(GL11.GL_MODELVIEW); - RenderSystem.loadIdentity(); - RenderSystem.matrixMode(GL11.GL_PROJECTION); - RenderSystem.loadIdentity(); - RenderSystem.matrixMode(GL11.GL_TEXTURE); - RenderSystem.loadIdentity(); - RenderSystem.matrixMode(GL11.GL_COLOR); - RenderSystem.loadIdentity(); - - // Clear attribute stacks TODO: Broken, a stack underflow breaks LWJGL - // try { - // do GL11.glPopAttrib(); while (RenderSystem.glGetError() == 0); - // } catch (Throwable ignored) {} - // - // try { - // do GL11.glPopClientAttrib(); while (RenderSystem.glGetError() == 0); - // } catch (Throwable ignored) {} - - // Reset texture - RenderSystem.bindTexture(0); - RenderSystem.disableTexture(); - - // Reset GL lighting - RenderSystem.disableLighting(); - RenderSystem.lightModel(GL11.GL_LIGHT_MODEL_AMBIENT, GuiLighting.singletonBuffer(0.2F, 0.2F, 0.2F, 1.0F)); - for (int i = 0; i < 8; ++i) { - RenderSystem.disableLight(i); - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_AMBIENT, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_POSITION, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - - if (i == 0) { - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_DIFFUSE, GuiLighting.singletonBuffer(1.0F, 1.0F, 1.0F, 1.0F)); - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_SPECULAR, GuiLighting.singletonBuffer(1.0F, 1.0F, 1.0F, 1.0F)); - } else { - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_DIFFUSE, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_SPECULAR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - } - } - RenderSystem.disableColorMaterial(); - RenderSystem.colorMaterial(1032, 5634); - - // Reset depth - RenderSystem.disableDepthTest(); - RenderSystem.depthFunc(513); - RenderSystem.depthMask(true); - - // Reset blend mode - RenderSystem.disableBlend(); - RenderSystem.blendFunc(class_4493.class_4535.ONE, class_4493.class_4534.ZERO); - RenderSystem.blendFuncSeparate(class_4493.class_4535.ONE, class_4493.class_4534.ZERO, class_4493.class_4535.ONE, class_4493.class_4534.ZERO); - RenderSystem.blendEquation(GL14.GL_FUNC_ADD); - - // Reset fog - RenderSystem.disableFog(); - RenderSystem.fogMode(class_4493.FogMode.LINEAR); - RenderSystem.fogDensity(1.0F); - RenderSystem.fogStart(0.0F); - RenderSystem.fogEnd(1.0F); - RenderSystem.fog(GL11.GL_FOG_COLOR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 0.0F)); - if (GL.getCapabilities().GL_NV_fog_distance) { - RenderSystem.fogMode(34140); - } - - // Reset polygon offset - RenderSystem.polygonOffset(0.0F, 0.0F); - RenderSystem.disablePolygonOffset(); - - // Reset color logic - RenderSystem.disableColorLogicOp(); - RenderSystem.logicOp(5379); - - // Reset texgen - RenderSystem.disableTexGen(class_4493.TexCoord.S); - RenderSystem.disableTexGen(class_4493.TexCoord.T); - RenderSystem.disableTexGen(class_4493.TexCoord.R); - RenderSystem.disableTexGen(class_4493.TexCoord.Q); - RenderSystem.texGenMode(class_4493.TexCoord.S, 9216); - RenderSystem.texGenMode(class_4493.TexCoord.T, 9216); - RenderSystem.texGenMode(class_4493.TexCoord.R, 9216); - RenderSystem.texGenMode(class_4493.TexCoord.Q, 9216); - RenderSystem.texGenParam(class_4493.TexCoord.S, 9474, GuiLighting.singletonBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.T, 9474, GuiLighting.singletonBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.R, 9474, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.Q, 9474, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.S, 9217, GuiLighting.singletonBuffer(1.0F, 0.0F, 0.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.T, 9217, GuiLighting.singletonBuffer(0.0F, 1.0F, 0.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.R, 9217, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); - RenderSystem.texGenParam(class_4493.TexCoord.Q, 9217, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); - - // Disable lightmap - RenderSystem.activeTexture(GL13.GL_TEXTURE1); - RenderSystem.disableTexture(); - - RenderSystem.activeTexture(GL13.GL_TEXTURE0); - - // Reset texture parameters - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1000); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1000); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, -1000); - RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0F); - - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 0.0F)); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_MODULATE); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_MODULATE); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC0_RGB, GL11.GL_TEXTURE); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC1_RGB, GL13.GL_PREVIOUS); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC2_RGB, GL13.GL_CONSTANT); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC0_ALPHA, GL11.GL_TEXTURE); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC1_ALPHA, GL13.GL_PREVIOUS); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC2_ALPHA, GL13.GL_CONSTANT); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_RGB_SCALE, 1.0F); - RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_ALPHA_SCALE, 1.0F); - - RenderSystem.disableNormalize(); - RenderSystem.shadeModel(7425); - RenderSystem.disableRescaleNormal(); - RenderSystem.colorMask(true, true, true, true); - RenderSystem.clearDepth(1.0D); - RenderSystem.lineWidth(1.0F); - RenderSystem.normal3f(0.0F, 0.0F, 1.0F); - RenderSystem.polygonMode(GL11.GL_FRONT, GL11.GL_FILL); - RenderSystem.polygonMode(GL11.GL_BACK, GL11.GL_FILL); - - RenderSystem.enableTexture(); - RenderSystem.shadeModel(7425); - RenderSystem.clearDepth(1.0D); - RenderSystem.enableDepthTest(); - RenderSystem.depthFunc(515); - RenderSystem.enableAlphaTest(); - RenderSystem.alphaFunc(516, 0.1F); - RenderSystem.cullFace(class_4493.FaceSides.BACK); - RenderSystem.matrixMode(5889); - RenderSystem.loadIdentity(); - RenderSystem.matrixMode(5888); +// // Clear matrix stack +// RenderSystem.matrixMode(GL11.GL_MODELVIEW); +// RenderSystem.loadIdentity(); +// RenderSystem.matrixMode(GL11.GL_PROJECTION); +// RenderSystem.loadIdentity(); +// RenderSystem.matrixMode(GL11.GL_TEXTURE); +// RenderSystem.loadIdentity(); +// RenderSystem.matrixMode(GL11.GL_COLOR); +// RenderSystem.loadIdentity(); +// +// // Clear attribute stacks TODO: Broken, a stack underflow breaks LWJGL +// // try { +// // do GL11.glPopAttrib(); while (RenderSystem.glGetError() == 0); +// // } catch (Throwable ignored) {} +// // +// // try { +// // do GL11.glPopClientAttrib(); while (RenderSystem.glGetError() == 0); +// // } catch (Throwable ignored) {} +// +// // Reset texture +// RenderSystem.bindTexture(0); +// RenderSystem.disableTexture(); +// +// // Reset GL lighting +// RenderSystem.disableLighting(); +// RenderSystem.lightModel(GL11.GL_LIGHT_MODEL_AMBIENT, GuiLighting.singletonBuffer(0.2F, 0.2F, 0.2F, 1.0F)); +// for (int i = 0; i < 8; ++i) { +// RenderSystem.disableLight(i); +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_AMBIENT, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_POSITION, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); +// +// if (i == 0) { +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_DIFFUSE, GuiLighting.singletonBuffer(1.0F, 1.0F, 1.0F, 1.0F)); +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_SPECULAR, GuiLighting.singletonBuffer(1.0F, 1.0F, 1.0F, 1.0F)); +// } else { +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_DIFFUSE, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); +// RenderSystem.light(GL11.GL_LIGHT0 + i, GL11.GL_SPECULAR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); +// } +// } +// RenderSystem.disableColorMaterial(); +// RenderSystem.colorMaterial(1032, 5634); +// +// // Reset depth +// RenderSystem.disableDepthTest(); +// RenderSystem.depthFunc(513); +// RenderSystem.depthMask(true); +// +// // Reset blend mode +// RenderSystem.disableBlend(); +// RenderSystem.blendFunc(class_4493.class_4535.ONE, class_4493.class_4534.ZERO); +// RenderSystem.blendFuncSeparate(class_4493.class_4535.ONE, class_4493.class_4534.ZERO, class_4493.class_4535.ONE, class_4493.class_4534.ZERO); +// RenderSystem.blendEquation(GL14.GL_FUNC_ADD); +// +// // Reset fog +// RenderSystem.disableFog(); +// RenderSystem.fogMode(class_4493.FogMode.LINEAR); +// RenderSystem.fogDensity(1.0F); +// RenderSystem.fogStart(0.0F); +// RenderSystem.fogEnd(1.0F); +// RenderSystem.fog(GL11.GL_FOG_COLOR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 0.0F)); +// if (GL.getCapabilities().GL_NV_fog_distance) { +// RenderSystem.fogMode(34140); +// } +// +// // Reset polygon offset +// RenderSystem.polygonOffset(0.0F, 0.0F); +// RenderSystem.disablePolygonOffset(); +// +// // Reset color logic +// RenderSystem.disableColorLogicOp(); +// RenderSystem.logicOp(5379); +// +// // Reset texgen +// RenderSystem.disableTexGen(class_4493.TexCoord.S); +// RenderSystem.disableTexGen(class_4493.TexCoord.T); +// RenderSystem.disableTexGen(class_4493.TexCoord.R); +// RenderSystem.disableTexGen(class_4493.TexCoord.Q); +// RenderSystem.texGenMode(class_4493.TexCoord.S, 9216); +// RenderSystem.texGenMode(class_4493.TexCoord.T, 9216); +// RenderSystem.texGenMode(class_4493.TexCoord.R, 9216); +// RenderSystem.texGenMode(class_4493.TexCoord.Q, 9216); +// RenderSystem.texGenParam(class_4493.TexCoord.S, 9474, GuiLighting.singletonBuffer(1.0F, 0.0F, 0.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.T, 9474, GuiLighting.singletonBuffer(0.0F, 1.0F, 0.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.R, 9474, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.Q, 9474, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.S, 9217, GuiLighting.singletonBuffer(1.0F, 0.0F, 0.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.T, 9217, GuiLighting.singletonBuffer(0.0F, 1.0F, 0.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.R, 9217, GuiLighting.singletonBuffer(0.0F, 0.0F, 1.0F, 0.0F)); +// RenderSystem.texGenParam(class_4493.TexCoord.Q, 9217, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 1.0F)); +// +// // Disable lightmap +// RenderSystem.activeTexture(GL13.GL_TEXTURE1); +// RenderSystem.disableTexture(); +// +// RenderSystem.activeTexture(GL13.GL_TEXTURE0); +// +// // Reset texture parameters +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST_MIPMAP_LINEAR); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LEVEL, 1000); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MAX_LOD, 1000); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL12.GL_TEXTURE_MIN_LOD, -1000); +// RenderSystem.texParameter(GL11.GL_TEXTURE_2D, GL14.GL_TEXTURE_LOD_BIAS, 0.0F); +// +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_MODULATE); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_COLOR, GuiLighting.singletonBuffer(0.0F, 0.0F, 0.0F, 0.0F)); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_RGB, GL11.GL_MODULATE); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_COMBINE_ALPHA, GL11.GL_MODULATE); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC0_RGB, GL11.GL_TEXTURE); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC1_RGB, GL13.GL_PREVIOUS); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC2_RGB, GL13.GL_CONSTANT); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC0_ALPHA, GL11.GL_TEXTURE); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC1_ALPHA, GL13.GL_PREVIOUS); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL15.GL_SRC2_ALPHA, GL13.GL_CONSTANT); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_RGB, GL11.GL_SRC_COLOR); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_RGB, GL11.GL_SRC_COLOR); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_RGB, GL11.GL_SRC_ALPHA); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND0_ALPHA, GL11.GL_SRC_ALPHA); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND1_ALPHA, GL11.GL_SRC_ALPHA); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_OPERAND2_ALPHA, GL11.GL_SRC_ALPHA); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL13.GL_RGB_SCALE, 1.0F); +// RenderSystem.texEnv(GL11.GL_TEXTURE_ENV, GL11.GL_ALPHA_SCALE, 1.0F); +// +// RenderSystem.disableNormalize(); +// RenderSystem.shadeModel(7425); +// RenderSystem.disableRescaleNormal(); +// RenderSystem.colorMask(true, true, true, true); +// RenderSystem.clearDepth(1.0D); +// RenderSystem.lineWidth(1.0F); +// RenderSystem.normal3f(0.0F, 0.0F, 1.0F); +// RenderSystem.polygonMode(GL11.GL_FRONT, GL11.GL_FILL); +// RenderSystem.polygonMode(GL11.GL_BACK, GL11.GL_FILL); +// +// RenderSystem.enableTexture(); +// RenderSystem.shadeModel(7425); +// RenderSystem.clearDepth(1.0D); +// RenderSystem.enableDepthTest(); +// RenderSystem.depthFunc(515); +// RenderSystem.enableAlphaTest(); +// RenderSystem.alphaFunc(516, 0.1F); +// RenderSystem.cullFace(class_4493.FaceSides.BACK); +// RenderSystem.matrixMode(5889); +// RenderSystem.loadIdentity(); +// RenderSystem.matrixMode(5888); } } diff --git a/src/main/resources/mixins.toomanycrashes.json b/src/main/resources/mixins.toomanycrashes.json index 29ecde4..b3fc4fc 100644 --- a/src/main/resources/mixins.toomanycrashes.json +++ b/src/main/resources/mixins.toomanycrashes.json @@ -6,17 +6,17 @@ "minVersion": "0.6", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinCrashReport", - "MixinCrashReportSection", + "BlockEntityMixin", + "CrashReportMixin", "CrashReportSectionElementMixin", - "MixinEntity", - "MixinIntegratedServer", - "MixinTileEntity" + "CrashReportSectionMixin", + "EntityMixin", + "IntegratedServerMixin" ], "client": [ - "client.MixinBufferBuilder", - "client.MixinKeyboard", - "client.MixinMinecraftClient", - "client.ClientMainMixin" + "client.BufferBuilderMixin", + "client.KeyboardMixin", + "client.MainMixin", + "client.MinecraftClientMixin" ] }