Compare commits

...

12 Commits

Author SHA1 Message Date
Martin Prokoph
59989308f6 Merge pull request #37 from Suel-ki/architectury
Fix forge initialization
2023-09-09 11:33:15 +02:00
Suel_ki
29706d3e39 Add static keyword to registerCommands method 2023-07-18 10:27:18 +08:00
Suel_ki
afdd6549d3 Fix registerCommands registration 2023-07-17 16:47:52 +08:00
Suel_ki
8466b3f21a Fix ConfigScreen registration 2023-07-17 16:44:14 +08:00
Martin Prokoph
f71e8dbdc3 Update README.md 2023-06-11 12:52:21 +02:00
Motschen
dbbf546551 MidnightLib 1.4.1 - Fix tabs & Re-enable Quilt and Forge
- Fix tabs not being visible
- Re-enable Forge and Quilt support
- Fix #28
2023-06-09 18:46:53 +02:00
Motschen
9074abc331 Previous commit had a typo, it's 1.20 ;)
This commit fixes unsaved options resetting when resizing the game window
2023-05-22 12:20:35 +02:00
Motschen
8109eeb74e Update to 1.19.4 & Fix invalid value tooltips 2023-05-18 21:33:17 +02:00
Martin Prokoph
e9e1bec91f Merge pull request #26 from notlin4/patch-1
Create zh_tw.json
2023-05-18 18:41:08 +02:00
notlin4
b723253686 Create zh_tw.json 2023-04-04 23:16:14 +08:00
Motschen
e8ea0da749 Fix quilt.mod.json 2023-04-02 16:57:51 +02:00
Motschen
8ab3b9fa7d MidnightLib 1.3.0 - No more hats
- Re-enable Quilt and Forge support
- Completely remove unnecessary bloat (Hat cosmetics)
- File size is now just around 55KB for the Fabric & Quilt version, 60KB for Forge
2023-04-02 14:58:04 +02:00
34 changed files with 172 additions and 460 deletions

3
.gitignore vendored
View File

@@ -16,4 +16,5 @@ classes/
.metadata
.vscode
.settings
*.launch
*.launch
.architectury-transformer/debug.log

View File

@@ -1,3 +1,3 @@
# MidnightLib
Common Library for Team MidnightDust's mods.
Provides a config api, common utils, and cosmetics.
Lightweight Common Library for Minecraft mods.
Provides a config api with a nice GUI and common utilities, all in a very small file.

View File

@@ -1,6 +1,6 @@
plugins {
id "architectury-plugin" version "3.4-SNAPSHOT"
id "dev.architectury.loom" version "1.0-SNAPSHOT" apply false
id "dev.architectury.loom" version "1.1-SNAPSHOT" apply false
}
architectury {

View File

@@ -1,7 +1,6 @@
package eu.midnightdust.core;
import eu.midnightdust.core.config.MidnightLibConfig;
import eu.midnightdust.hats.web.HatLoader;
import eu.midnightdust.lib.config.MidnightConfig;
import java.util.ArrayList;
@@ -10,11 +9,7 @@ import java.util.List;
public class MidnightLibClient {
public static List<String> hiddenMods = new ArrayList<>();
public static final String MOD_ID = "midnightlib";
public static void onInitializeClient() {
MidnightConfig.init("midnightlib", MidnightLibConfig.class);
if (MidnightLibConfig.special_hats) HatLoader.init();
}
}

View File

@@ -4,12 +4,8 @@ import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.lib.util.PlatformFunctions;
public class MidnightLibConfig extends MidnightConfig {
@Comment(centered = true) public static Comment midnightlib_description;
@Entry // Enable or disable the MidnightConfig overview screen button
public static ConfigButton config_screen_list = PlatformFunctions.isModLoaded("modmenu") ? ConfigButton.MODMENU : ConfigButton.TRUE;
@Comment(centered = true) public static Comment midnighthats_description;
@Entry // Enable or disable hats for contributors, friends and donors.
public static boolean special_hats = true;
public enum ConfigButton {
TRUE,FALSE,MODMENU

View File

@@ -1,24 +0,0 @@
package eu.midnightdust.core.mixin;
import eu.midnightdust.hats.witch.WitchHatFeatureRenderer;
import net.minecraft.client.network.AbstractClientPlayerEntity;
import net.minecraft.client.render.entity.EntityRendererFactory;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.PlayerEntityRenderer;
import net.minecraft.client.render.entity.model.PlayerEntityModel;
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;
@Mixin(PlayerEntityRenderer.class)
public abstract class MixinPlayerEntityRenderer extends LivingEntityRenderer<AbstractClientPlayerEntity, PlayerEntityModel<AbstractClientPlayerEntity>> {
public MixinPlayerEntityRenderer(EntityRendererFactory.Context ctx, PlayerEntityModel<AbstractClientPlayerEntity> model, float shadowSize) {
super(ctx, model, shadowSize);
}
@Inject(at = @At("TAIL"), method = "<init>")
public void addFeatures(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) {
this.addFeature(new WitchHatFeatureRenderer<>(this, ctx.getModelLoader()));
}
}

View File

@@ -6,6 +6,7 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.screen.Screen;
@@ -37,17 +38,17 @@ public class MidnightConfigOverviewScreen extends Screen {
sortedMods.forEach((modid) -> {
if (!MidnightLibClient.hiddenMods.contains(modid)) {
list.addButton(ButtonWidget.builder(Text.translatable(modid +".midnightconfig.title"), (button) ->
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 100, this.height - 28, 200, 20).build());
Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))).dimensions(this.width / 2 - 125, this.height - 28, 250, 20).build());
}
});
super.init();
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
this.list.render(matrices, mouseX, mouseY, delta);
drawCenteredTextWithShadow(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
super.render(matrices, mouseX, mouseY, delta);
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
this.renderBackground(context);
this.list.render(context, mouseX, mouseY, delta);
context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF);
super.render(context, mouseX, mouseY, delta);
}
@Environment(EnvType.CLIENT)
public static class MidnightOverviewListWidget extends ElementListWidget<OverviewButtonEntry> {
@@ -59,7 +60,7 @@ public class MidnightConfigOverviewScreen extends Screen {
textRenderer = minecraftClient.textRenderer;
}
@Override
public int getScrollbarPositionX() {return this.width -7;}
public int getScrollbarPositionX() {return this.width-7;}
public void addButton(ClickableWidget button) {
this.addEntry(OverviewButtonEntry.create(button));
@@ -76,9 +77,9 @@ public class MidnightConfigOverviewScreen extends Screen {
this.buttonList.add(button);
}
public static OverviewButtonEntry create(ClickableWidget button) {return new OverviewButtonEntry(button);}
public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
button.setY(y);
button.render(matrices, mouseX, mouseY, tickDelta);
button.render(context, mouseX, mouseY, tickDelta);
}
public List<? extends Element> children() {return buttonList;}
public List<? extends Selectable> selectableChildren() {return buttonList;}

View File

@@ -1,49 +0,0 @@
package eu.midnightdust.hats.web;
import com.google.common.reflect.TypeToken;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import net.minecraft.client.MinecraftClient;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.lang.reflect.Type;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.CompletableFuture;
@SuppressWarnings("UnstableApiUsage")
public class HatLoader {
public static final System.Logger logger = System.getLogger("MidnightLib");
private final static String HATS_URL = "https://raw.githubusercontent.com/TeamMidnightDust/MidnightHats/master/hats.json";
public static final Type HAT_TYPE = new TypeToken<Map<UUID, PlayerHatData>>(){}.getType();
public static Map<UUID, PlayerHatData> PLAYER_HATS;
private static final Gson GSON = new GsonBuilder().create();
public static void init() {
CompletableFuture.supplyAsync(() -> {
try (Reader reader = new InputStreamReader(new URL(HATS_URL).openStream())) {
return GSON.<Map<UUID, PlayerHatData>>fromJson(reader, HAT_TYPE);
} catch (MalformedURLException error) {
logger.log(System.Logger.Level.ERROR, "Unable to load player hats because of connection problems: " + error.getMessage());
} catch (IOException error) {
logger.log(System.Logger.Level.ERROR, "Unable to load player hats because of an I/O Exception: " + error.getMessage());
}
return null;
}).thenAcceptAsync(playerData -> {
if (playerData != null) {
PLAYER_HATS = playerData;
System.out.println("(MidnightLib) Player hats successfully loaded!");
} else {
PLAYER_HATS = Collections.emptyMap();
logger.log(System.Logger.Level.WARNING, "A problem with the database occurred, the hats could not be initialized.");
}
}, MinecraftClient.getInstance());
}
}

View File

@@ -1,13 +0,0 @@
package eu.midnightdust.hats.web;
public class PlayerHatData {
private final String hat;
public PlayerHatData(String hat) {
this.hat = hat;
}
public String getHatType() {
return hat;
}
}

View File

@@ -1,82 +0,0 @@
package eu.midnightdust.hats.witch;
import eu.midnightdust.hats.web.HatLoader;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.model.TexturedModelData;
import net.minecraft.client.render.*;
import net.minecraft.client.render.entity.feature.FeatureRenderer;
import net.minecraft.client.render.entity.feature.FeatureRendererContext;
import net.minecraft.client.render.entity.model.EntityModel;
import net.minecraft.client.render.entity.model.EntityModelLayer;
import net.minecraft.client.render.entity.model.EntityModelLoader;
import net.minecraft.client.render.entity.model.ModelWithHead;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.Identifier;
import java.awt.*;
import java.util.UUID;
import static eu.midnightdust.core.MidnightLibClient.MOD_ID;
@Environment(EnvType.CLIENT)
public class WitchHatFeatureRenderer<T extends LivingEntity, M extends EntityModel<T>> extends FeatureRenderer<T, M> {
public static final EntityModelLayer WITCH_HAT_MODEL_LAYER = new EntityModelLayer(new Identifier("midnight-hats","witch_hat"), "main");
private static final UUID MOTSCHEN = UUID.fromString("a44c2660-630f-478f-946a-e518669fcf0c");
private static final Identifier WITCH = new Identifier("textures/entity/witch.png");
private static final Identifier OVERLAY = new Identifier(MOD_ID,"textures/hats/overlay.png");
private static final Color MOTSCHEN_COLOR = MidnightColorUtil.radialRainbow(1,1);
private static final Color ADOPTER_COLOR = MidnightColorUtil.hex2Rgb("ffffff");
private static final Color MODDER_COLOR = MidnightColorUtil.hex2Rgb("7825b4");
private static final Color FRIEND_COLOR = MidnightColorUtil.hex2Rgb("ff0234");
private static final Color DONOR_COLOR = MidnightColorUtil.hex2Rgb("ff6c00");
private static final Color SOCIAL_COLOR = MidnightColorUtil.hex2Rgb("238a9d");
private final WitchHatModel<T> witchHat;
private final MinecraftClient client = MinecraftClient.getInstance();
public WitchHatFeatureRenderer(FeatureRendererContext<T, M> featureRendererContext, EntityModelLoader entityModelLoader) {
super(featureRendererContext);
this.witchHat = new WitchHatModel<>(entityModelLoader.getModelPart(WITCH_HAT_MODEL_LAYER));
}
public static TexturedModelData getTexturedModelData() {
return TexturedModelData.of(WitchHatModel.getModelData(), 64, 128);
}
public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) {
Color hat_type = getHat(livingEntity.getUuid());
if (hat_type != null && !livingEntity.isInvisibleTo(client.player)) {
if (hat_type == MOTSCHEN_COLOR) hat_type = MidnightColorUtil.radialRainbow(1,1);
matrixStack.push();
((ModelWithHead) this.getContextModel()).getHead().rotate(matrixStack);
VertexConsumer vertexConsumer = vertexConsumerProvider.getBuffer(RenderLayer.getEntityCutoutNoCull(WITCH));
this.witchHat.render(matrixStack, vertexConsumer, i, OverlayTexture.DEFAULT_UV,1f,1f,1f,1);
VertexConsumer glow = vertexConsumerProvider.getBuffer(RenderLayer.getBeaconBeam(OVERLAY,true));
matrixStack.translate(0,0,-0.001f);
this.witchHat.render(matrixStack, glow, 230, OverlayTexture.DEFAULT_UV, hat_type.getRed() / 255f, hat_type.getGreen() / 255f, hat_type.getBlue() / 255f, 1.0F);
matrixStack.pop();
}
}
private Color getHat(UUID uuid) {
if (uuid.equals(MOTSCHEN)) {
return MOTSCHEN_COLOR;
} else if (HatLoader.PLAYER_HATS != null && HatLoader.PLAYER_HATS.containsKey(uuid)) {
return switch (HatLoader.PLAYER_HATS.get(uuid).getHatType()) {
case "adopter" -> ADOPTER_COLOR;
case "contributer", "modder" -> MODDER_COLOR;
case "friend" -> FRIEND_COLOR;
case "donator", "donor" -> DONOR_COLOR;
case "social" -> SOCIAL_COLOR;
default -> MidnightColorUtil.hex2Rgb(HatLoader.PLAYER_HATS.get(uuid).getHatType());
};
}
return null;
}
}

View File

@@ -1,59 +0,0 @@
package eu.midnightdust.hats.witch;
import net.minecraft.client.model.*;
import net.minecraft.client.render.VertexConsumer;
import net.minecraft.client.render.entity.model.SinglePartEntityModel;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
public class WitchHatModel<T extends LivingEntity> extends SinglePartEntityModel<T> {
private final ModelPart headwear;
public WitchHatModel(ModelPart root) {
headwear = root;
root.setPivot(5.0F, -9.0F, -5.0F);
ModelPart bone = headwear.getChild("bone");
bone.setPivot(-8.5F, -0.1F, 1.5F);
setRotationAngle(bone, -0.0524F, 0.0F, 0.0349F);
ModelPart bone2 = bone.getChild("bone2");
bone2.setPivot(1.5F, -4.0F, 1.5F);
setRotationAngle(bone2, -0.1222F, 0.0F, 0.0698F);
ModelPart bone3 = bone2.getChild("bone3");
bone3.setPivot(1.5F, -4.0F, 1.5F);
setRotationAngle(bone3, -0.2618F, 0.0F, 0.1047F);
}
public static ModelData getModelData(){
ModelData modelData = new ModelData();
ModelPartData modelPartData = modelData.getRoot();
modelPartData.addChild("headwear", ModelPartBuilder.create().uv(0, 64).cuboid(-10.0F, -0.1F, 0.0F, 10.0F, 2.0F, 10.0F), ModelTransform.NONE);
ModelPartData modelPartData2 = modelPartData.addChild("bone", ModelPartBuilder.create().uv(0, 76).cuboid(0.0F, -4.0F, 0.0F, 7.0F, 4.0F, 7.0F), ModelTransform.rotation(-0.0524F, 0.0F, 0.0349F));
ModelPartData modelPartData3 = modelPartData2.addChild("bone2", ModelPartBuilder.create().uv(0, 87).cuboid(0.0F, -4.0F, 0.0F, 4.0F, 4.0F, 4.0F), ModelTransform.rotation(-0.1222F, 0.0F, 0.0698F));
modelPartData3.addChild("bone3", ModelPartBuilder.create().uv(0, 95).cuboid(0.0F, -2.0F, 0.0F, 1.0F, 2.0F, 1.0F), ModelTransform.rotation(-0.2618F, 0.0F, 0.1047F));
return modelData;
}
@Override
public void setAngles(T entity, float limbAngle, float limbDistance, float animationProgress, float headYaw, float headPitch) {
}
@Override
public void render(MatrixStack matrixStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){
headwear.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha);
}
@Override
public ModelPart getPart() {
return headwear;
}
public void setRotationAngle(ModelPart bone, float x, float y, float z) {
bone.pitch = x;
bone.yaw = y;
bone.roll = z;
}
}

View File

@@ -80,15 +80,17 @@ public class AutoCommand {
return 0;
}
source.sendFeedback(Text.literal("Successfully set " + entry.getName()+" to "+value), true);
source.sendFeedback(() -> Text.literal("Successfully set " + entry.getName()+" to "+value), true);
return 1;
}
private int getValue(ServerCommandSource source) {
try {
source.sendFeedback(Text.literal("The value of "+entry.getName()+" is "+entry.get(null)), false);
return 1;
}
catch (IllegalAccessException ignored) {}
source.sendFeedback(() -> {
try {
return Text.literal("The value of "+entry.getName()+" is "+entry.get(null));
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}, false);
return 0;
}
}

View File

@@ -9,7 +9,7 @@ import net.fabricmc.api.EnvType;
import net.fabricmc.api.Environment;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.font.TextRenderer;
import net.minecraft.client.gui.DrawableHelper;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.Selectable;
import net.minecraft.client.gui.screen.Screen;
@@ -19,8 +19,8 @@ import net.minecraft.client.gui.tab.TabManager;
import net.minecraft.client.gui.tooltip.Tooltip;
import net.minecraft.client.gui.widget.*;
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;
@@ -41,10 +41,9 @@ import java.util.function.Function;
import java.util.function.Predicate;
import java.util.regex.Pattern;
/** MidnightConfig v2.4.0 by TeamMidnightDust & Motschen
/** MidnightConfig v2.4.1 by TeamMidnightDust & Motschen
* Single class config library - feel free to copy!
* Based on https://github.com/Minenash/TinyConfig
* Based on <a href="https://github.com/Minenash/TinyConfig">...</a>
* Credits to Minenash */
@SuppressWarnings("unchecked")
@@ -83,8 +82,8 @@ public abstract class MidnightConfig {
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 (PlatformFunctions.isClientEnv()) initClient(modid, field, info);
if ((field.isAnnotationPresent(Entry.class) || field.isAnnotationPresent(Comment.class)) && !field.isAnnotationPresent(Server.class) && !field.isAnnotationPresent(Hidden.class) && PlatformFunctions.isClientEnv())
initClient(modid, field, info);
if (field.isAnnotationPresent(Comment.class)) info.centered = field.getAnnotation(Comment.class).centered();
if (field.isAnnotationPresent(Entry.class))
try {
@@ -115,9 +114,8 @@ public abstract class MidnightConfig {
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 == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(), false);
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) {
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<Object, Text> func = value -> Text.translatable((Boolean) value ? "gui.yes" : "gui.no").formatted((Boolean) value ? Formatting.GREEN : Formatting.RED);
info.widget = new AbstractMap.SimpleEntry<ButtonWidget.PressAction, Function<Object, Text>>(button -> {
info.value = !(Boolean) info.value;
@@ -135,6 +133,9 @@ public abstract class MidnightConfig {
}
entries.add(info);
}
public static Tooltip getTooltip(EntryInfo info) {
return Tooltip.of(info.error != null ? info.error : I18n.hasTranslation(info.id + ".midnightconfig."+info.field.getName()+".tooltip") ? Text.translatable(info.id + ".midnightconfig."+info.field.getName()+".tooltip") : Text.empty());
}
private static void textField(EntryInfo info, Function<String,Number> f, Pattern pattern, double min, double max, boolean cast) {
boolean isNumber = pattern != null;
@@ -151,6 +152,7 @@ public abstract class MidnightConfig {
info.error = inLimits? null : Text.literal(value.doubleValue() < min ?
"§cMinimum " + (isNumber? "value" : "length") + (cast? " is " + (int)min : " is " + min) :
"§cMaximum " + (isNumber? "value" : "length") + (cast? " is " + (int)max : " is " + max)).formatted(Formatting.RED);
t.setTooltip(getTooltip(info));
}
info.tempValue = s;
@@ -196,6 +198,25 @@ public abstract class MidnightConfig {
this.parent = parent;
this.modid = modid;
this.translationPrefix = modid + ".midnightconfig.";
loadValues();
for (EntryInfo e : entries) {
if (e.id.equals(modid)) {
String tabId = e.field.isAnnotationPresent(Entry.class) ? e.field.getAnnotation(Entry.class).category() : e.field.getAnnotation(Comment.class).category();
String name = translationPrefix + "category." + tabId;
if (!I18n.hasTranslation(name) && tabId.equals("default"))
name = translationPrefix + "title";
if (!tabs.containsKey(name)) {
Tab tab = new GridScreenTab(Text.translatable(name));
e.tab = tab;
tabs.put(name, tab);
} else e.tab = tabs.get(name);
}
}
tabNavigation = TabNavigationWidget.builder(tabManager, this.width).tabs(tabs.values().toArray(new Tab[0])).build();
tabNavigation.selectTab(0, false);
tabNavigation.init();
prevTab = tabManager.getCurrentTab();
}
public final String translationPrefix;
public final Screen parent;
@@ -203,9 +224,11 @@ public abstract class MidnightConfig {
public MidnightConfigListWidget list;
public boolean reload = false;
public TabManager tabManager = new TabManager(a -> {}, a -> {});
public Map<String, Tab> tabs = new HashMap<>();
public Tab prevTab;
public TabNavigationWidget tabNavigation;
public ButtonWidget done;
public double scrollProgress = 0d;
// Real Time config update //
@Override
@@ -217,6 +240,7 @@ public abstract class MidnightConfig {
fillList();
list.setScrollAmount(0);
}
scrollProgress = list.getScrollAmount();
for (EntryInfo info : entries) {
try {info.field.set(null, info.value);} catch (IllegalAccessException ignored) {}
}
@@ -248,39 +272,12 @@ public abstract class MidnightConfig {
if (this.tabNavigation.trySwitchTabsWithKey(keyCode)) return true;
return super.keyPressed(keyCode, scanCode, modifiers);
}
public Tooltip getTooltip(EntryInfo info) {
return Tooltip.of(info.error != null ? info.error : I18n.hasTranslation(translationPrefix+info.field.getName()+".tooltip") ? Text.translatable(translationPrefix+info.field.getName()+".tooltip") : Text.empty());
}
public void refresh() {
double scrollAmount = list.getScrollAmount();
list.clear();
fillList();
list.setScrollAmount(scrollAmount);
}
@Override
public void init() {
super.init();
loadValues();
Map<String, Tab> tabs = new HashMap<>();
for (EntryInfo e : entries) {
if (e.id.equals(modid)) {
String tabId = e.field.isAnnotationPresent(Entry.class) ? e.field.getAnnotation(Entry.class).category() : e.field.getAnnotation(Comment.class).category();
String name = translationPrefix + "category." + tabId;
if (!I18n.hasTranslation(name) && tabId.equals("default"))
name = translationPrefix + "title";
Tab tab = new GridScreenTab(Text.translatable(name));
if (!tabs.containsKey(name)) {
e.tab = tab;
tabs.put(name, tab);
} else e.tab = tabs.get(name);
}
}
tabNavigation = TabNavigationWidget.builder(tabManager, this.width).tabs(tabs.values().toArray(new Tab[0])).build();
if (tabs.size() > 1) this.addDrawableChild(tabNavigation);
if (!reload) tabNavigation.selectTab(0, false);
tabNavigation.setWidth(this.width);
tabNavigation.init();
prevTab = tabManager.getCurrentTab();
if (tabs.size() > 1) this.addDrawableChild(tabNavigation);
this.addDrawableChild(ButtonWidget.builder(ScreenTexts.CANCEL, button -> {
loadValues();
@@ -302,6 +299,7 @@ public abstract class MidnightConfig {
this.addSelectableChild(this.list);
fillList();
reload = true;
}
public void fillList() {
for (EntryInfo info : entries) {
@@ -311,7 +309,8 @@ public abstract class MidnightConfig {
info.value = info.defaultValue;
info.tempValue = info.defaultValue.toString();
info.index = 0;
this.refresh();
list.clear();
fillList();
})).dimensions(width - 205, 0, 40, 20).build();
if (info.widget instanceof Map.Entry) {
@@ -333,9 +332,8 @@ public abstract class MidnightConfig {
if (((List<?>) info.value).contains("")) ((List<String>) info.value).remove("");
info.index = info.index + 1;
if (info.index > ((List<String>) info.value).size()) info.index = 0;
this.reload = true;
refresh();
this.reload = false;
list.clear();
fillList();
})).dimensions(width - 185, 0, 20, 20).build();
widget.setTooltip(getTooltip(info));
this.list.addButton(List.of(widget, resetButton, cycleButton), name, info);
@@ -370,16 +368,17 @@ public abstract class MidnightConfig {
this.list.addButton(List.of(), name, info);
}
}
list.setScrollAmount(scrollProgress);
updateResetButtons();
}
}
@Override
public void render(MatrixStack matrices, int mouseX, int mouseY, float delta) {
this.renderBackground(matrices);
this.list.render(matrices, mouseX, mouseY, delta);
public void render(DrawContext context, int mouseX, int mouseY, float delta) {
this.renderBackground(context);
this.list.render(context, mouseX, mouseY, delta);
drawCenteredTextWithShadow(matrices, textRenderer, title, width / 2, 15, 0xFFFFFF);
super.render(matrices,mouseX,mouseY,delta);
if (tabs.size() < 2) context.drawCenteredTextWithShadow(textRenderer, title, width / 2, 15, 0xFFFFFF);
super.render(context,mouseX,mouseY,delta);
}
}
@Environment(EnvType.CLIENT)
@@ -418,17 +417,23 @@ public abstract class MidnightConfig {
this.info = info;
children.addAll(buttons);
}
public void render(MatrixStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
buttons.forEach(b -> { b.setY(y); b.render(matrices, mouseX, mouseY, tickDelta); });
public void render(DrawContext context, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) {
buttons.forEach(b -> { b.setY(y); b.render(context, mouseX, mouseY, tickDelta); });
if (text != null && (!text.getString().contains("spacer") || !buttons.isEmpty())) {
if (info.centered) textRenderer.drawWithShadow(matrices, text, MinecraftClient.getInstance().getWindow().getScaledWidth() / 2f - (textRenderer.getWidth(text) / 2f), y + 5, 0xFFFFFF);
else DrawableHelper.drawTextWithShadow(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF);
if (info.centered) context.drawTextWithShadow(textRenderer, text, MinecraftClient.getInstance().getWindow().getScaledWidth() / 2 - (textRenderer.getWidth(text) / 2), y + 5, 0xFFFFFF);
else {
int wrappedY = y;
for(Iterator<OrderedText> iterator = textRenderer.wrapLines(text, (buttons.size() > 1 ? buttons.get(1).getX()-24 : MinecraftClient.getInstance().getWindow().getScaledWidth() - 24)).iterator(); iterator.hasNext(); wrappedY += 9) {
OrderedText orderedText = iterator.next();
context.drawTextWithShadow(textRenderer, orderedText, 12, wrappedY + 5, 0xFFFFFF);
}
}
}
}
public List<? extends Element> children() {return children;}
public List<? extends Selectable> selectableChildren() {return children;}
}
private static class MidnightSliderWidget extends SliderWidget {
public static class MidnightSliderWidget extends SliderWidget {
private final EntryInfo info; private final Entry e;
public MidnightSliderWidget(int x, int y, int width, int height, Text text, double value, EntryInfo info) {
super(x, y, width, height, text, value);

View File

@@ -1,7 +0,0 @@
package eu.midnightdust.lib.util;
public class MidnightMathUtil {
public static boolean isEven(int i) {
return (i | 1) > i;
}
}

View File

@@ -1,6 +1,7 @@
package eu.midnightdust.lib.util.screen;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.gui.widget.TexturedButtonWidget;
import net.minecraft.client.render.GameRenderer;
import net.minecraft.client.util.math.MatrixStack;
@@ -26,21 +27,14 @@ public class TexturedOverlayButtonWidget extends TexturedButtonWidget {
}
@Override
public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) {
public void renderButton(DrawContext context, int mouseX, int mouseY, float delta) {
int i = 66;
if (!this.isNarratable()) {
i += hoveredVOffset * 2;
} else if (this.isSelected()) {
i += hoveredVOffset;
}
RenderSystem.setShader(GameRenderer::getPositionTexProgram);
RenderSystem.setShaderTexture(0, WIDGETS_TEXTURE);
RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha);
RenderSystem.enableBlend();
RenderSystem.defaultBlendFunc();
RenderSystem.enableDepthTest();
drawNineSlicedTexture(matrices, this.getX(), this.getY(), this.width, this.height, 4, 200, 20, 0, i);
super.renderButton(matrices, mouseX, mouseY, delta);
context.drawNineSlicedTexture(WIDGETS_TEXTURE, this.getX(), this.getY(), this.width, this.height, 4, 200, 20, 0, i);
super.renderButton(context, mouseX, mouseY, delta);
}
}

View File

@@ -1,11 +1,8 @@
{
"midnightlib.overview.title":"MidnightConfig Übersicht",
"midnightlib.midnightconfig.title":"MidnightLib Konfiguration",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Konfigurationsübersicht",
"midnightlib.midnightconfig.background_texture":"Textur der Konfigurationsbildschirme",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Unterstützer-Hüte",
"modmenu.descriptionTranslation.midnightlib": "Code-Bibliothek für Mods von MidnightDust.\nStellt eine Konfigurationsschnittstelle, automatische Kompatibilität, oft genutzten Code und Hüte für Unterstützer bereit.",
"modmenu.summaryTranslation.midnightlib": "Code-Bibliothek für Mods von MidnightDust."
}

View File

@@ -1,14 +1,11 @@
{
"midnightlib.overview.title":"MidnightConfig Overview",
"midnightlib.midnightconfig.title":"MidnightLib Config",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Enable Config Screen List",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aYes",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cNo",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu",
"midnightlib.midnightconfig.background_texture":"Texture of config screen backgrounds",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Enable Supporter Hats",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"Wiki",

View File

@@ -1,17 +1,10 @@
{
"midnightlib.overview.title":"Vue d'ensemble de MidnightConfig",
"midnightlib.midnightconfig.title":"Configuration de MidnightLib",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Activer la liste de l'écran de configuration",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aOui",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cNon",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu",
"midnightlib.midnightconfig.background_texture":"Texture d'arrière-plan de l'écran de configuration",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Activer les chapeaux de fan",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"Wiki",
"modmenu.descriptionTranslation.midnightlib": "Bibliothèque commune pour les mods de la Team MidnightDust.\nFournit une API de configuration, une intégration automatique avec d'autres mods, des utilitaires courants et des cosmétiques.",
"modmenu.summaryTranslation.midnightlib": "Bibliothèque commune pour les mods de la Team MidnightDust."
}

View File

@@ -1,17 +1,10 @@
{
"midnightlib.overview.title":"Visão geral do MidnightConfig",
"midnightlib.midnightconfig.title":"Configuração MidnightLib",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Ativar lista de telas de configuração",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aVerdadeiro",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cFalso",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu",
"midnightlib.midnightconfig.background_texture":"Textura dos fundos da tela de configuração",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Ativar chapéus de torcedor",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"Wiki",
"modmenu.descriptionTranslation.midnightlib": "Biblioteca comum para mods do Team MidnightDust.\nFornece uma API de configuração, integração automática com outros mods, utilitários comuns e cosméticos.",
"modmenu.summaryTranslation.midnightlib": "Biblioteca comum para mods do Team MidnightDust."
}

View File

@@ -1,16 +1,10 @@
{
"midnightlib.overview.title":"MidnightConfig күзәтү",
"midnightlib.midnightconfig.title":"MidnightLib көйләүләре",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Көйләүләр экранының исемлеген кушу",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aӘйе",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cЮк",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu",
"midnightlib.midnightconfig.background_texture":"Көйләүләр экранының фонының текстурасы",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Ярдәмченең эшләпәсен кушу",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"Вики",
"modmenu.descriptionTranslation.midnightlib": "MidnightDust төркеменең модлары өчен гомуми китапханә.\nКөйләүләр API-ын, башка модлар белән автоматик интеграцияне, гомуми хезмәти программаларны һәм бизәнүләрне тәэмин ителә.",
"modmenu.summaryTranslation.midnightlib": "MidnightDust төркеменең модлары өчен гомуми китапханә."

View File

@@ -1,16 +1,8 @@
{
"midnightlib.overview.title":"Огляд MidnightConfig",
"midnightlib.midnightconfig.title":"Конфігурація MidnightLib",
"midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib",
"midnightlib.midnightconfig.config_screen_list":"Увімкнути список екрана конфігурації",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aTrue",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cFalse",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu",
"midnightlib.midnightconfig.background_texture":"Текстура фону екрана конфігурації",
"midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats",
"midnightlib.midnightconfig.special_hats":"Увімкнути капелюхи спонсорів",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"Вікі",
"modmenu.descriptionTranslation.midnightlib": "Загальна бібліотека для модів команди MidnightDust.\nНадає конфігураційний API, автоматичну інтеграцію з іншими модами, загальні утиліти та косметику.",
"modmenu.summaryTranslation.midnightlib": "Загальна бібліотека для модів команди MidnightDust."

View File

@@ -0,0 +1,14 @@
{
"midnightlib.overview.title":"MidnightConfig 概述",
"midnightlib.midnightconfig.title":"MidnightLib 設定",
"midnightlib.midnightconfig.config_screen_list":"啟用設定畫面列表",
"midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§a是",
"midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§c否",
"midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§b模組選單",
"midnightlib.midnightconfig.background_texture":"設定背景畫面的材質",
"midnightlib.modrinth":"Modrinth",
"midnightlib.curseforge":"CurseForge",
"midnightlib.wiki":"維基",
"modmenu.descriptionTranslation.midnightlib": "MidnightDust 團隊的常用程式庫模組。\n提供設定 API、與其他模組自動整合、常用工具和美觀。",
"modmenu.summaryTranslation.midnightlib": "MidnightDust 團隊的常用程式庫模組。"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 217 B

View File

@@ -4,8 +4,7 @@
"package": "eu.midnightdust.core.mixin",
"compatibilityLevel": "JAVA_17",
"client": [
"MixinOptionsScreen",
"MixinPlayerEntityRenderer"
"MixinOptionsScreen"
],
"injectors": {
"defaultRequire": 1

View File

@@ -1,16 +1,13 @@
package eu.midnightdust.fabric.core;
import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.hats.witch.WitchHatFeatureRenderer;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
public class MidnightLibClientFabric implements ClientModInitializer {
@Override
public void onInitializeClient() {
EntityModelLayerRegistry.registerModelLayer(WitchHatFeatureRenderer.WITCH_HAT_MODEL_LAYER, WitchHatFeatureRenderer::getTexturedModelData);
MidnightLibClient.onInitializeClient();
ClientTickEvents.END_CLIENT_TICK.register(
client -> MidnightColorUtil.tick()

View File

@@ -31,9 +31,8 @@
]
},
"depends": {
"fabric-models-v0": "*",
"fabric-resource-loader-v0": "*",
"minecraft": ">=1.19.4-rc.1"
"minecraft": ">=1.20-beta.2"
},
"mixins": [

View File

@@ -1,35 +1,30 @@
package eu.midnightdust.forge;
import eu.midnightdust.hats.witch.WitchHatFeatureRenderer;
import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLLoadCompleteEvent;
@Mod.EventBusSubscriber(modid = "midnightlib", bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class MidnightLibClientEvents {
@SubscribeEvent
public static void registerLayerDefinition(EntityRenderersEvent.RegisterLayerDefinitions event) {
event.registerLayerDefinition(WitchHatFeatureRenderer.WITCH_HAT_MODEL_LAYER, WitchHatFeatureRenderer::getTexturedModelData);
}
@SubscribeEvent
public void registerClientTick(TickEvent.ClientTickEvent event) {
MidnightColorUtil.tick();
}
@SubscribeEvent
public void onPostInit(FMLLoadCompleteEvent event) {
ModList.get().applyForEachModContainer(modContainer -> {
if (MidnightConfig.configClass.containsKey(modContainer.getModId())) {
modContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () ->
new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> MidnightConfig.getScreen(parent, modContainer.getModId())));
}
return true;
});
}
}
package eu.midnightdust.forge;
import eu.midnightdust.lib.config.MidnightConfig;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.ModList;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
@Mod.EventBusSubscriber(modid = "midnightlib", bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT)
public class MidnightLibClientEvents {
public static void registerClientTick(TickEvent.ClientTickEvent event) {
MidnightColorUtil.tick();
}
@SubscribeEvent
public static void onPostInit(FMLClientSetupEvent event) {
MinecraftForge.EVENT_BUS.addListener(MidnightLibClientEvents::registerClientTick);
ModList.get().forEachModContainer((modid, modContainer) -> {
if (MidnightConfig.configClass.containsKey(modid)) {
modContainer.registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () ->
new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> MidnightConfig.getScreen(parent, modid)));
}
});
}
}

View File

@@ -1,26 +1,19 @@
package eu.midnightdust.forge;
import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.core.MidnightLibServer;
import eu.midnightdust.lib.config.MidnightConfig;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.ConfigScreenHandler;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.NetworkConstants;
@Mod("midnightlib")
public class MidnightLibForge {
public MidnightLibForge() {
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (remote, server) -> true));
DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> MidnightLibClient::onInitializeClient);
DistExecutor.safeRunWhenOn(Dist.DEDICATED_SERVER, () -> MidnightLibServer::onInitializeServer);
ModLoadingContext.get().registerExtensionPoint(ConfigScreenHandler.ConfigScreenFactory.class, () ->
new ConfigScreenHandler.ConfigScreenFactory((client, parent) -> MidnightConfig.getScreen(parent, "midnightlib")));
MinecraftForge.EVENT_BUS.register(new MidnightLibClientEvents());
MinecraftForge.EVENT_BUS.register(new MidnightLibServerEvents());
}
}
package eu.midnightdust.forge;
import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.core.MidnightLibServer;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.fml.DistExecutor;
import net.minecraftforge.fml.IExtensionPoint;
import net.minecraftforge.fml.ModLoadingContext;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.network.NetworkConstants;
@Mod("midnightlib")
public class MidnightLibForge {
public MidnightLibForge() {
ModLoadingContext.get().registerExtensionPoint(IExtensionPoint.DisplayTest.class, () -> new IExtensionPoint.DisplayTest(() -> NetworkConstants.IGNORESERVERONLY, (remote, server) -> true));
DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> MidnightLibClient::onInitializeClient);
DistExecutor.safeRunWhenOn(Dist.DEDICATED_SERVER, () -> MidnightLibServer::onInitializeServer);
}
}

View File

@@ -8,10 +8,10 @@ import net.minecraftforge.event.RegisterCommandsEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
@Mod.EventBusSubscriber(modid = "midnightlib", bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.DEDICATED_SERVER)
@Mod.EventBusSubscriber(modid = "midnightlib", value = Dist.DEDICATED_SERVER)
public class MidnightLibServerEvents {
@SubscribeEvent
public void registerCommands(RegisterCommandsEvent event) {
public static void registerCommands(RegisterCommandsEvent event) {
for (LiteralArgumentBuilder<ServerCommandSource> command : AutoCommand.commands){
event.getDispatcher().register(command);
}

View File

@@ -24,6 +24,6 @@ side = "BOTH"
[[dependencies.midnightlib]]
modId = "minecraft"
mandatory = true
versionRange = "[1.19.2,)"
versionRange = "[1.19.4,)"
ordering = "NONE"
side = "BOTH"

View File

@@ -1,18 +1,18 @@
org.gradle.jvmargs=-Xmx4096M
minecraft_version=1.19.4-pre4
yarn_mappings=1.19.4-pre4+build.1
enabled_platforms=fabric
minecraft_version=1.20
yarn_mappings=1.20+build.1
enabled_platforms=quilt,fabric,forge
archives_base_name=midnightlib
mod_version=1.2.1
mod_version=1.4.1
maven_group=eu.midnightdust
fabric_loader_version=0.14.17
fabric_api_version=0.75.3+1.19.4
fabric_loader_version=0.14.21
fabric_api_version=0.83.0+1.20
forge_version=1.19.3-44.0.18
forge_version=1.20-46.0.2
quilt_loader_version=0.18.1-beta.75
quilt_fabric_api_version=5.0.0-beta.2+0.68.1-1.19.3
mod_menu_version = 5.0.2
quilt_loader_version=0.19.0-beta.18
quilt_fabric_api_version=7.0.1+0.83.0-1.20
mod_menu_version = 7.0.1

View File

@@ -1,9 +1,7 @@
package eu.midnightdust.quilt.core;
import eu.midnightdust.core.MidnightLibClient;
import eu.midnightdust.hats.witch.WitchHatFeatureRenderer;
import eu.midnightdust.lib.util.MidnightColorUtil;
import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry;
import org.quiltmc.loader.api.ModContainer;
import org.quiltmc.qsl.base.api.entrypoint.client.ClientModInitializer;
import org.quiltmc.qsl.lifecycle.api.client.event.ClientTickEvents;
@@ -11,7 +9,6 @@ import org.quiltmc.qsl.lifecycle.api.client.event.ClientTickEvents;
public class MidnightLibClientQuilt implements ClientModInitializer {
@Override
public void onInitializeClient(ModContainer mod) {
EntityModelLayerRegistry.registerModelLayer(WitchHatFeatureRenderer.WITCH_HAT_MODEL_LAYER, WitchHatFeatureRenderer::getTexturedModelData);
MidnightLibClient.onInitializeClient();
ClientTickEvents.END.register(
client -> MidnightColorUtil.tick()

View File

@@ -4,21 +4,7 @@
"group": "${group}",
"id": "midnightlib",
"version": "${version}",
"name": "MidnightLib",
"description": "Common Library for Team MidnightDust's mods.",
"authors": [
"TeamMidnightDust",
"Motschen"
],
"contact": {
"homepage": "https://www.midnightdust.eu/",
"sources": "https://github.com/TeamMidnightDust/MidnightLib",
"issues": "https://github.com/TeamMidnightDust/MidnightLib/issues"
},
"license": "MIT",
"icon": "assets/midnightlib/icon.png",
"intermediate_mappings": "net.fabricmc:intermediary",
"environment": "*",
"entrypoints": {
"client_init": [
"eu.midnightdust.quilt.core.MidnightLibClientQuilt"
@@ -38,11 +24,17 @@
{
"id": "quilt_base",
"version": "*"
},
{
"id": "minecraft",
"version": ">=1.19.4"
}
],
"metadata": {
"name": "MidnightLib (Quilt)",
"description": "Common Library for Team MidnightDust's mods.\nProvides a config api, automatic integration with other mods, common utils, and cosmetics.",
"description": "Common Library for Team MidnightDust's mods. Provides a config api, automatic integration with other mods, common utils, and cosmetics.",
"license": "MIT",
"environment": "*",
"contributors": {
"Motschen": "Author",
"TeamMidnightDust": "Mascot"

View File

@@ -10,7 +10,7 @@ pluginManagement {
include("common")
include("fabric-like")
include("fabric")
//include("quilt")
//include("forge")
include("quilt")
include("forge")
rootProject.name = "midnightlib"