diff options
Diffstat (limited to 'src/main/java')
10 files changed, 106 insertions, 15 deletions
diff --git a/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java b/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java index a9db7f9..07e4549 100644 --- a/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java +++ b/src/main/java/moe/nea/firmament/init/AutoDiscoveryPlugin.java @@ -27,6 +27,8 @@ public class AutoDiscoveryPlugin { return mixins.stream().map(it -> defaultName + "." + it).toList(); } + // TODO: remove println + private static final List<AutoDiscoveryPlugin> mixinPlugins = new ArrayList<>(); public static List<AutoDiscoveryPlugin> getMixinPlugins() { diff --git a/src/main/java/moe/nea/firmament/mixins/HideStatusEffectsPatch.java b/src/main/java/moe/nea/firmament/mixins/HideStatusEffectsPatch.java index c5af8b6..2a58921 100644 --- a/src/main/java/moe/nea/firmament/mixins/HideStatusEffectsPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/HideStatusEffectsPatch.java @@ -1,17 +1,16 @@ package moe.nea.firmament.mixins; -import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import moe.nea.firmament.features.fixes.Fixes; import net.minecraft.client.gui.DrawContext; -import net.minecraft.client.gui.screen.ingame.InventoryScreen; import net.minecraft.client.gui.screen.ingame.StatusEffectsDisplay; 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; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -@Mixin(InventoryScreen.class) +@Mixin(StatusEffectsDisplay.class) public abstract class HideStatusEffectsPatch { @Shadow public abstract boolean shouldHideStatusEffectHud(); @@ -21,9 +20,11 @@ public abstract class HideStatusEffectsPatch { cir.setReturnValue(!Fixes.TConfig.INSTANCE.getHidePotionEffects()); } - @WrapWithCondition(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/StatusEffectsDisplay;drawStatusEffects(Lnet/minecraft/client/gui/DrawContext;IIF)V")) - private boolean conditionalRenderStatuses(StatusEffectsDisplay instance, DrawContext context, int mouseX, int mouseY, float tickDelta) { - return shouldHideStatusEffectHud() || !Fixes.TConfig.INSTANCE.getHidePotionEffects(); + @Inject(method = "drawStatusEffects", at = @At("HEAD"), cancellable = true) + private void conditionalRenderStatuses(DrawContext context, int mouseX, int mouseY, CallbackInfo ci) { + if (shouldHideStatusEffectHud() || !Fixes.TConfig.INSTANCE.getHidePotionEffects()) { + ci.cancel(); + } } } diff --git a/src/main/java/moe/nea/firmament/mixins/MainWindowFirstLoadPatch.java b/src/main/java/moe/nea/firmament/mixins/MainWindowFirstLoadPatch.java index 0a90b35..9e42b20 100644 --- a/src/main/java/moe/nea/firmament/mixins/MainWindowFirstLoadPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/MainWindowFirstLoadPatch.java @@ -17,7 +17,7 @@ public class MainWindowFirstLoadPatch { @Inject(method = "<init>(ZLnet/minecraft/client/gui/LogoDrawer;)V", at = @At("RETURN")) private void onCreate(boolean doBackgroundFade, LogoDrawer logoDrawer, CallbackInfo ci) { - if (!hasInited) { + if (!hasInited && Firmament.INSTANCE.getDEBUG()) { try { DebugInstantiateEvent.Companion.publish(new DebugInstantiateEvent()); } catch (Throwable t) { diff --git a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java index 43aec40..530fe47 100644 --- a/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/MixinHandledScreen.java @@ -62,12 +62,9 @@ public abstract class MixinHandledScreen<T extends ScreenHandler> { } } - @Inject(method = "render", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/screen/ingame/HandledScreen;drawForeground(Lnet/minecraft/client/gui/DrawContext;II)V", shift = At.Shift.AFTER)) + @Inject(method = "renderMain", at = @At("HEAD")) public void onAfterRenderForeground(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { - context.getMatrices().push(); - context.getMatrices().translate(-x, -y, 0); HandledScreenForegroundEvent.Companion.publish(new HandledScreenForegroundEvent((HandledScreen<?>) (Object) this, context, mouseX, mouseY, delta)); - context.getMatrices().pop(); } @Inject(method = "onMouseClick(Lnet/minecraft/screen/slot/Slot;IILnet/minecraft/screen/slot/SlotActionType;)V", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/moe/nea/firmament/mixins/PlayerDropEventPatch.java b/src/main/java/moe/nea/firmament/mixins/PlayerDropEventPatch.java index f07604e..86f6806 100644 --- a/src/main/java/moe/nea/firmament/mixins/PlayerDropEventPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/PlayerDropEventPatch.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @Mixin(ClientPlayerEntity.class) public abstract class PlayerDropEventPatch extends PlayerEntity { public PlayerDropEventPatch() { - super(null, null, 0, null); + super(null, null); } @Inject(method = "dropSelectedItem", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java b/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java index 3ed8c1b..e268819 100644 --- a/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java +++ b/src/main/java/moe/nea/firmament/mixins/WorldRenderLastEventPatch.java @@ -2,8 +2,10 @@ package moe.nea.firmament.mixins; +import com.mojang.blaze3d.buffers.GpuBufferSlice; import moe.nea.firmament.events.WorldRenderLastEvent; import net.minecraft.client.render.*; +import net.minecraft.client.render.fog.FogRenderer; import net.minecraft.client.util.Handle; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.util.profiler.Profiler; @@ -29,7 +31,7 @@ public abstract class WorldRenderLastEventPatch { protected abstract void checkEmpty(MatrixStack matrices); @Inject(method = "method_62214", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/profiler/Profiler;pop()V", shift = At.Shift.AFTER)) - public void onWorldRenderLast(Fog fog, RenderTickCounter renderTickCounter, Camera camera, Profiler profiler, Matrix4f matrix4f, Matrix4f matrix4f2, Handle handle, Handle handle2, boolean bl, Frustum frustum, Handle handle3, Handle handle4, CallbackInfo ci) { + public void onWorldRenderLast(GpuBufferSlice gpuBufferSlice, RenderTickCounter renderTickCounter, Camera camera, Profiler profiler, Matrix4f matrix4f, Handle handle, Handle handle2, boolean bl, Frustum frustum, Handle handle3, Handle handle4, CallbackInfo ci) { var imm = this.bufferBuilders.getEntityVertexConsumers(); var stack = new MatrixStack(); // TODO: pre-cancel this event if F1 is active diff --git a/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java b/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java index 6e1090a..4d51239 100644 --- a/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java +++ b/src/main/java/moe/nea/firmament/mixins/customgui/PatchHandledScreen.java @@ -134,7 +134,7 @@ public class PatchHandledScreen<T extends ScreenHandler> extends Screen implemen } } - @Inject(method = "render", at = @At("HEAD")) + @Inject(method = "renderBackground", at = @At("HEAD")) public void moveSlots(DrawContext context, int mouseX, int mouseY, float delta, CallbackInfo ci) { if (override != null) { for (Slot slot : handler.slots) { diff --git a/src/main/java/moe/nea/firmament/mixins/feature/devcosmetics/CustomCapeFeatureRenderer.java b/src/main/java/moe/nea/firmament/mixins/feature/devcosmetics/CustomCapeFeatureRenderer.java index 5a92f89..c9115d2 100644 --- a/src/main/java/moe/nea/firmament/mixins/feature/devcosmetics/CustomCapeFeatureRenderer.java +++ b/src/main/java/moe/nea/firmament/mixins/feature/devcosmetics/CustomCapeFeatureRenderer.java @@ -29,12 +29,13 @@ public abstract class CustomCapeFeatureRenderer extends FeatureRenderer<PlayerEn method = "render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumerProvider;ILnet/minecraft/client/render/entity/state/PlayerEntityRenderState;FF)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/render/entity/model/BipedEntityModel;render(Lnet/minecraft/client/util/math/MatrixStack;Lnet/minecraft/client/render/VertexConsumer;II)V") ) - private void onRender(BipedEntityModel instance, MatrixStack matrixStack, VertexConsumer vertexConsumer, int light, int overlay, Operation<Void> original, @Local PlayerEntityRenderState playerEntityRenderState, @Local SkinTextures skinTextures, @Local VertexConsumerProvider vertexConsumerProvider) { + private void onRender(BipedEntityModel<PlayerEntityRenderState> instance, MatrixStack matrixStack, VertexConsumer vertexConsumer, int light, int overlay, Operation<Void> original, @Local(argsOnly = true) PlayerEntityRenderState playerEntityRenderState, @Local SkinTextures skinTextures, @Local VertexConsumerProvider vertexConsumerProvider) { CustomCapes.render( playerEntityRenderState, vertexConsumer, RenderLayer.getEntitySolid(skinTextures.capeTexture()), vertexConsumerProvider, + matrixStack, updatedConsumer -> { original.call(instance, matrixStack, updatedConsumer, light, overlay); return Unit.INSTANCE; diff --git a/src/main/java/moe/nea/firmament/mixins/render/IncreaseStackLimitSizeInDrawContext.java b/src/main/java/moe/nea/firmament/mixins/render/IncreaseStackLimitSizeInDrawContext.java new file mode 100644 index 0000000..61ad8a3 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/render/IncreaseStackLimitSizeInDrawContext.java @@ -0,0 +1,20 @@ +package moe.nea.firmament.mixins.render; + +import net.minecraft.client.gui.DrawContext; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.ModifyArg; + +@Mixin(DrawContext.class) +public class IncreaseStackLimitSizeInDrawContext { + // [22:00:57] [Render thread/ERROR] (Minecraft) Couldn't compile program for pipeline firmament:gui_textured_overlay_tris_circle: + // net.minecraft.client.gl.ShaderLoader$LoadException: Error encountered when linking program containing + // VS minecraft:core/position_tex_color and FS firmament:circle_discard_color. + // Log output: error: declarations for uniform `ColorModulator` are inside block `DynamicTransforms` and outside a block + @ModifyArg( + method = "<init>(Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/gui/render/state/GuiRenderState;)V", + at = @At(value = "INVOKE", target = "Lorg/joml/Matrix3x2fStack;<init>(I)V")) + private static int increaseStackSize(int stackSize) { + return Math.max(stackSize, 48); + } +} diff --git a/src/main/java/moe/nea/firmament/mixins/render/renderer/MultipleSpecialGuiRenderStates.java b/src/main/java/moe/nea/firmament/mixins/render/renderer/MultipleSpecialGuiRenderStates.java new file mode 100644 index 0000000..cc79591 --- /dev/null +++ b/src/main/java/moe/nea/firmament/mixins/render/renderer/MultipleSpecialGuiRenderStates.java @@ -0,0 +1,68 @@ +/* + * SPDX-License-Identifier: LGPL-3.0-or-later + * SPDX-FileCopyrightText: 2025 azureaaron via Skyblocker + */ + +package moe.nea.firmament.mixins.render.renderer; + +import com.mojang.blaze3d.buffers.GpuBufferSlice; +import moe.nea.firmament.util.render.MultiSpecialGuiRenderState; +import moe.nea.firmament.util.render.MultiSpecialGuiRenderer; +import net.minecraft.client.gui.render.GuiRenderer; +import net.minecraft.client.gui.render.SpecialGuiElementRenderer; +import net.minecraft.client.gui.render.state.GuiRenderState; +import net.minecraft.client.gui.render.state.special.SpecialGuiElementRenderState; +import net.minecraft.client.render.VertexConsumerProvider; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import java.util.HashMap; +import java.util.Map; + +/** + * The structure of this class was roughly taken from SkyBlocker, retrieved 29.07.2025 + */ +@Mixin(GuiRenderer.class) +public class MultipleSpecialGuiRenderStates { + @Shadow + @Final + private VertexConsumerProvider.Immediate vertexConsumers; + @Shadow + @Final + GuiRenderState state; + @Unique + Map<MultiSpecialGuiRenderState, MultiSpecialGuiRenderer<?>> multiRenderers = new HashMap<>(); + + @Inject(method = "prepareSpecialElement", at = @At("HEAD"), cancellable = true) + private <T extends SpecialGuiElementRenderState> void onPrepareElement(T elementState, int windowScaleFactor, CallbackInfo ci) { + if (elementState instanceof MultiSpecialGuiRenderState multiState) { + @SuppressWarnings({"resource", "unchecked"}) + var renderer = (SpecialGuiElementRenderer<T>) multiRenderers + .computeIfAbsent(multiState, elementState$ -> elementState$.createRenderer(this.vertexConsumers)); + renderer.render(elementState, state, windowScaleFactor); + ci.cancel(); + } + } + + @Inject(method = "close", at = @At("TAIL")) + private void onClose(CallbackInfo ci) { + multiRenderers.values().forEach(SpecialGuiElementRenderer::close); + } + + @Inject(method = "render(Lcom/mojang/blaze3d/buffers/GpuBufferSlice;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/render/GuiRenderer;clearOversizedItems()V")) + private void onAfterRender(GpuBufferSlice fogBuffer, CallbackInfo ci) { + multiRenderers.values().removeIf(it -> { + if (it.consumeRender()) { + return false; + } else { + it.close(); + return true; + } + }); + } +} |
