From afa8cf9a5dad4456870e9567ef519b9b181a9eb7 Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 28 Oct 2021 23:20:40 +0200 Subject: [PATCH] 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 --- gradle.properties | 10 +- .../midnightdust/core/MidnightLibClient.java | 30 ++---- .../midnightdust/core/MidnightLibServer.java | 20 ++++ .../core/config/MidnightLibConfig.java | 10 +- .../core/mixin/MixinOptionsScreen.java | 5 +- .../mixin/MixinPlayerEntityRenderer.java} | 12 +-- .../screen/MidnightConfigOverviewScreen.java | 16 ++- .../hats/bunny/BunnyEarsFeatureRenderer.java | 63 ------------ .../hats/bunny/BunnyEarsModel.java | 36 ------- .../ChristmasHatFeatureRenderer.java | 64 ------------ .../hats/christmas/ChristmasHatModel.java | 56 ----------- .../hats/tater/TinyPotatoFeatureRenderer.java | 66 ------------- .../hats/tater/TinyPotatoModel.java | 36 ------- .../eu/midnightdust/hats/web/HatLoader.java | 2 +- .../hats/witch/WitchHatFeatureRenderer.java | 63 ++++++------ .../hats/witch/WitchHatModel.java | 11 +-- .../midnightdust/lib/config/AutoCommand.java | 91 ++++++++++++++++++ .../lib/config/MidnightConfig.java | 72 +++++--------- .../lib/util/MidnightColorUtil.java | 12 ++- .../entity/EmissiveOverlayRenderer.java | 20 ++++ .../assets/midnightlib/lang/de_de.json | 17 +--- .../assets/midnightlib/lang/en_us.json | 13 ++- .../midnightlib/textures/hats/christmas.png | Bin 619 -> 0 bytes .../midnightlib/textures/hats/contributer.png | Bin 649 -> 0 bytes .../midnightlib/textures/hats/donator.png | Bin 319 -> 0 bytes .../midnightlib/textures/hats/empty.png | Bin 139 -> 0 bytes .../midnightlib/textures/hats/friend.png | Bin 319 -> 0 bytes .../midnightlib/textures/hats/motschen.png | Bin 622 -> 0 bytes .../midnightlib/textures/hats/overlay.png | Bin 0 -> 217 bytes .../midnightlib/textures/hats/pride.png | Bin 497 -> 0 bytes .../midnightlib/textures/hats/social.png | Bin 320 -> 0 bytes .../midnightlib/textures/hats/tater.png | Bin 378 -> 0 bytes src/main/resources/fabric.mod.json | 9 +- src/main/resources/midnightcore.mixins.json | 3 +- src/main/resources/midnighthats.mixins.json | 11 --- 35 files changed, 253 insertions(+), 495 deletions(-) create mode 100755 src/main/java/eu/midnightdust/core/MidnightLibServer.java rename src/main/java/eu/midnightdust/{hats/mixin/PlayerEntityRendererMixin.java => core/mixin/MixinPlayerEntityRenderer.java} (63%) delete mode 100755 src/main/java/eu/midnightdust/hats/bunny/BunnyEarsFeatureRenderer.java delete mode 100755 src/main/java/eu/midnightdust/hats/bunny/BunnyEarsModel.java delete mode 100755 src/main/java/eu/midnightdust/hats/christmas/ChristmasHatFeatureRenderer.java delete mode 100755 src/main/java/eu/midnightdust/hats/christmas/ChristmasHatModel.java delete mode 100755 src/main/java/eu/midnightdust/hats/tater/TinyPotatoFeatureRenderer.java delete mode 100755 src/main/java/eu/midnightdust/hats/tater/TinyPotatoModel.java create mode 100644 src/main/java/eu/midnightdust/lib/config/AutoCommand.java create mode 100644 src/main/java/eu/midnightdust/lib/util/render/entity/EmissiveOverlayRenderer.java delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/christmas.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/contributer.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/donator.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/empty.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/friend.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/motschen.png create mode 100644 src/main/resources/assets/midnightlib/textures/hats/overlay.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/pride.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/social.png delete mode 100755 src/main/resources/assets/midnightlib/textures/hats/tater.png delete mode 100755 src/main/resources/midnighthats.mixins.json diff --git a/gradle.properties b/gradle.properties index af52f7c..82f4ad5 100755 --- a/gradle.properties +++ b/gradle.properties @@ -3,16 +3,16 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://fabricmc.net/use - minecraft_version=1.17-pre1 - yarn_mappings=1.17-pre1+build.4 - loader_version=0.11.3 + minecraft_version=1.17.1 + yarn_mappings=1.17.1+build.63 + loader_version=0.11.7 # Mod Properties - mod_version = 0.2.7 + mod_version = 0.2.8 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 + fabric_version=0.41.0+1.17 mod_menu_version = 2.0.2 diff --git a/src/main/java/eu/midnightdust/core/MidnightLibClient.java b/src/main/java/eu/midnightdust/core/MidnightLibClient.java index 7edc302..7121533 100755 --- a/src/main/java/eu/midnightdust/core/MidnightLibClient.java +++ b/src/main/java/eu/midnightdust/core/MidnightLibClient.java @@ -1,44 +1,26 @@ package eu.midnightdust.core; -import eu.midnightdust.hats.bunny.BunnyEarsFeatureRenderer; -import eu.midnightdust.hats.christmas.ChristmasHatFeatureRenderer; import eu.midnightdust.core.config.MidnightLibConfig; -import eu.midnightdust.hats.tater.TinyPotatoFeatureRenderer; import eu.midnightdust.hats.web.HatLoader; import eu.midnightdust.hats.witch.WitchHatFeatureRenderer; import eu.midnightdust.lib.config.MidnightConfig; +import eu.midnightdust.lib.util.MidnightColorUtil; import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.rendereregistry.v1.EntityModelLayerRegistry; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; +import net.fabricmc.fabric.api.client.rendering.v1.EntityModelLayerRegistry; -import java.util.Calendar; - -@SuppressWarnings({"deprecation", "UnstableApiUsage"}) public class MidnightLibClient implements ClientModInitializer { public static final String MOD_ID = "midnightlib"; - public static Event EVENT = Event.NONE; @Override public void onInitializeClient() { MidnightConfig.init("midnightlib", MidnightLibConfig.class); - MidnightConfig.useTooltipForTitle = MidnightLibConfig.titleStyle.equals(MidnightLibConfig.TitleStyle.TOOLTIP); - EntityModelLayerRegistry.registerModelLayer(BunnyEarsFeatureRenderer.RABBIT_EARS_MODEL_LAYER, BunnyEarsFeatureRenderer::getTexturedModelData); - EntityModelLayerRegistry.registerModelLayer(ChristmasHatFeatureRenderer.CHRISTMAS_HAT_MODEL_LAYER, ChristmasHatFeatureRenderer::getTexturedModelData); - EntityModelLayerRegistry.registerModelLayer(TinyPotatoFeatureRenderer.TINY_POTATO_MODEL_LAYER, TinyPotatoFeatureRenderer::getTexturedModelData); EntityModelLayerRegistry.registerModelLayer(WitchHatFeatureRenderer.WITCH_HAT_MODEL_LAYER, WitchHatFeatureRenderer::getTexturedModelData); if (MidnightLibConfig.special_hats) HatLoader.init(); - if (MidnightLibConfig.event_hats) EVENT = getEvent(); - } - private Event getEvent() { - if (Calendar.getInstance().get(Calendar.MONTH) == Calendar.APRIL && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) <= 4) return Event.EASTER; - if (Calendar.getInstance().get(Calendar.MONTH) == Calendar.OCTOBER && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) >= 30) return Event.HALLOWEEN; - if (Calendar.getInstance().get(Calendar.MONTH) == Calendar.DECEMBER && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) == 10) return Event.FABRIC; - if (Calendar.getInstance().get(Calendar.MONTH) == Calendar.DECEMBER && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) >= 23 && Calendar.getInstance().get(Calendar.DAY_OF_MONTH) <= 26) return Event.CHRISTMAS; - return Event.NONE; - } - - public enum Event { - NONE, EASTER, HALLOWEEN, FABRIC, CHRISTMAS + ClientTickEvents.END_CLIENT_TICK.register( + client -> MidnightColorUtil.tick() + ); } } diff --git a/src/main/java/eu/midnightdust/core/MidnightLibServer.java b/src/main/java/eu/midnightdust/core/MidnightLibServer.java new file mode 100755 index 0000000..80dd38f --- /dev/null +++ b/src/main/java/eu/midnightdust/core/MidnightLibServer.java @@ -0,0 +1,20 @@ +package eu.midnightdust.core; + +import eu.midnightdust.lib.config.AutoCommand; +import eu.midnightdust.lib.config.MidnightConfig; +import net.fabricmc.api.DedicatedServerModInitializer; + +import java.lang.reflect.Field; + +public class MidnightLibServer implements DedicatedServerModInitializer { + + @Override + public void onInitializeServer() { + MidnightConfig.configClass.forEach((modid, config) -> { + for (Field field : config.getFields()) { + if (field.isAnnotationPresent(MidnightConfig.Entry.class)) + new AutoCommand(field, modid).register(); + } + }); + } +} diff --git a/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java b/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java index 48e5831..a2971fb 100755 --- a/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java +++ b/src/main/java/eu/midnightdust/core/config/MidnightLibConfig.java @@ -6,18 +6,14 @@ import net.fabricmc.loader.api.FabricLoader; public class MidnightLibConfig extends MidnightConfig { @Comment public static Comment midnightlib_description; @Entry // Enable or disable the MidnightConfig overview screen button - 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; + public static ConfigButton config_screen_list = FabricLoader.getInstance().isModLoaded("modmenu") ? ConfigButton.MODMENU : ConfigButton.TRUE; @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; @Entry // Enable or disable hats for contributors, friends and donors. public static boolean special_hats = true; - public enum TitleStyle { - TEXT,TOOLTIP + public enum ConfigButton { + TRUE,FALSE,MODMENU } } diff --git a/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java b/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java index b7b433e..687a2e6 100755 --- a/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java +++ b/src/main/java/eu/midnightdust/core/mixin/MixinOptionsScreen.java @@ -3,6 +3,7 @@ package eu.midnightdust.core.mixin; import eu.midnightdust.core.config.MidnightLibConfig; import eu.midnightdust.core.screen.MidnightConfigOverviewScreen; import eu.midnightdust.lib.util.screen.TexturedOverlayButtonWidget; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.option.OptionsScreen; import net.minecraft.text.Text; @@ -24,7 +25,7 @@ public class MixinOptionsScreen extends Screen { @Inject(at = @At("HEAD"),method = "init") private void midnightlib$init(CallbackInfo ci) { - if (MidnightLibConfig.config_screen_list) - this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20, 0, 0, 20, MIDNIGHTLIB_ICON_TEXTURE, 32, 64, (buttonWidget) -> Objects.requireNonNull(client).openScreen(new MidnightConfigOverviewScreen(this)), new TranslatableText("narrator.button.midnightlib"))); + if (MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.TRUE) || MidnightLibConfig.config_screen_list.equals(MidnightLibConfig.ConfigButton.MODMENU) && FabricLoader.getInstance().isModLoaded("modmenu")) + this.addDrawableChild(new TexturedOverlayButtonWidget(this.width / 2 + 158, this.height / 6 - 12, 20, 20, 0, 0, 20, MIDNIGHTLIB_ICON_TEXTURE, 32, 64, (buttonWidget) -> Objects.requireNonNull(client).setScreen(new MidnightConfigOverviewScreen(this)), new TranslatableText("midnightlib.overview.title"))); } } diff --git a/src/main/java/eu/midnightdust/hats/mixin/PlayerEntityRendererMixin.java b/src/main/java/eu/midnightdust/core/mixin/MixinPlayerEntityRenderer.java similarity index 63% rename from src/main/java/eu/midnightdust/hats/mixin/PlayerEntityRendererMixin.java rename to src/main/java/eu/midnightdust/core/mixin/MixinPlayerEntityRenderer.java index 7316add..f2f56b3 100755 --- a/src/main/java/eu/midnightdust/hats/mixin/PlayerEntityRendererMixin.java +++ b/src/main/java/eu/midnightdust/core/mixin/MixinPlayerEntityRenderer.java @@ -1,8 +1,5 @@ -package eu.midnightdust.hats.mixin; +package eu.midnightdust.core.mixin; -import eu.midnightdust.hats.bunny.BunnyEarsFeatureRenderer; -import eu.midnightdust.hats.christmas.ChristmasHatFeatureRenderer; -import eu.midnightdust.hats.tater.TinyPotatoFeatureRenderer; import eu.midnightdust.hats.witch.WitchHatFeatureRenderer; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.render.entity.EntityRendererFactory; @@ -15,16 +12,13 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(PlayerEntityRenderer.class) -public abstract class PlayerEntityRendererMixin extends LivingEntityRenderer> { - public PlayerEntityRendererMixin(EntityRendererFactory.Context ctx, PlayerEntityModel model, float shadowSize) { +public abstract class MixinPlayerEntityRenderer extends LivingEntityRenderer> { + public MixinPlayerEntityRenderer(EntityRendererFactory.Context ctx, PlayerEntityModel model, float shadowSize) { super(ctx, model, shadowSize); } @Inject(at = @At("TAIL"), method = "") public void addFeatures(EntityRendererFactory.Context ctx, boolean slim, CallbackInfo ci) { this.addFeature(new WitchHatFeatureRenderer<>(this, ctx.getModelLoader())); - this.addFeature(new ChristmasHatFeatureRenderer<>(this, ctx.getModelLoader())); - this.addFeature(new BunnyEarsFeatureRenderer<>(this, ctx.getModelLoader())); - this.addFeature(new TinyPotatoFeatureRenderer<>(this, ctx.getModelLoader())); } } diff --git a/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java b/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java index 9dff755..119111d 100755 --- a/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java +++ b/src/main/java/eu/midnightdust/core/screen/MidnightConfigOverviewScreen.java @@ -26,16 +26,14 @@ public class MidnightConfigOverviewScreen extends Screen { @Override protected void init() { - this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).openScreen(parent))); + this.addDrawableChild(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, ScreenTexts.DONE, (button) -> Objects.requireNonNull(client).setScreen(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) -> { - Objects.requireNonNull(client).openScreen(MidnightConfig.getScreen(this,modid)); - })); - }); + MidnightConfig.configClass.forEach((modid, configClass) -> + list.addButton(new ButtonWidget(this.width / 2 - 100, this.height - 28, 200, 20, new TranslatableText(modid +".midnightconfig.title"), (button) -> + Objects.requireNonNull(client).setScreen(MidnightConfig.getScreen(this,modid))))); super.init(); } @Override @@ -44,8 +42,8 @@ public class MidnightConfigOverviewScreen extends Screen { this.list.render(matrices, mouseX, mouseY, delta); int stringWidth = title.getString().length() + 47; - if (MidnightConfig.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); super.render(matrices, mouseX, mouseY, delta); } @Environment(EnvType.CLIENT) @@ -85,7 +83,7 @@ public class MidnightConfigOverviewScreen extends Screen { return buttons; } - public List method_37025() { + public List selectableChildren() { return buttons; } } diff --git a/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsFeatureRenderer.java b/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsFeatureRenderer.java deleted file mode 100755 index eaeb4c0..0000000 --- a/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsFeatureRenderer.java +++ /dev/null @@ -1,63 +0,0 @@ -package eu.midnightdust.hats.bunny; - -import eu.midnightdust.core.MidnightLibClient; -import eu.midnightdust.core.config.MidnightLibConfig; -import eu.midnightdust.hats.web.HatLoader; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.TexturedModelData; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -import net.minecraft.client.render.entity.feature.FeatureRenderer; -import net.minecraft.client.render.entity.feature.FeatureRendererContext; -import net.minecraft.client.render.entity.model.*; -import net.minecraft.client.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; - -import java.util.UUID; - -@Environment(EnvType.CLIENT) -public class BunnyEarsFeatureRenderer> extends FeatureRenderer { - private static final String MOD_ID = MidnightLibClient.MOD_ID; - public static final EntityModelLayer RABBIT_EARS_MODEL_LAYER = new EntityModelLayer(new Identifier("midnight-hats","bunny_ears"), "main"); - private static final UUID MOTSCHEN = UUID.fromString("a44c2660-630f-478f-946a-e518669fcf0c"); - - private static final Identifier DEACTIVATED = new Identifier(MOD_ID,"textures/hats/empty.png"); - private static final Identifier RABBIT = new Identifier("textures/entity/rabbit/brown.png"); - private final BunnyEarsModel bunnyEars; - - public BunnyEarsFeatureRenderer(FeatureRendererContext featureRendererContext, EntityModelLoader entityModelLoader) { - super(featureRendererContext); - this.bunnyEars = new BunnyEarsModel<>(entityModelLoader.getModelPart(RABBIT_EARS_MODEL_LAYER)); - } - - public static TexturedModelData getTexturedModelData() { - return TexturedModelData.of(BunnyEarsModel.getModelData(), 64, 32); - } - - public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { - UUID uuid = livingEntity.getUuid(); - Identifier hat_type = getHat(uuid); - - if (!(hat_type == DEACTIVATED) && !HatLoader.PLAYER_HATS.containsKey(uuid) && !uuid.equals(MOTSCHEN)) { - matrixStack.push(); - ((ModelWithHead) this.getContextModel()).getHead().rotate(matrixStack); - VertexConsumer vertexConsumer = ItemRenderer.getArmorGlintConsumer(vertexConsumerProvider, RenderLayer.getEntityCutoutNoCull(hat_type), false, false); - this.bunnyEars.render(matrixStack, vertexConsumer, i, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - matrixStack.pop(); - } - } - private Identifier getHat(UUID uuid) { - if (MidnightLibConfig.event_hats && MidnightLibClient.EVENT.equals(MidnightLibClient.Event.EASTER)) - return RABBIT; - else if (HatLoader.PLAYER_HATS != null && HatLoader.PLAYER_HATS.containsKey(uuid) && HatLoader.PLAYER_HATS.get(uuid).getHatType().contains("bunny")) - return RABBIT; - - return DEACTIVATED; - } - -} diff --git a/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsModel.java b/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsModel.java deleted file mode 100755 index 645564d..0000000 --- a/src/main/java/eu/midnightdust/hats/bunny/BunnyEarsModel.java +++ /dev/null @@ -1,36 +0,0 @@ -package eu.midnightdust.hats.bunny; - -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 BunnyEarsModel extends SinglePartEntityModel { - private final ModelPart right_ear; - - public BunnyEarsModel(ModelPart root) { - this.right_ear = root; - right_ear.setPivot(0.0F, -3.0F, -1.0F); - } - public static ModelData getModelData(){ - ModelData modelData = new ModelData(); - ModelPartData modelPartData = modelData.getRoot(); - modelPartData.addChild("right_ear", ModelPartBuilder.create().uv(52, 0).cuboid(-2.5F, -9.0F, -1.0F, 2.0F, 5.0F, 1.0F), ModelTransform.NONE); - modelPartData.addChild("left_ear", ModelPartBuilder.create().uv(58, 0).mirrored().cuboid(0.5F, -9.0F, -1.0F, 2.0F, 5.0F, 1.0F), ModelTransform.NONE); - return modelData; - } - - public ModelPart getPart() { - return this.right_ear; - } - - @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){ - right_ear.render(matrixStack, buffer, packedLight, packedOverlay); - } -} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatFeatureRenderer.java b/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatFeatureRenderer.java deleted file mode 100755 index 0872a9f..0000000 --- a/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatFeatureRenderer.java +++ /dev/null @@ -1,64 +0,0 @@ -package eu.midnightdust.hats.christmas; - -import eu.midnightdust.core.MidnightLibClient; -import eu.midnightdust.core.config.MidnightLibConfig; -import eu.midnightdust.hats.web.HatLoader; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.TexturedModelData; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -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.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; - -import java.util.UUID; - -@Environment(EnvType.CLIENT) -public class ChristmasHatFeatureRenderer> extends FeatureRenderer { - private static final String MOD_ID = MidnightLibClient.MOD_ID; - public static final EntityModelLayer CHRISTMAS_HAT_MODEL_LAYER = new EntityModelLayer(new Identifier("midnight-hats","christmas_hat"), "main"); - private static final UUID MOTSCHEN = UUID.fromString("a44c2660-630f-478f-946a-e518669fcf0c"); - - private static final Identifier DEACTIVATED = new Identifier(MOD_ID,"textures/hats/empty.png"); - private static final Identifier CHRISTMAS = new Identifier(MOD_ID,"textures/hats/christmas.png"); - private final ChristmasHatModel christmasHat; - - public ChristmasHatFeatureRenderer(FeatureRendererContext featureRendererContext, EntityModelLoader entityModelLoader) { - super(featureRendererContext); - this.christmasHat = new ChristmasHatModel<>(entityModelLoader.getModelPart(CHRISTMAS_HAT_MODEL_LAYER)); - } - - public static TexturedModelData getTexturedModelData() { - return TexturedModelData.of(ChristmasHatModel.getModelData(), 64, 64); - } - - public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { - UUID uuid = livingEntity.getUuid(); - Identifier hat_type = getHat(); - - if (!(hat_type == DEACTIVATED) && !HatLoader.PLAYER_HATS.containsKey(uuid) && !uuid.equals(MOTSCHEN)) { - matrixStack.push(); - - ((ModelWithHead) this.getContextModel()).getHead().rotate(matrixStack); - VertexConsumer vertexConsumer = ItemRenderer.getArmorGlintConsumer(vertexConsumerProvider, RenderLayer.getEntityCutoutNoCull(hat_type), false, false); - this.christmasHat.render(matrixStack, vertexConsumer, i, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - - matrixStack.pop(); - } - } - private Identifier getHat() { - if (MidnightLibConfig.event_hats && MidnightLibClient.EVENT.equals(MidnightLibClient.Event.CHRISTMAS)) - return CHRISTMAS; - return DEACTIVATED; - } -} diff --git a/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatModel.java b/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatModel.java deleted file mode 100755 index 6afc7ec..0000000 --- a/src/main/java/eu/midnightdust/hats/christmas/ChristmasHatModel.java +++ /dev/null @@ -1,56 +0,0 @@ -package eu.midnightdust.hats.christmas; - -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 ChristmasHatModel extends SinglePartEntityModel { - private final ModelPart headwear; - - public ChristmasHatModel(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, 0).cuboid(-10.0F, -0.1F, 0.0F, 10.0F, 2.0F, 10.0F), ModelTransform.NONE); - ModelPartData modelPartData2 = modelPartData.addChild("bone", ModelPartBuilder.create().uv(0, 12).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, 23).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(21, 12).cuboid(0.0F, -3.0F, 0.0F, 3.0F, 3.0F, 3.0F), ModelTransform.rotation(-0.2618F, 0.0F, 0.1047F)); - - return modelData; - } - public ModelPart getPart() { - return this.headwear; - } - - @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); - } - - public void setRotationAngle(ModelPart bone, float x, float y, float z) { - bone.pitch = x; - bone.yaw = y; - bone.roll = z; - } -} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/hats/tater/TinyPotatoFeatureRenderer.java b/src/main/java/eu/midnightdust/hats/tater/TinyPotatoFeatureRenderer.java deleted file mode 100755 index 1311b6c..0000000 --- a/src/main/java/eu/midnightdust/hats/tater/TinyPotatoFeatureRenderer.java +++ /dev/null @@ -1,66 +0,0 @@ -package eu.midnightdust.hats.tater; - -import eu.midnightdust.core.MidnightLibClient; -import eu.midnightdust.core.config.MidnightLibConfig; -import eu.midnightdust.hats.web.HatLoader; -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.client.model.TexturedModelData; -import net.minecraft.client.render.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; -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.render.item.ItemRenderer; -import net.minecraft.client.util.math.MatrixStack; -import net.minecraft.entity.LivingEntity; -import net.minecraft.util.Identifier; - -import java.util.UUID; - -@Environment(EnvType.CLIENT) -public class TinyPotatoFeatureRenderer> extends FeatureRenderer { - private static final String MOD_ID = MidnightLibClient.MOD_ID; - public static final EntityModelLayer TINY_POTATO_MODEL_LAYER = new EntityModelLayer(new Identifier("midnight-hats","tiny_potato"), "main"); - private static final UUID MOTSCHEN = UUID.fromString("a44c2660-630f-478f-946a-e518669fcf0c"); - - private static final Identifier DEACTIVATED = new Identifier(MOD_ID,"textures/hats/empty.png"); - private static final Identifier TATER = new Identifier(MOD_ID,"textures/hats/tater.png"); - private final TinyPotatoModel tinyPotato; - - public TinyPotatoFeatureRenderer(FeatureRendererContext featureRendererContext, EntityModelLoader entityModelLoader) { - super(featureRendererContext); - this.tinyPotato = new TinyPotatoModel<>(entityModelLoader.getModelPart(TINY_POTATO_MODEL_LAYER)); - } - - public static TexturedModelData getTexturedModelData() { - return TexturedModelData.of(TinyPotatoModel.getModelData(), 16, 16); - } - - public void render(MatrixStack matrixStack, VertexConsumerProvider vertexConsumerProvider, int i, T livingEntity, float f, float g, float h, float j, float k, float l) { - UUID uuid = livingEntity.getUuid(); - Identifier hat_type = getHat(uuid); - - if (!(hat_type == DEACTIVATED) && !HatLoader.PLAYER_HATS.containsKey(uuid) && !uuid.equals(MOTSCHEN)) { - matrixStack.push(); - - ((ModelWithHead) this.getContextModel()).getHead().rotate(matrixStack); - VertexConsumer vertexConsumer = ItemRenderer.getArmorGlintConsumer(vertexConsumerProvider, RenderLayer.getEntityCutoutNoCull(hat_type), false, false); - this.tinyPotato.render(matrixStack, vertexConsumer, i, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); - - matrixStack.pop(); - } - } - private Identifier getHat(UUID uuid) { - if (MidnightLibConfig.event_hats && MidnightLibClient.EVENT.equals(MidnightLibClient.Event.FABRIC)) - return TATER; - else if (HatLoader.PLAYER_HATS != null && HatLoader.PLAYER_HATS.containsKey(uuid) && HatLoader.PLAYER_HATS.get(uuid).getHatType().contains("tater")) - return TATER; - return DEACTIVATED; - } -} diff --git a/src/main/java/eu/midnightdust/hats/tater/TinyPotatoModel.java b/src/main/java/eu/midnightdust/hats/tater/TinyPotatoModel.java deleted file mode 100755 index ac623bd..0000000 --- a/src/main/java/eu/midnightdust/hats/tater/TinyPotatoModel.java +++ /dev/null @@ -1,36 +0,0 @@ -package eu.midnightdust.hats.tater; - -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 TinyPotatoModel extends SinglePartEntityModel { - private final ModelPart tater; - public TinyPotatoModel(ModelPart root) { - tater = root; - tater.setPivot(0.0F, -8.0F, 0.0F); - } - - public static ModelData getModelData() { - ModelData modelData = new ModelData(); - ModelPartData modelPartData = modelData.getRoot(); - modelPartData.addChild("tater", ModelPartBuilder.create().uv(0, 0).cuboid(-2.0F, -6.0F, -2.0F, 4.0F, 6.0F, 4.0F), ModelTransform.NONE); - - return modelData; - } - public ModelPart getPart() { - return this.tater; - } - - @Override - public void setAngles(T entity, float limbSwing, float limbSwingAmount, float ageInTicks, float netHeadYaw, float headPitch){ - //previously the render function, render code was moved to a method below - } - @Override - public void render(MatrixStack matrixStack, VertexConsumer buffer, int packedLight, int packedOverlay, float red, float green, float blue, float alpha){ - - tater.render(matrixStack, buffer, packedLight, packedOverlay); - } -} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/hats/web/HatLoader.java b/src/main/java/eu/midnightdust/hats/web/HatLoader.java index d4f6359..38e8eea 100755 --- a/src/main/java/eu/midnightdust/hats/web/HatLoader.java +++ b/src/main/java/eu/midnightdust/hats/web/HatLoader.java @@ -42,7 +42,7 @@ public class HatLoader { logger.log(Level.INFO, "Player hats successfully loaded!"); } else { PLAYER_HATS = Collections.emptyMap(); - logger.log(Level.WARN, "A problem with the database occured, the hats could not be initialized."); + logger.log(Level.WARN, "A problem with the database occurred, the hats could not be initialized."); } }, MinecraftClient.getInstance()); } diff --git a/src/main/java/eu/midnightdust/hats/witch/WitchHatFeatureRenderer.java b/src/main/java/eu/midnightdust/hats/witch/WitchHatFeatureRenderer.java index 463f885..9361e5e 100755 --- a/src/main/java/eu/midnightdust/hats/witch/WitchHatFeatureRenderer.java +++ b/src/main/java/eu/midnightdust/hats/witch/WitchHatFeatureRenderer.java @@ -1,43 +1,42 @@ package eu.midnightdust.hats.witch; -import eu.midnightdust.core.MidnightLibClient; -import eu.midnightdust.core.config.MidnightLibConfig; 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.OverlayTexture; -import net.minecraft.client.render.RenderLayer; -import net.minecraft.client.render.VertexConsumer; -import net.minecraft.client.render.VertexConsumerProvider; +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.render.item.ItemRenderer; 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> extends FeatureRenderer { - private static final String MOD_ID = MidnightLibClient.MOD_ID; 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 DEACTIVATED = new Identifier(MOD_ID,"textures/hats/empty.png"); private static final Identifier WITCH = new Identifier("textures/entity/witch.png"); - private static final Identifier MOTSCHEN_SKIN = new Identifier(MOD_ID,"textures/hats/motschen.png"); - private static final Identifier CONTRIBUTER_SKIN = new Identifier(MOD_ID,"textures/hats/contributer.png"); - private static final Identifier FRIEND_SKIN = new Identifier(MOD_ID,"textures/hats/friend.png"); - private static final Identifier DONATOR_SKIN = new Identifier(MOD_ID,"textures/hats/donator.png"); - private static final Identifier SOCIAL_SKIN = new Identifier(MOD_ID,"textures/hats/social.png"); - private static final Identifier PRIDE_SKIN = new Identifier(MOD_ID,"textures/hats/pride.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 witchHat; + private final MinecraftClient client = MinecraftClient.getInstance(); public WitchHatFeatureRenderer(FeatureRendererContext featureRendererContext, EntityModelLoader entityModelLoader) { super(featureRendererContext); @@ -49,32 +48,36 @@ public class WitchHatFeatureRenderer extends SinglePartEntityModel @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); -} + headwear.render(matrixStack, buffer, packedLight, packedOverlay, red, green, blue, alpha); + } @Override public ModelPart getPart() { @@ -57,6 +55,5 @@ public class WitchHatModel extends SinglePartEntityModel bone.pitch = x; bone.yaw = y; bone.roll = z; -} - - } \ No newline at end of file + } +} \ No newline at end of file diff --git a/src/main/java/eu/midnightdust/lib/config/AutoCommand.java b/src/main/java/eu/midnightdust/lib/config/AutoCommand.java new file mode 100644 index 0000000..ba7f71f --- /dev/null +++ b/src/main/java/eu/midnightdust/lib/config/AutoCommand.java @@ -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 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 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; + } +} diff --git a/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java b/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java index a1baeeb..3b69531 100755 --- a/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java +++ b/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java @@ -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 method_37025() { + public List selectableChildren() { return buttonsWithResetButtons; } } diff --git a/src/main/java/eu/midnightdust/lib/util/MidnightColorUtil.java b/src/main/java/eu/midnightdust/lib/util/MidnightColorUtil.java index d687664..a750a03 100755 --- a/src/main/java/eu/midnightdust/lib/util/MidnightColorUtil.java +++ b/src/main/java/eu/midnightdust/lib/util/MidnightColorUtil.java @@ -1,8 +1,14 @@ package eu.midnightdust.lib.util; -import java.awt.*; +import java.awt.Color; public class MidnightColorUtil { + public static float hue; + public static void tick() { + if (hue > 1) hue = 0f; + hue = hue + 0.01f; + } + /** * @credit https://stackoverflow.com/questions/4129666/how-to-convert-hex-to-rgb-using-java * @param colorStr e.g. "FFFFFF" @@ -14,4 +20,8 @@ public class MidnightColorUtil { Integer.valueOf( colorStr.substring( 2, 4 ), 16 ), Integer.valueOf( colorStr.substring( 4, 6 ), 16 )); } + + public static Color radialRainbow(float saturation, float brightness) { + return Color.getHSBColor(hue, saturation, brightness); + } } diff --git a/src/main/java/eu/midnightdust/lib/util/render/entity/EmissiveOverlayRenderer.java b/src/main/java/eu/midnightdust/lib/util/render/entity/EmissiveOverlayRenderer.java new file mode 100644 index 0000000..7446e8b --- /dev/null +++ b/src/main/java/eu/midnightdust/lib/util/render/entity/EmissiveOverlayRenderer.java @@ -0,0 +1,20 @@ +package eu.midnightdust.lib.util.render.entity; + +import net.minecraft.client.render.RenderLayer; +import net.minecraft.client.render.entity.feature.EyesFeatureRenderer; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.entity.LivingEntity; +import net.minecraft.util.Identifier; + +public class EmissiveOverlayRenderer extends EyesFeatureRenderer> { + private final RenderLayer SKIN; + + public EmissiveOverlayRenderer(FeatureRendererContext> featureRendererContext, Identifier texture) { + super(featureRendererContext); + SKIN = RenderLayer.getEyes(texture); + } + public RenderLayer getEyesTexture() { + return SKIN; + } +} \ No newline at end of file diff --git a/src/main/resources/assets/midnightlib/lang/de_de.json b/src/main/resources/assets/midnightlib/lang/de_de.json index 6b1b3ec..13a1ce4 100755 --- a/src/main/resources/assets/midnightlib/lang/de_de.json +++ b/src/main/resources/assets/midnightlib/lang/de_de.json @@ -2,17 +2,10 @@ "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.background_texture":"Textur der Konfigurationsbildschirmhintergründe", - "midnightlib.midnightconfig.titleStyle.tooltip":"§cBenötigt Neustart!", - "midnightlib.midnightconfig.enum.TitleStyle.TEXT":"Text", - "midnightlib.midnightconfig.enum.TitleStyle.TOOLTIP":"Tooltip", + "midnightlib.midnightconfig.config_screen_list":"Konfigurationsübersicht", + "midnightlib.midnightconfig.background_texture":"Textur der Konfigurationsbildschirme", "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." + "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." } \ No newline at end of file diff --git a/src/main/resources/assets/midnightlib/lang/en_us.json b/src/main/resources/assets/midnightlib/lang/en_us.json index 67f4346..e25b876 100755 --- a/src/main/resources/assets/midnightlib/lang/en_us.json +++ b/src/main/resources/assets/midnightlib/lang/en_us.json @@ -3,16 +3,15 @@ "midnightlib.midnightconfig.title":"MidnightLib Config", "midnightlib.midnightconfig.midnightlib_description":"§nMidnightLib", "midnightlib.midnightconfig.config_screen_list":"Enable Config Screen List", - "midnightlib.midnightconfig.titleStyle":"Style of config screen titles", - "midnightlib.midnightconfig.titleStyle.tooltip":"§cRequires restart!", - "midnightlib.midnightconfig.enum.TitleStyle.TEXT":"Text", - "midnightlib.midnightconfig.enum.TitleStyle.TOOLTIP":"Tooltip", + "midnightlib.midnightconfig.enum.ConfigButton.TRUE":"§aTrue", + "midnightlib.midnightconfig.enum.ConfigButton.FALSE":"§cFalse", + "midnightlib.midnightconfig.enum.ConfigButton.MODMENU":"§bModMenu", "midnightlib.midnightconfig.background_texture":"Texture of config screen backgrounds", "midnightlib.midnightconfig.midnighthats_description":"§nMidnightHats", - "midnightlib.midnightconfig.event_hats":"Enable Event Hats", - "midnightlib.midnightconfig.special_hats":"Enable Special Hats", + "midnightlib.midnightconfig.special_hats":"Enable Supporter Hats", "midnightlib.modrinth":"Modrinth", "midnightlib.curseforge":"CurseForge", - "modmenu.descriptionTranslation.midnightlib": "Common Library for Team MidnightDust's mods.\nProvides a config api, common utils, and cosmetics.", + "midnightlib.wiki":"Wiki", + "modmenu.descriptionTranslation.midnightlib": "Common Library for Team MidnightDust's mods.\nProvides a config api, automatic integration with other mods, common utils, and cosmetics.", "modmenu.summaryTranslation.midnightlib": "Common Library for Team MidnightDust's mods." } \ No newline at end of file diff --git a/src/main/resources/assets/midnightlib/textures/hats/christmas.png b/src/main/resources/assets/midnightlib/textures/hats/christmas.png deleted file mode 100755 index 7e092c3f7c24a1d2d7686f1663ff0859b86cf822..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 619 zcmV-x0+juUP)Px#32;bRa{vGi!vFvd!vV){sAK>D07y_wR7FQ{Oy1(- z@bdDIARv|^A^!gUrzs+vBq93y`>ZP@xHK%FCLyILBIW4m;pOG?^!3);-0AG>?CoCkp3~bp_rADDp!k$LH(=R8%QG#0 zCpy0;-*mTKsaEp%#6Jqu;oHdGrmX!K-GAbL8w8>=M+k=jJRmGXR~7dIK;Wz9Kn!u) zXhnKeArNrn+_||(gn077cNO;qek=r*!uKkq79v7$?^Q@GaEt`+RooOHK%#&fafB{N z_U{_m83O?h=MICoT~Pu!x+QRp%>IF|8USPwpvat0ZV6l?2Mn~u_3r?PWDG{&eYlt2 z+sKi>#9^}L+K2m5h(`VmqLF{iK|1oEIXDLZ@gFZ6Lnprh7u>c*c@8d~t4K8K5h2NQ zIM09-B3B2zk_hq!fOvW6e3rAq`KV-+RNN_c={F5RWYnP%x}H_9vr?x^@V^7)DbV2M#XNb+By)>!&p@6E#>XXJkE zy*Ro4Le^HVt;|OGjjw{PX1$Nz7JGa9?}JNi!`|&_Tezk2pzMOw-K@+0%{NPWahBrzJVdtKzJfC)~MXxna*9 zqw8x0R;_e4$P@pqn{zXyu1#*)Lw6SxuwzCoQ|p4w@3%I)8v>ILgQu&X%Q~loCIG>K B8&?1T diff --git a/src/main/resources/assets/midnightlib/textures/hats/donator.png b/src/main/resources/assets/midnightlib/textures/hats/donator.png deleted file mode 100755 index ec5288356bfa6321ca499b60c89af18f3c6eb620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!VDxm*B3g{;Jo1xvC;eQT;u{`IJBm6*(42&f~e!&b5&u*jvInzB|977@wzn!v|v%x^Xt<^_B zB)hO#V1sx*tGnQwBa%6H0~VWkz2loAa_ajmlYaf3@{>}5+87x8KQvk$;Jg+USl}|H zJ}%(&6sf1mF)Y##<&ygTbjeQD{3gWGxWZd^MZUo58{F|b_~tlSaysodJm*}0K*eM- zH+$geo=I~*?bQ7l?YL8Em&(RgPmLK~f2BkmIoKKg%o07Tp;xm`;k+`)DoiJqPme(+mIV0)GdMiEkp|>U_jGX#i8%ar%3jU}0|B>I9|4i< z!e)UD;`yxZf^&}C)0OdGZ07ZjZ;HsN@3Tz$^>@loN(E|TVDSIYXmx<|T2x?x%ar=K zfYVc?o+`(%NI#TI>ig3rJ5}?W5KH3;6$H|h@X}_VKbNvAolgZrd zfv0;W&Hc1f_h+=@PNiKc8(Td!W_bOT5^>~UXZSNq^dyH~O&<4#_aLi0UHx3vIVCg! E01#tjasU7T diff --git a/src/main/resources/assets/midnightlib/textures/hats/motschen.png b/src/main/resources/assets/midnightlib/textures/hats/motschen.png deleted file mode 100755 index cf60fd037b862532414596d664853b47f699e432..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 622 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A#nDaPU;cPEB*=VV?2IV|apzK#qG z8~eHcB(eheoCO|{#S9F52SJ!|$HeTn3=B-no-U3d6>)FxZ1g&uAkq5JzA2(z$xkoH zJT}Jlg<4$m_QwxuJEITYJ(|ZRxT@KseVawdV)u(uvyTX!x&PTtz^}Ra+l-pOXA+F& z`ZaGBU8>6!aBC3*ohYv9f{JQ>Wbh@X!1IuK3qeCzV*u zbrYYkEORfbM)BF*R?qIf_T9Pvw8k99n-{8g)c>$ay7&9Dh}eX;KjY8NJKpE&k-2(9 zL)q@N;qTMVC#V0{45;F-xFyxndvMyhf9u|z|GLWSY{SKa3M%T8x5t=yZofUZnsrV7 z`qs~zy9K_*`LA=fu(Rb_eEZ~Y@&601zczivrLl)~lYNQY_xwYjAF8a0Ti1Ga_1vJ- z0r&Pz;JvWyE|Y!TjGG6|t=}X`6{J2n*YL)CPmcEc{D_t*_mBLWu(+#LzT?W@1B>#w z?FBM#g{<$AT<~Su*~YNlTQ95?SS{~t@NHq()lK#Mm>6JSPs;};6|ZgXFQR(0 OL1Lb+elF{r5}E+;OBwM1 diff --git a/src/main/resources/assets/midnightlib/textures/hats/overlay.png b/src/main/resources/assets/midnightlib/textures/hats/overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..469e49aa95e53b4688fc69bf64514619dd533daa GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!3HFEH|A#nDYhhUcNZWH1V5d3*8?fe0*}aI z1_r)^Ak4U9V)k30V5O&vV@SoVw^tSl9ySnQaj@j|^fCRxE%uwwNhE8Q-4ijN#cv)d zoBuCf3Ni^D9GDlCoqarRz52qAi075lIwI=Jf8P5&b>{2Owd>Es?ERj-yzcmA{uNuN jS*A-S%dj!R^*><0b7Gg2sKRM^H;|a8tDnm{r-UW|4o^b3 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/midnightlib/textures/hats/pride.png b/src/main/resources/assets/midnightlib/textures/hats/pride.png deleted file mode 100755 index 4058af7b7f4df2dcf7db76831ca447a028e00d4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 497 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!VDxm*B3slu#P*69(C&bmgz=y&2e<@qrzqbqw)k=kIO+TJ6 zF!+6EXi&>%tN+!?@V}dZ!TbFqCYHNQtm%zcj)06V3GxeOaCmkj4aj!zba4!cIQ({s zV%}i`kv45tsX1Q)JSM6(CwW^oHWsQhCwM<|Q)FdkJUEf5hV?rex0cpN(U`YPFD1Vj zZPPtJ)$KXIibDLq|2G3`EJV0kofZaY{9$D%xR7;BLh(vL>4Bd|tepxN_CAiv)_TZu zac5?#y`%xlO+4tJn>sp`8>n-{=w#t^O7&0pRh_WN#?lur{K^96LcTFy#EThEAKvxgfezSGuh5zymy;(DJL%%q!>udk@Qr_RPw lO73Ongdj_M?$-Y&)eB_H|0w_GHUI`JgQu&X%Q~loCIGX%z8?Sp diff --git a/src/main/resources/assets/midnightlib/textures/hats/social.png b/src/main/resources/assets/midnightlib/textures/hats/social.png deleted file mode 100755 index b0a052b92528b8ffd183e6cc0dd7d960d5b719b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320 zcmeAS@N?(olHy`uVBq!ia0vp^4nW+%!VDxm*B3*t=|en*@r>yqhTRQ& z8{8YayN%b13Y0L%#W&dQ6A0&U5bfCdFi?PtWvaEevm!$~XIgHX!l|Q21>Hj)^`vHG z2`&p^WYpfECX~b3*2XnMltYY{MdX2D4cHB97#Wm{_2Lxw8)gFC$l&Sf=d#Wzp$PyW CGh1{3 diff --git a/src/main/resources/assets/midnightlib/textures/hats/tater.png b/src/main/resources/assets/midnightlib/textures/hats/tater.png deleted file mode 100755 index 169af8f150849fa23452891686a6dce155793a1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfvmUKs7M+SzC{oH>NS%G}U;vjb? zhIQv;UIICs1s;*b3=DjSL74G){)!Z!ph197h^u>n&#h?_UM*X2p{ETfc4b1>jmdov z=T5&jYs#g*jwcIdJ)S@F-Kr%Y*Dm)pH~qG0jlkbWMj+Emg8YIR9G=}s19Faex;Tbt zoKH?*U`p0VXkbh>HcS?9<4DO=Z8mUncrn?4<8fePB3qm838rJg&g#m^Y?oaQhNPSk zxUp}q;fJ65+zfb+@JMz~2~$XBE1YZn>ckAksPF5yeYstKD?zG5QR~Y+g^+|9jK;Eg z+-=qdFnG7&KmG7%9m5)LNJ0#+LgHf-3y5Sg%yxtV)c1G5Kr7Xx<}ml*qm zN*z7{#sv#!Fl0#Ih+*&0n_#ygkWZmGQbEgsNiRWAJVlg`L)2ll026~%aMtlUcdHtp Pj~F~%{an^LB{Ts5h1G#6 diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index f80b4a1..6219587 100755 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,13 +23,15 @@ "client": [ "eu.midnightdust.core.MidnightLibClient" ], + "server": [ + "eu.midnightdust.core.MidnightLibServer" + ], "modmenu": [ "eu.midnightdust.lib.config.AutoModMenu" ] }, "mixins": [ - "midnighthats.mixins.json", "midnightcore.mixins.json" ], @@ -41,7 +43,10 @@ "modmenu": { "links": { "modmenu.discord": "https://discord.midnightdust.eu/", - "modmenu.website": "https://www.midnightdust.eu/" + "modmenu.website": "https://www.midnightdust.eu/", + "midnightlib.curseforge": "https://www.curseforge.com/minecraft/mc-mods/midnightlib", + "midnightlib.modrinth": "https://modrinth.com/mod/midnightlib", + "midnightlib.wiki": "https://github.com/TeamMidnightDust/MidnightLib/wiki" }, "badges": [ "library" ] } diff --git a/src/main/resources/midnightcore.mixins.json b/src/main/resources/midnightcore.mixins.json index 49a5a32..15cf298 100755 --- a/src/main/resources/midnightcore.mixins.json +++ b/src/main/resources/midnightcore.mixins.json @@ -4,7 +4,8 @@ "compatibilityLevel": "JAVA_16", "client": [ "MixinOptionsScreen", - "MixinEntryListWidget" + "MixinEntryListWidget", + "MixinPlayerEntityRenderer" ], "injectors": { "defaultRequire": 1 diff --git a/src/main/resources/midnighthats.mixins.json b/src/main/resources/midnighthats.mixins.json deleted file mode 100755 index 5300b4f..0000000 --- a/src/main/resources/midnighthats.mixins.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "required": true, - "package": "eu.midnightdust.hats.mixin", - "compatibilityLevel": "JAVA_16", - "client": [ - "PlayerEntityRendererMixin" - ], - "injectors": { - "defaultRequire": 1 - } -} \ No newline at end of file