Compare commits

..

2 Commits

Author SHA1 Message Date
Motschen
60497771fc MidnightLib 0.2.5 - Better Translations & Backgrounds
- Custom lang key support
 - Transparent list background when in game
- Configurable background texture in MidnightConfig screens (defaults to Deepslate)
2021-09-19 13:18:16 +02:00
Motschen
472ce59ae0 MidnightLib 0.2.4 - 1.17
MidnightConfig v1.0.4:
- Number field length is now configurable
- Fixed number fields being empty
2021-06-21 19:41:14 +02:00
8 changed files with 93 additions and 32 deletions

View File

@@ -8,11 +8,11 @@ org.gradle.jvmargs=-Xmx1G
loader_version=0.11.3
# Mod Properties
mod_version = 0.2.3
mod_version = 0.2.5
maven_group = eu.midnightdust
archives_base_name = midnightlib
# Dependencies
# currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api
fabric_version=0.34.8+1.17
mod_menu_version = 2.0.0-mnd
mod_menu_version = 2.0.2

View File

@@ -9,6 +9,8 @@ public class MidnightLibConfig extends MidnightConfig {
public static boolean config_screen_list = !FabricLoader.getInstance().isModLoaded("modmenu");
@Entry // Change the style of the title in MidnightConfig
public static TitleStyle titleStyle = MidnightConfig.useTooltipForTitle ? TitleStyle.TOOLTIP : TitleStyle.TEXT;
@Entry // Change the texture of the background in MidnightConfig
public static String background_texture = "minecraft:textures/block/deepslate.png";
@Comment public static Comment midnighthats_description;
@Entry // Enable or disable event hats
public static boolean event_hats = true;

View File

@@ -0,0 +1,23 @@
package eu.midnightdust.core.mixin;
import com.mojang.blaze3d.systems.RenderSystem;
import eu.midnightdust.core.config.MidnightLibConfig;
import net.minecraft.client.gui.widget.EntryListWidget;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.util.Identifier;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.Locale;
@Mixin(EntryListWidget.class)
public abstract class MixinEntryListWidget {
@Inject(at = @At(value = "INVOKE",target = "Lcom/mojang/blaze3d/systems/RenderSystem;setShaderTexture(ILnet/minecraft/util/Identifier;)V",shift = At.Shift.AFTER), method = "render", cancellable = true)
private void custom_background(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) {
if (!MidnightLibConfig.background_texture.equals("") && this.getClass().toString().toLowerCase(Locale.ROOT).contains("midnight"))
RenderSystem.setShaderTexture(0, Identifier.tryParse(MidnightLibConfig.background_texture));
}
}

View File

@@ -29,6 +29,7 @@ public class MidnightConfigOverviewScreen extends Screen {
this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).openScreen(parent)));
this.list = new MidnightOverviewListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
if (this.client != null && this.client.world != null) this.list.setRenderBackground(false);
this.addSelectableChild(this.list);
MidnightConfig.configClass.forEach((modid, configClass) -> {
list.addButton(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, new TranslatableText(modid +".midnightconfig.title"), (button) -> {

View File

@@ -14,13 +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.screen.ScreenTexts;
import net.minecraft.client.gui.widget.*;
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.resource.language.I18n;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.text.*;
import net.minecraft.text.LiteralText;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
import net.minecraft.util.Formatting;
import java.lang.annotation.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.nio.file.Files;
@@ -31,22 +39,28 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
// MidnightConfig v1.0.3
// Single class config library - feel free to copy!
// Changelog:
// - 1.0.3:
// - Text field length is now configurable
// - Better separation of client and server
// - 1.0.2:
// - Update to 21w20a
// - 1.0.1:
// - Fixed buttons not working in fullscreen
// - 1.0.0:
// - The config screen no longer shows the entries of all instances of MidnightConfig
// - Compatible with servers!
// - Scrollable!
// - Comment support!
// - Fresh New Design
/* MidnightConfig v1.0.5
Single class config library - feel free to copy!
Changelog:
- 1.0.5:
- Custom lang keys
- Transparent list background when in game
- 1.0.4:
- Number field length is now configurable
- Fixed number fields being empty
- 1.0.3:
- Text field length is now configurable
- Better separation of client and server
- 1.0.2:
- Update to 21w20a
- 1.0.1:
- Fixed buttons not working in fullscreen
- 1.0.0:
- The config screen no longer shows the entries of all instances of MidnightConfig
- Compatible with servers!
- Scrollable!
- Comment support!
- Fresh New Design */
/** Based on https://github.com/Minenash/TinyConfig
* Credits to Minenash */
@@ -71,6 +85,7 @@ public class MidnightConfig {
String tempValue;
boolean inLimits = true;
String id;
TranslatableText name;
}
public static final Map<String,Class<?>> configClass = new HashMap<>();
@@ -111,14 +126,14 @@ public class MidnightConfig {
info.field = field;
info.id = modid;
if (e != null)
if (e != null) {
if (!e.name().equals("")) info.name = new TranslatableText(e.name());
if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true);
else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(), false);
else if (type == String.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 == boolean.class) {
Function<Object, Text> func = value -> new LiteralText((Boolean) value ? "True" : "False").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED);
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
info.value = !(Boolean) info.value;
@@ -133,6 +148,7 @@ public class MidnightConfig {
button.setMessage(func.apply(info.value));
}, func);
}
}
entries.add(info);
}
@@ -234,10 +250,11 @@ public class MidnightConfig {
}));
this.list = new MidnightConfigListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
if (this.client != null && this.client.world != null) this.list.setRenderBackground(false);
this.addSelectableChild(this.list);
for (EntryInfo info : entries) {
if (info.id.equals(modid)) {
TranslatableText name = new TranslatableText(translationPrefix + info.field.getName());
TranslatableText name = Objects.requireNonNullElseGet(info.name, () -> new TranslatableText(translationPrefix + info.field.getName()));
ButtonWidget resetButton = new ButtonWidget(width - 155, 0, 40, 20, new LiteralText("Reset").formatted(Formatting.RED), (button -> {
info.value = info.defaultValue;
info.tempValue = info.value.toString();
@@ -249,11 +266,10 @@ public class MidnightConfig {
if (info.widget instanceof Map.Entry) {
Map.Entry<ButtonWidget.PressAction, Function<Object, Text>> widget = (Map.Entry<ButtonWidget.PressAction, Function<Object, Text>>) info.widget;
if (info.field.getType().isEnum()) widget.setValue(value -> new TranslatableText(translationPrefix + "enum." + info.field.getType().getSimpleName() + "." + info.value.toString()));
this.list.addButton(new ButtonWidget(width - 110, 0, info.width, 20, widget.getValue().apply(info.value), widget.getKey()),resetButton,name);
this.list.addButton(new ButtonWidget(width - 110, 0,100, 20, widget.getValue().apply(info.value), widget.getKey()),resetButton,name);
} else if (info.widget != null) {
TextFieldWidget widget = new TextFieldWidget(textRenderer, width - 110, 0, info.width, 20, null);
widget.setMaxLength(info.max);
TextFieldWidget widget = new TextFieldWidget(textRenderer, width - 110, 0, 100, 20, null);
widget.setMaxLength(info.width);
widget.setText(info.tempValue);
Predicate<String> processor = ((BiFunction<TextFieldWidget, ButtonWidget, Predicate<String>>) info.widget).apply(widget, done);
widget.setTextPredicate(processor);
@@ -297,7 +313,7 @@ public class MidnightConfig {
}
}
@Environment(EnvType.CLIENT)
public static class MidnightConfigListWidget extends ElementListWidget<MidnightConfig.ButtonEntry> {
public static class MidnightConfigListWidget extends ElementListWidget<ButtonEntry> {
TextRenderer textRenderer;
public MidnightConfigListWidget(MinecraftClient minecraftClient, int i, int j, int k, int l, int m) {
@@ -368,6 +384,7 @@ public class MidnightConfig {
int width() default 100;
double min() default Double.MIN_NORMAL;
double max() default Double.MAX_VALUE;
String name() default "";
}
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Comment {}

View File

@@ -12,7 +12,7 @@ public class MidnightConfigExample extends MidnightConfig {
@Entry public static int fabric = 16777215; // Example for a int option
@Entry public static double world = 1.4D; // Example for a double option
@Entry public static boolean showInfo = true; // Example for a boolean option
@Entry public static String name = "Hi"; // Example for a string option
@Entry public static String name = "Hi"; // Example for a string option
@Entry public static TestEnum testEnum = TestEnum.FABRIC; // Example for a enum option
public static enum TestEnum { // Enums allow the user to cycle through predefined options
QUILT, FABRIC

View File

@@ -0,0 +1,17 @@
{
"midnightlib.overview.title":"MidnightConfig Übersicht",
"midnightlib.midnightconfig.title":"MidnightLib Konfiguration",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Konfigurationsliste aktivieren",
"midnightlib.midnightconfig.titleStyle":"Aussehen der Konfigurationsbildschirmtitel",
"midnightlib.midnightconfig.titleStyle.tooltip":"§cBenötigt Neustart!",
"midnightlib.midnightconfig.enum.TitleStyle.TEXT":"Text",
"midnightlib.midnightconfig.enum.TitleStyle.TOOLTIP":"Tooltip",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.event_hats":"Event Hüte",
"midnightlib.midnightconfig.special_hats":"Besondere Hüte",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"modmenu.descriptionTranslation.midnightlib": "Bibliothek für Mods von Team MidnightDust.\nBesitzt eine Konfigurationsschnittstelle, oft benutzten Code, und kosmetische Gegenstände.",
"modmenu.summaryTranslation.midnightlib": "Bibliothek für Mods von Team MidnightDust."
}

View File

@@ -3,7 +3,8 @@
"package": "eu.midnightdust.core.mixin",
"compatibilityLevel": "JAVA_16",
"client": [
"MixinOptionsScreen"
"MixinOptionsScreen",
"MixinEntryListWidget"
],
"injectors": {
"defaultRequire": 1