From da4f52561e4b8b4ec16889c1b273fd808bf46a33 Mon Sep 17 00:00:00 2001 From: Motschen Date: Thu, 30 Dec 2021 17:31:10 +0100 Subject: [PATCH] Add emissive textures module, Try to fix puzzle-splashscreen --- .../puzzlemc/core/config/PuzzleConfig.java | 2 +- puzzle-emissives/build.gradle | 5 ++ .../emissives/PuzzleEmissiveTextures.java | 60 ++++++++++++++++++ .../mixin/MixinLivingEntityRenderer.java | 37 +++++++++++ .../src/main/resources/assets/puzzle/icon.png | Bin 0 -> 2387 bytes .../src/main/resources/fabric.mod.json | 40 ++++++++++++ .../resources/puzzle-emissives.mixins.json | 11 ++++ .../java/net/puzzlemc/gui/PuzzleClient.java | 10 ++- .../splashscreen/mixin/MixinSplashScreen.java | 5 ++ settings.gradle | 1 + 10 files changed, 167 insertions(+), 4 deletions(-) create mode 100755 puzzle-emissives/build.gradle create mode 100755 puzzle-emissives/src/main/java/net/puzzlemc/emissives/PuzzleEmissiveTextures.java create mode 100755 puzzle-emissives/src/main/java/net/puzzlemc/emissives/mixin/MixinLivingEntityRenderer.java create mode 100644 puzzle-emissives/src/main/resources/assets/puzzle/icon.png create mode 100755 puzzle-emissives/src/main/resources/fabric.mod.json create mode 100755 puzzle-emissives/src/main/resources/puzzle-emissives.mixins.json diff --git a/puzzle-base/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java b/puzzle-base/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java index ea837ee..9db7d02 100755 --- a/puzzle-base/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java +++ b/puzzle-base/src/main/java/net/puzzlemc/core/config/PuzzleConfig.java @@ -6,7 +6,7 @@ public class PuzzleConfig extends MidnightConfigLite { @Entry public static boolean checkUpdates = true; @Entry public static boolean showPuzzleInfo = true; @Entry public static boolean resourcepackSplashScreen = true; - @Entry public static boolean randomEntityTextures = true; + @Entry public static boolean emissiveTextures = true; @Entry public static boolean customRenderLayers = true; @Entry public static boolean unlimitedRotations = true; @Entry public static boolean biggerModels = true; diff --git a/puzzle-emissives/build.gradle b/puzzle-emissives/build.gradle new file mode 100755 index 0000000..a7cc7bc --- /dev/null +++ b/puzzle-emissives/build.gradle @@ -0,0 +1,5 @@ +archivesBaseName = "puzzle-emissives" + +dependencies { + api project(":puzzle-base") +} diff --git a/puzzle-emissives/src/main/java/net/puzzlemc/emissives/PuzzleEmissiveTextures.java b/puzzle-emissives/src/main/java/net/puzzlemc/emissives/PuzzleEmissiveTextures.java new file mode 100755 index 0000000..a7c1677 --- /dev/null +++ b/puzzle-emissives/src/main/java/net/puzzlemc/emissives/PuzzleEmissiveTextures.java @@ -0,0 +1,60 @@ +package net.puzzlemc.emissives; + +import net.fabricmc.api.ClientModInitializer; +import net.puzzlemc.core.config.PuzzleConfig; +import net.fabricmc.fabric.api.resource.ResourceManagerHelper; +import net.fabricmc.fabric.api.resource.SimpleSynchronousResourceReloadListener; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.ResourceType; +import net.minecraft.util.Identifier; +import org.apache.logging.log4j.LogManager; + +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +public class PuzzleEmissiveTextures implements ClientModInitializer { + public static final Map emissiveTextures = new HashMap<>(); + + public void onInitializeClient() { + ResourceManagerHelper.get(ResourceType.CLIENT_RESOURCES).registerReloadListener(new SimpleSynchronousResourceReloadListener() { + @Override + public Identifier getFabricId() { + return new Identifier("puzzle", "emissive_textures"); + } + + @Override + public void reload(ResourceManager manager) { + if (PuzzleConfig.emissiveTextures) { + String suffix = "_e"; + + for (Identifier id : manager.findResources("optifine", path -> path.contains("emissive.properties"))) { + try (InputStream stream = manager.getResource(id).getInputStream()) { + Properties properties = new Properties(); + properties.load(stream); + + if (properties.get("suffix.emissive") != null) { + suffix = properties.get("suffix.emissive").toString(); + } + } catch (Exception e) { + LogManager.getLogger("Puzzle").error("Error occurred while loading emissive.properties " + id.toString(), e); + } + String finalSuffix = suffix; + for (Identifier emissiveId : manager.findResources("textures", path -> path.endsWith(finalSuffix + ".png"))) { + try { + String normalTexture = emissiveId.toString(); + normalTexture = normalTexture.substring(0, normalTexture.lastIndexOf(finalSuffix)); + Identifier normalId = Identifier.tryParse(normalTexture + ".png"); + emissiveTextures.put(normalId, emissiveId); + if (PuzzleConfig.debugMessages) LogManager.getLogger("Puzzle").info(normalId + " " + emissiveId); + } catch (Exception e) { + LogManager.getLogger("Puzzle").error("Error occurred while loading emissive texture " + emissiveId.toString(), e); + } + } + } + } + } + }); + } +} diff --git a/puzzle-emissives/src/main/java/net/puzzlemc/emissives/mixin/MixinLivingEntityRenderer.java b/puzzle-emissives/src/main/java/net/puzzlemc/emissives/mixin/MixinLivingEntityRenderer.java new file mode 100755 index 0000000..6996eb6 --- /dev/null +++ b/puzzle-emissives/src/main/java/net/puzzlemc/emissives/mixin/MixinLivingEntityRenderer.java @@ -0,0 +1,37 @@ +package net.puzzlemc.emissives.mixin; + +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.*; +import net.minecraft.client.render.entity.feature.FeatureRendererContext; +import net.minecraft.client.render.entity.model.EntityModel; +import net.minecraft.client.util.math.MatrixStack; +import net.minecraft.entity.LivingEntity; +import net.puzzlemc.core.config.PuzzleConfig; +import net.puzzlemc.emissives.PuzzleEmissiveTextures; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = LivingEntityRenderer.class) +public abstract class MixinLivingEntityRenderer> extends EntityRenderer implements FeatureRendererContext { + + @Shadow public abstract M getModel(); + + protected MixinLivingEntityRenderer(EntityRendererFactory.Context ctx) { + super(ctx); + } + + @Inject(at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/EntityModel;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;IIFFFF)V", shift = At.Shift.AFTER), method = "render*") + private void onRender(T entity, float yaw, float tickDelta, MatrixStack matrices, VertexConsumerProvider vertexConsumers, int light, CallbackInfo ci) { + if (PuzzleConfig.emissiveTextures && PuzzleEmissiveTextures.emissiveTextures.containsKey(this.getTexture(entity))) { + VertexConsumer vertexConsumer = vertexConsumers.getBuffer(RenderLayer.getBeaconBeam(PuzzleEmissiveTextures.emissiveTextures.get(this.getTexture(entity)),true)); + + this.getModel().render(matrices, vertexConsumer, 15728640, OverlayTexture.DEFAULT_UV, 1.0F, 1.0F, 1.0F, 1.0F); + } + } +} diff --git a/puzzle-emissives/src/main/resources/assets/puzzle/icon.png b/puzzle-emissives/src/main/resources/assets/puzzle/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0050c65296e5f22a25407a433cd2679b1c85c244 GIT binary patch literal 2387 zcmY*bXH=8h68%Ca3PC{HqZjF&t5S?yiWC(hy<-9wt{_B0APPto5Tz*>rHY73v(Te- zp8jAt z21rzR`LdN900_-F+5PEpx#CBq|3wd?;$TYR{t-wbI0uJ%1g}3m58fU9!Tr zeO@n}tgYPz8V0zbfwO`>!dxvE?=6s*^DpxJE}*N;W&6Innp!Lsd3E>uHNwgddHs5-gQF9 z9ip_~9E!riHH*l14NVj0`Rb9qD#t9l)-1eB2xX&62hz!?U7Ur*-7voXoDP?LoPXSB2NtV(G0L}`sfOh)9)j9(c<WQUI&O`A;c-d z8U-nq_dt!Bl|`ep3KoX+X1GE!Mh;2zd^d<16Re}O<&6;C=*7QZU6?!0zxTu^ z_i=4i*q-ilu|VuIA={Np1R4FCB7uSQ5Z>h9!iPo=`**>4{Sy)#CAHlqCQ??EOY5~&bNDF1 zNw*$f-Ho1JWRhiS?hGhgZ6Rh@k<2n)eg#!21h+-r)^oA64b&LNJ9aXIr@}Y zA73hFT{;}lpe}CltRQ+reBXC;JTRT~e$K-#32x$hp<;lAysJC5p2i$^QH_hE<-Su* zlucNL?YLAIuj!v4v1m24+%MCuXGBGr-?G)QvW$xF+dGmuBs6V5x) ztmgTc5Bc)1CNCGHoeoYJW4tNgWi!vMw8s#QX5pWgf-b%h1zLvHr{A5c=sUr$M>^IS zuOH=*-_)5as0klf*_vHv+zpx^ba(F?4eka$qMx*#Adyb_v%vx-OWzkp%8|E6QtGrx z*wxS3)2wkz95!0x;P&G3%xGR7Xrc{cSUEFew)~-;zS~+a84hJ$-%nlvxv>4mSY}H7 z7H6-N+r2cOo}Aj)`WQ>#Z8otvhq#=#2erJReY6RR%zP&Fu!M_$ zEez#W0@7GuZB($;z0S?iG$lp=ronv*_)n*TjV(Be=i|Yi;0sjgQGh7LY1|}EyiTSW zw<0_d2SZDPQNkHL6wo@(0oGKm2c?br_ zLtm_Xi1dqIN4yU_V@hw%rKYJ*G|DfXMJ>To=?@p{(xg-3_E>cL8e&0O9d^YX7WoT{G$bBUF|r}x$Jh~VmrgNp+= n=^HtDg1A-=EMmjKSxWsgD8q}1uA-a|5#VI+V)xAEeENR?b%&di literal 0 HcmV?d00001 diff --git a/puzzle-emissives/src/main/resources/fabric.mod.json b/puzzle-emissives/src/main/resources/fabric.mod.json new file mode 100755 index 0000000..2d3de2e --- /dev/null +++ b/puzzle-emissives/src/main/resources/fabric.mod.json @@ -0,0 +1,40 @@ +{ + "schemaVersion": 1, + "id": "puzzle-emissives", + "version": "${version}", + + "name": "Puzzle Emissive Textures", + "description": "Displays emissive textures on blocks and entities", + "authors": [ + "PuzzleMC", + "Motschen" + ], + "contact": { + "homepage": "https://www.midnightdust.eu/", + "sources": "https://github.com/TeamMidnightDust/Puzzle", + "issues": "https://github.com/TeamMidnightDust/Puzzle/issues" + }, + + "license": "MIT", + "icon": "assets/puzzle/icon.png", + + "environment": "client", + "entrypoints": { + "client": [ + "net.puzzlemc.emissives.PuzzleEmissiveTextures" + ] + }, + "custom": { + "modmenu": { + "parent": "puzzle" + } + }, + + "mixins": [ + "puzzle-emissives.mixins.json" + ], + + "depends": { + "fabric": "*" + } +} diff --git a/puzzle-emissives/src/main/resources/puzzle-emissives.mixins.json b/puzzle-emissives/src/main/resources/puzzle-emissives.mixins.json new file mode 100755 index 0000000..fff43eb --- /dev/null +++ b/puzzle-emissives/src/main/resources/puzzle-emissives.mixins.json @@ -0,0 +1,11 @@ +{ + "required": true, + "package": "net.puzzlemc.emissives.mixin", + "compatibilityLevel": "JAVA_17", + "client": [ + "MixinLivingEntityRenderer" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/puzzle-gui/src/main/java/net/puzzlemc/gui/PuzzleClient.java b/puzzle-gui/src/main/java/net/puzzlemc/gui/PuzzleClient.java index 74868b1..929a8ab 100755 --- a/puzzle-gui/src/main/java/net/puzzlemc/gui/PuzzleClient.java +++ b/puzzle-gui/src/main/java/net/puzzlemc/gui/PuzzleClient.java @@ -53,10 +53,14 @@ public class PuzzleClient implements ClientModInitializer { PuzzleSplashScreen.resetColors(); MinecraftClient.getInstance().getTextureManager().registerTexture(PuzzleSplashScreen.LOGO, new PuzzleSplashScreen.LogoTexture()); })); + PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Disable splash screen logo blending "), (button) -> button.setMessage(PuzzleConfig.disableSplashScreenBlend ? YES : NO), (button) -> { + PuzzleConfig.disableSplashScreenBlend = !PuzzleConfig.disableSplashScreenBlend; + PuzzleConfig.write(id); + })); } - if (FabricLoader.getInstance().isModLoaded("puzzle-randomentities")) { - PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Random Entity Textures"), (button) -> button.setMessage(PuzzleConfig.randomEntityTextures ? YES : NO), (button) -> { - PuzzleConfig.randomEntityTextures = !PuzzleConfig.randomEntityTextures; + if (FabricLoader.getInstance().isModLoaded("puzzle-emissives")) { + PuzzleApi.addToResourceOptions(new PuzzleWidget(Text.of("Emissive Textures"), (button) -> button.setMessage(PuzzleConfig.emissiveTextures ? YES : NO), (button) -> { + PuzzleConfig.emissiveTextures = !PuzzleConfig.emissiveTextures; PuzzleConfig.write(id); })); } diff --git a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java index e8c741a..fbc9e0f 100755 --- a/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java +++ b/puzzle-splashscreen/src/main/java/net/puzzlemc/splashscreen/mixin/MixinSplashScreen.java @@ -1,6 +1,7 @@ package net.puzzlemc.splashscreen.mixin; import com.mojang.blaze3d.platform.GlStateManager; +import com.mojang.blaze3d.systems.RenderSystem; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.Overlay; import net.minecraft.client.gui.screen.SplashOverlay; @@ -69,6 +70,10 @@ public abstract class MixinSplashScreen extends Overlay { GlStateManager._clear(16384, MinecraftClient.IS_SYSTEM_MAC); } } + @Inject(method = "render", at = @At(value = "INVOKE", target = "Lcom/mojang/blaze3d/systems/RenderSystem;enableBlend()V", shift = At.Shift.AFTER)) + private void disableBlend(MatrixStack matrices, int mouseX, int mouseY, float delta, CallbackInfo ci) { + if (PuzzleConfig.disableSplashScreenBlend) RenderSystem.disableBlend(); + } @ModifyArg(method = "renderProgressBar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/SplashOverlay;fill(Lnet/minecraft/client/util/math/MatrixStack;IIIII)V"), index = 5) private int modifyProgressFrame(int color) { // Set the Progress Bar Frame Color to our configured value // diff --git a/settings.gradle b/settings.gradle index d0779af..55d9a0d 100755 --- a/settings.gradle +++ b/settings.gradle @@ -14,3 +14,4 @@ include 'puzzle-models' include 'puzzle-blocks' //include 'puzzle-randomentities' include 'puzzle-gui' +include 'puzzle-emissives'