MidnightLib 0.2.8 - Command-based server configuration, Remove garbage, Better MidnightHats, Update MC

- Added a command-based way to configure server mods without having to edit the config file (only on dedicated servers)
- Update codebase to 1.17.1
- MidnightHats:
~ Remove Event Hats (irritating and unneeded)
~ Better Hats for Supporters (Cleanup, Glow, Lightweightness)
~ Hats of invisible players are now hidden
- MidnightConfig:
~ Better support for external value changing
~ Only tooltip-based titles now
- MidnightColorUtil:
~ add radialRainbow util for fancy rgb effects
- Better German translations
This commit is contained in:
Motschen
2021-10-28 23:20:40 +02:00
parent 7c55e3bfae
commit afa8cf9a5d
35 changed files with 253 additions and 495 deletions

View File

@@ -0,0 +1,91 @@
package eu.midnightdust.lib.config;
import com.mojang.brigadier.arguments.DoubleArgumentType;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.arguments.StringArgumentType;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import net.fabricmc.fabric.api.command.v1.CommandRegistrationCallback;
import net.minecraft.server.command.CommandManager;
import net.minecraft.server.command.ServerCommandSource;
import net.minecraft.text.LiteralText;
import java.lang.reflect.Field;
import java.util.Arrays;
public class AutoCommand {
private LiteralArgumentBuilder<ServerCommandSource> command;
final Field entry;
final String modid;
public AutoCommand(Field entry, String modid) {
this.entry = entry;
this.modid = modid;
}
public void register() {
command = CommandManager.literal(modid);
command();
LiteralArgumentBuilder<ServerCommandSource> finalized = CommandManager.literal("midnightconfig").then(command);
CommandRegistrationCallback.EVENT.register((dispatcher, dedicated) -> dispatcher.register(finalized));
}
private void command() {
if (entry.getType() == int.class)
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.argument("value", IntegerArgumentType.integer((int) entry.getAnnotation(MidnightConfig.Entry.class).min(),(int) entry.getAnnotation(MidnightConfig.Entry.class).max()))
.executes(ctx -> this.setValue(ctx.getSource(), IntegerArgumentType.getInteger(ctx, "value")))
));
else if (entry.getType() == double.class)
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.argument("value", DoubleArgumentType.doubleArg(entry.getAnnotation(MidnightConfig.Entry.class).min(),entry.getAnnotation(MidnightConfig.Entry.class).max()))
.executes(ctx -> this.setValue(ctx.getSource(), DoubleArgumentType.getDouble(ctx, "value")))
));
else if (entry.getType() == boolean.class) {
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.literal("true")
.executes(ctx -> this.setValue(ctx.getSource(), true))
));
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.literal("false")
.executes(ctx -> this.setValue(ctx.getSource(), false))
));
}
else if (entry.getType().isEnum()) {
for (int i = 0; i < entry.getType().getEnumConstants().length; ++i) {
Object enumValue = Arrays.stream(entry.getType().getEnumConstants()).toList().get(i);
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.literal(enumValue.toString())
.executes(ctx -> this.setValue(ctx.getSource(), enumValue))
));
}
}
else
command = command.then(CommandManager.literal(this.entry.getName()).executes(ctx -> getValue(ctx.getSource())).then(
CommandManager.argument("value", StringArgumentType.string())
.executes(ctx -> this.setValue(ctx.getSource(), StringArgumentType.getString(ctx, "value")))
));
}
private int setValue(ServerCommandSource source, Object value) {
try {
entry.set(null,value);
MidnightConfig.write(modid);
}
catch (Exception e) {
source.sendError(new LiteralText("Could not set "+entry.getName()+" to value "+value+": " + e));
return 0;
}
source.sendFeedback(new LiteralText("Successfully set " + entry.getName()+" to "+value), true);
return 1;
}
private int getValue(ServerCommandSource source) {
try {
source.sendFeedback(new LiteralText("The value of "+entry.getName()+" is "+entry.get(null)), false);
return 1;
}
catch (IllegalAccessException ignored) {}
return 0;
}
}

View File

@@ -39,38 +39,14 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
/* MidnightConfig v1.0.6
Single class config library - feel free to copy!
Changelog:
- 1.0.6:
- Abstract & Allow super ticks
- 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
/** MidnightConfig v1.0.8 by TeamMidnightDust & Motschen
* Single class config library - feel free to copy!
*
* Based on https://github.com/Minenash/TinyConfig
* Credits to Minenash */
@SuppressWarnings("unchecked")
public abstract class MidnightConfig {
public static boolean useTooltipForTitle = true; // Render title as tooltip or as simple text
private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)");
private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)");
@@ -211,6 +187,7 @@ public abstract class MidnightConfig {
private final Screen parent;
private final String modid;
private MidnightConfigListWidget list;
private boolean reload = false;
// Real Time config update //
@Override
@@ -220,25 +197,27 @@ public abstract class MidnightConfig {
try { info.field.set(null, info.value); }
catch (IllegalAccessException ignored) {}
}
private void loadValues() {
try { gson.fromJson(Files.newBufferedReader(path), configClass.get(modid)); }
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) {
}
}
}
@Override
protected void init() {
super.init();
if (!reload) loadValues();
this.addDrawableChild(new ButtonWidget(this.width / 2 - 154, this.height - 28, 150, 20, ScreenTexts.CANCEL, button -> {
try { gson.fromJson(Files.newBufferedReader(path), configClass.get(modid)); }
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) {
}
}
}
Objects.requireNonNull(client).openScreen(parent);
loadValues();
Objects.requireNonNull(client).setScreen(parent);
}));
ButtonWidget done = this.addDrawableChild(new ButtonWidget(this.width / 2 + 4, this.height - 28, 150, 20, ScreenTexts.DONE, (button) -> {
@@ -249,7 +228,7 @@ public abstract class MidnightConfig {
} catch (IllegalAccessException ignored) {}
}
write(modid);
Objects.requireNonNull(client).openScreen(parent);
Objects.requireNonNull(client).setScreen(parent);
}));
this.list = new MidnightConfigListWidget(this.client, this.width, this.height, 32, this.height - 32, 25);
@@ -262,7 +241,8 @@ public abstract class MidnightConfig {
info.value = info.defaultValue;
info.tempValue = info.value.toString();
double scrollAmount = list.getScrollAmount();
Objects.requireNonNull(client).openScreen(this);
this.reload = true;
Objects.requireNonNull(client).setScreen(this);
list.setScrollAmount(scrollAmount);
}));
@@ -291,8 +271,8 @@ public abstract class MidnightConfig {
this.list.render(matrices, mouseX, mouseY, delta);
int stringWidth = (int) (title.getString().length() * 2.75f);
if (useTooltipForTitle) renderTooltip(matrices, title, width/2 - stringWidth, 27);
else drawCenteredText(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
renderTooltip(matrices, title, width/2 - stringWidth, 27);
//drawCenteredText(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
for (EntryInfo info : entries) {
if (info.id.equals(modid)) {
@@ -377,7 +357,7 @@ public abstract class MidnightConfig {
return buttonsWithResetButtons;
}
public List<? extends Selectable> method_37025() {
public List<? extends Selectable> selectableChildren() {
return buttonsWithResetButtons;
}
}