From b74d457eadf9f66ac246000376e6fbf4d2baa1c1 Mon Sep 17 00:00:00 2001
From: NatanLifshitz <142314885+NatanLifshitz@users.noreply.github.com>
Date: Mon, 5 Feb 2024 21:32:03 +0200
Subject: [PATCH] 1.20.4
---
TESTING.md | 2 +-
build.gradle | 4 +-
common/build.gradle | 10 +
.../config/MidnightConfig.java | 414 +++++++++---------
.../notenoughcrashes/gui/CrashScreen.java | 6 +-
.../notenoughcrashes/gui/ProblemScreen.java | 11 +-
.../mixinhandlers/InGameCatcher.java | 14 +-
.../mixins/client/MixinKeyboard.java | 20 +
.../mixins/client/MixinMinecraftClient.java | 59 ++-
.../mixins/client/MixinMinecraftServer.java | 17 +
.../utils/NecLocalization.java | 2 +-
.../assets/notenoughcrashes/lang/en_us.json | 4 +-
.../textures/gui/sprites/icon/reset.png | Bin 0 -> 178 bytes
.../resources/notenoughcrashes.mixins.json | 1 +
fabric/build.gradle | 4 +-
.../fabric/platform/FabricPlatform.java | 14 +-
gradle/libs.versions.toml | 23 +-
gradle/wrapper/gradle-wrapper.properties | 2 +-
settings.gradle | 3 +-
19 files changed, 340 insertions(+), 270 deletions(-)
create mode 100644 common/src/main/java/fudge/notenoughcrashes/mixins/client/MixinKeyboard.java
create mode 100644 common/src/main/java/fudge/notenoughcrashes/mixins/client/MixinMinecraftServer.java
create mode 100644 common/src/main/resources/assets/notenoughcrashes/textures/gui/sprites/icon/reset.png
diff --git a/TESTING.md b/TESTING.md
index ef664f6..369bb20 100644
--- a/TESTING.md
+++ b/TESTING.md
@@ -39,7 +39,7 @@ To test in production, build the test Fabric/Forge mod and add them alongside NE
` - Verify:
- The game crashes.
- The crash screen appears.
- - No mods are blamed.
+ - "Not Enough Crashes Test Mod" is blamed.
- In the terminal, no information is repeated.
- Verify in the **Log**, **TXT File**, and **Get Link Site**:
- No information is repeated.
diff --git a/build.gradle b/build.gradle
index 0fb7988..57da941 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,6 +1,6 @@
plugins {
alias libs.plugins.architectury.loom apply false
- alias libs.plugins.loom.quiltflower apply false
+// alias libs.plugins.loom.quiltflower apply false
alias libs.plugins.minotaur apply false
alias libs.plugins.architectury.plugin
alias libs.plugins.cursegradle
@@ -16,7 +16,7 @@ subprojects {
apply plugin: 'maven-publish'
apply plugin: 'com.matthewprenger.cursegradle'
// apply plugin: "com.modrinth.minotaur"
- apply plugin: "io.github.juuxel.loom-quiltflower"
+// apply plugin: "io.github.juuxel.loom-quiltflower"
dependencies {
minecraft libs.minecraft
diff --git a/common/build.gradle b/common/build.gradle
index 7f73277..8070e72 100644
--- a/common/build.gradle
+++ b/common/build.gradle
@@ -1,7 +1,11 @@
+plugins {
+ id 'org.jetbrains.kotlin.jvm'
+}
dependencies {
// We depend on fabric loader here to use the fabric @Environment annotations
// Do NOT use other classes from fabric loader
modImplementation libs.fabric.loader
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
configurations {
@@ -15,3 +19,9 @@ artifacts {
architectury {
common("fabric","forge")
}
+repositories {
+ mavenCentral()
+}
+kotlin {
+ jvmToolchain(17)
+}
diff --git a/common/src/main/java/fudge/notenoughcrashes/config/MidnightConfig.java b/common/src/main/java/fudge/notenoughcrashes/config/MidnightConfig.java
index cdf8e42..a6816ca 100644
--- a/common/src/main/java/fudge/notenoughcrashes/config/MidnightConfig.java
+++ b/common/src/main/java/fudge/notenoughcrashes/config/MidnightConfig.java
@@ -1,9 +1,10 @@
package fudge.notenoughcrashes.config;
-
+import com.google.common.collect.Lists;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
+import fudge.notenoughcrashes.NotEnoughCrashes;
import fudge.notenoughcrashes.platform.NecPlatform;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
@@ -13,18 +14,21 @@
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.screen.Screen;
-import net.minecraft.client.gui.widget.ButtonWidget;
-import net.minecraft.client.gui.widget.ClickableWidget;
-import net.minecraft.client.gui.widget.ElementListWidget;
-import net.minecraft.client.gui.widget.TextFieldWidget;
+import net.minecraft.client.gui.tab.GridScreenTab;
+import net.minecraft.client.gui.tab.Tab;
+import net.minecraft.client.gui.tab.TabManager;
+import net.minecraft.client.gui.tooltip.Tooltip;
+import net.minecraft.client.gui.widget.*;
+import net.minecraft.client.render.RenderLayer;
import net.minecraft.client.resource.language.I18n;
-import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.screen.ScreenTexts;
+import net.minecraft.text.OrderedText;
import net.minecraft.text.Style;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+import net.minecraft.util.Identifier;
-import java.awt.*;
+import java.awt.Color;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -33,37 +37,32 @@
import java.lang.reflect.Modifier;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.util.List;
import java.util.*;
+import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
-/**
- * MidnightConfig v2.2.0 by TeamMidnightDust & Motschen
- * Single class config library - feel free to copy!
- *
- * Based on https://github.com/Minenash/TinyConfig
- * Credits to Minenash
- */
+/** MidnightConfig v2.5.1 by TeamMidnightDust & Motschen
+ * Single class config library - feel free to copy!
+ * Based on ...
+ * Credits to Minenash */
@SuppressWarnings("unchecked")
public abstract class MidnightConfig {
private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)");
- private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)");
+ private static final Pattern DECIMAL_ONLY = Pattern.compile("-?(\\d+\\.?\\d*|\\d*\\.?\\d+|\\.)");
private static final Pattern HEXADECIMAL_ONLY = Pattern.compile("(-?[#0-9a-fA-F]*)");
private static final List entries = new ArrayList<>();
- protected static class EntryInfo {
+ public static class EntryInfo {
Field field;
Object widget;
int width;
- int max;
boolean centered;
- boolean comment = false;
- Map.Entry error;
+ Text error;
Object defaultValue;
Object value;
String tempValue;
@@ -72,49 +71,39 @@ protected static class EntryInfo {
Text name;
int index;
ClickableWidget colorButton;
+ Tab tab;
}
- public static final Map> configClass = new HashMap<>();
+ public static final Map> configClass = new HashMap<>();
private static Path path;
private static final Gson gson = new GsonBuilder().excludeFieldsWithModifiers(Modifier.TRANSIENT).excludeFieldsWithModifiers(Modifier.PRIVATE).addSerializationExclusionStrategy(new HiddenAnnotationExclusionStrategy()).setPrettyPrinting().create();
- public static void init(String modid, Class> config) {
+ public static void init(String modid, Class extends MidnightConfig> config) {
path = NecPlatform.instance().getConfigDirectory().resolve(modid + ".json");
configClass.put(modid, config);
for (Field field : config.getFields()) {
EntryInfo info = new EntryInfo();
- if ((field.isAnnotationPresent(Entry.class) || field.isAnnotationPresent(Comment.class)) && !field.isAnnotationPresent(Server.class) && !field.isAnnotationPresent(Hidden.class))
- if (NecPlatform.instance().isClient()) initClient(modid, field, info);
- if (field.isAnnotationPresent(Comment.class)){
- info.centered = field.getAnnotation(Comment.class).centered();
- info.comment = true;
- }
+ if ((field.isAnnotationPresent(Entry.class) || field.isAnnotationPresent(Comment.class)) && !field.isAnnotationPresent(Server.class) && !field.isAnnotationPresent(Hidden.class) && NecPlatform.instance().isClient())
+ initClient(modid, field, info);
+ if (field.isAnnotationPresent(Comment.class)) info.centered = field.getAnnotation(Comment.class).centered();
if (field.isAnnotationPresent(Entry.class))
try {
info.defaultValue = field.get(null);
- } catch (IllegalAccessException ignored) {
- } catch (NullPointerException e) {
- throw new IllegalArgumentException("Field " + field + " must be static to serve as a config field",e);
- }
- }
- try {
- gson.fromJson(Files.newBufferedReader(path), config);
- } catch (Exception e) {
- write(modid);
+ } catch (IllegalAccessException ignored) {}
}
+ try { gson.fromJson(Files.newBufferedReader(path), config); }
+ catch (Exception e) { write(modid); }
for (EntryInfo info : entries) {
if (info.field.isAnnotationPresent(Entry.class))
try {
info.value = info.field.get(null);
info.tempValue = info.value.toString();
- } catch (IllegalAccessException ignored) {
- }
+ } catch (IllegalAccessException ignored) {}
}
}
-
@Environment(EnvType.CLIENT)
private static void initClient(String modid, Field field, EntryInfo info) {
Class> type = field.getType();
@@ -124,15 +113,12 @@ private static void initClient(String modid, Field field, EntryInfo info) {
info.id = modid;
if (e != null) {
- if (!e.name().equals("")) info.name = Text.translatable(e.name());
+ if (!e.name().isEmpty()) info.name = Text.translatable(e.name());
if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, (int) e.min(), (int) e.max(), true);
- else if (type == float.class)
- textField(info, Float::parseFloat, DECIMAL_ONLY, (float) e.min(), (float) e.max(), false);
+ else if (type == float.class) textField(info, Float::parseFloat, DECIMAL_ONLY, (float) e.min(), (float) e.max(), false);
else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(), false);
- else if (type == String.class || type == List.class) {
- info.max = e.max() == Double.MAX_VALUE ? Integer.MAX_VALUE : (int) e.max();
- textField(info, String::length, null, Math.min(e.min(), 0), Math.max(e.max(), 1), true);
- } else if (type == boolean.class) {
+ else if (type == String.class || type == List.class) textField(info, String::length, null, Math.min(e.min(), 0), Math.max(e.max(), 1), true);
+ else if (type == boolean.class) {
Function