aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/anthonyhilyard/iceberg/mixin
diff options
context:
space:
mode:
authorAnthony Hilyard <anthony.hilyard@gmail.com>2021-10-30 10:25:30 -0700
committerAnthony Hilyard <anthony.hilyard@gmail.com>2021-10-30 10:25:30 -0700
commit95f63bb1d6ba39a01a7124626c051130640d39c4 (patch)
treea8052c993577c99a11b8541493a0331b84711ccc /src/main/java/com/anthonyhilyard/iceberg/mixin
parentac69a23dacfe35f7f24b8d3d86acd67133992ad0 (diff)
downloadIceberg-95f63bb1d6ba39a01a7124626c051130640d39c4.tar.gz
Iceberg-95f63bb1d6ba39a01a7124626c051130640d39c4.tar.bz2
Iceberg-95f63bb1d6ba39a01a7124626c051130640d39c4.zip
Added rendertick event, added color results for color event.
Diffstat (limited to 'src/main/java/com/anthonyhilyard/iceberg/mixin')
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/mixin/LivingEntityMixin.java1
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/mixin/MinecraftMixin.java31
-rw-r--r--src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java100
3 files changed, 130 insertions, 2 deletions
diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/LivingEntityMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/LivingEntityMixin.java
index d01df84..09db766 100644
--- a/src/main/java/com/anthonyhilyard/iceberg/mixin/LivingEntityMixin.java
+++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/LivingEntityMixin.java
@@ -7,7 +7,6 @@ import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.item.ItemEntity;
import net.minecraft.world.entity.player.Player;
-import com.anthonyhilyard.iceberg.Loader;
import com.anthonyhilyard.iceberg.events.NewItemPickupCallback;
import org.spongepowered.asm.mixin.Mixin;
diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/MinecraftMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/MinecraftMixin.java
new file mode 100644
index 0000000..34d514b
--- /dev/null
+++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/MinecraftMixin.java
@@ -0,0 +1,31 @@
+package com.anthonyhilyard.iceberg.mixin;
+
+import com.anthonyhilyard.iceberg.events.RenderTickEvents;
+
+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 net.minecraft.client.Minecraft;
+import net.minecraft.client.Timer;
+
+@Mixin(Minecraft.class)
+public class MinecraftMixin
+{
+ @Shadow
+ private boolean pause;
+
+ @Shadow
+ private float pausePartialTick;
+
+ @Shadow
+ private Timer timer;
+
+ @Inject(method = "runTick", at = @At(value = "INVOKE_STRING", target = "Lnet/minecraft/util/profiling/ProfilerFiller;popPush(Ljava/lang/String;)V", args = { "ldc=gameRenderer" }))
+ public void runTick(boolean tickWorld, CallbackInfo callbackInfo)
+ {
+ RenderTickEvents.START.invoker().onStart(pause ? pausePartialTick : timer.partialTick);
+ }
+}
diff --git a/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java b/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java
index fd2abc0..4f6625b 100644
--- a/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java
+++ b/src/main/java/com/anthonyhilyard/iceberg/mixin/ScreenMixin.java
@@ -3,13 +3,20 @@ package com.anthonyhilyard.iceberg.mixin;
import java.util.List;
import com.anthonyhilyard.iceberg.events.RenderTooltipEvents;
+import com.anthonyhilyard.iceberg.events.RenderTooltipEvents.ColorResult;
import com.google.common.collect.Lists;
+import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.PoseStack;
+import com.mojang.blaze3d.vertex.Tesselator;
+import com.mojang.math.Matrix4f;
+import org.spongepowered.asm.mixin.Final;
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.Redirect;
+import org.spongepowered.asm.mixin.injection.At.Shift;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
@@ -19,6 +26,7 @@ import net.minecraft.client.gui.components.events.GuiEventListener;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen;
import net.minecraft.client.gui.screens.inventory.tooltip.ClientTooltipComponent;
+import net.minecraft.world.InteractionResult;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack;
@@ -29,10 +37,100 @@ public class ScreenMixin extends AbstractContainerEventHandler
@Shadow
protected Font font = null;
+ @Final
@Shadow
private final List<GuiEventListener> children = Lists.newArrayList();
@SuppressWarnings("unchecked")
+ @Inject(method = "renderTooltipInternal", at = @At(value = "HEAD"), cancellable = true)
+ private void preRenderTooltipInternal(PoseStack poseStack, List<ClientTooltipComponent> components, int x, int y, CallbackInfo info)
+ {
+ Screen self = (Screen)(Object)this;
+ if (self instanceof AbstractContainerScreen)
+ {
+ if (!components.isEmpty())
+ {
+ Slot hoveredSlot = ((AbstractContainerScreen<AbstractContainerMenu>)self).hoveredSlot;
+ if (hoveredSlot != null)
+ {
+ ItemStack tooltipStack = hoveredSlot.getItem();
+ if (RenderTooltipEvents.PRE.invoker().onPre(tooltipStack, components, poseStack, x, y, self.width, self.height, -1, font, false) != InteractionResult.PASS)
+ {
+ info.cancel();
+ }
+ }
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Redirect(method = "renderTooltipInternal", at = @At(value = "INVOKE",
+ target = "Lnet/minecraft/client/gui/screens/Screen;fillGradient(Lcom/mojang/math/Matrix4f;Lcom/mojang/blaze3d/vertex/BufferBuilder;IIIIIII)V"))
+ private void fillGradientProxy(Matrix4f matrix4f, BufferBuilder bufferBuilder, int left, int top, int right, int bottom, int zIndex, int colorStart, int colorEnd)
+ {
+ Screen self = (Screen)(Object)this;
+ ItemStack tooltipStack = ItemStack.EMPTY;
+ if (self instanceof AbstractContainerScreen)
+ {
+ Slot hoveredSlot = ((AbstractContainerScreen<AbstractContainerMenu>)self).hoveredSlot;
+
+ if (hoveredSlot != null)
+ {
+ tooltipStack = hoveredSlot.getItem();
+ }
+ }
+ if (tooltipStack == ItemStack.EMPTY)
+ {
+ // Do standard functionality if this isn't a container screen.
+ Screen.fillGradient(matrix4f, bufferBuilder, left, top, right, bottom, zIndex, colorStart, colorEnd);
+ }
+ else
+ {
+ // Otherwise do nothing to disable the default calls.
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ @Inject(method = "renderTooltipInternal", at = @At(value = "INVOKE",
+ target = "Lnet/minecraft/client/gui/screens/Screen;fillGradient(Lcom/mojang/math/Matrix4f;Lcom/mojang/blaze3d/vertex/BufferBuilder;IIIIIII)V", shift = Shift.BEFORE),
+ locals = LocalCapture.CAPTURE_FAILEXCEPTION)
+ private void preFillGradient(PoseStack poseStack, List<ClientTooltipComponent> components, int x, int y, CallbackInfo info,
+ int __, int ___, int left, int top, int width, int height, int background, int borderStart, int borderEnd,
+ int zIndex, float blitOffset, Tesselator tesselator, BufferBuilder bufferBuilder, Matrix4f matrix4f)
+ {
+ Screen self = (Screen)(Object)this;
+ ItemStack tooltipStack = ItemStack.EMPTY;
+ if (self instanceof AbstractContainerScreen)
+ {
+ Slot hoveredSlot = ((AbstractContainerScreen<AbstractContainerMenu>)self).hoveredSlot;
+
+ if (hoveredSlot != null)
+ {
+ tooltipStack = hoveredSlot.getItem();
+ }
+ }
+
+ if (tooltipStack != ItemStack.EMPTY)
+ {
+ // Do colors now, sure why not.
+ ColorResult result = RenderTooltipEvents.COLOR.invoker().onColor(tooltipStack, components, poseStack, x, y, font, background, borderStart, borderEnd, false);
+ background = result.background();
+ borderStart = result.borderStart();
+ borderEnd = result.borderEnd();
+
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top - 4, left + width + 3, top - 3, zIndex, background, background);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top + height + 3, left + width + 3, top + height + 4, zIndex, background, background);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top - 3, left + width + 3, top + height + 3, zIndex, background, background);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 4, top - 3, left - 3, top + height + 3, zIndex, background, background);
+ Screen.fillGradient(matrix4f, bufferBuilder, left + width + 3, top - 3, left + width + 4, top + height + 3, zIndex, background, background);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top - 3 + 1, left - 3 + 1, top + height + 3 - 1, zIndex, borderStart, borderEnd);
+ Screen.fillGradient(matrix4f, bufferBuilder, left + width + 2, top - 3 + 1, left + width + 3, top + height + 3 - 1, zIndex, borderStart, borderEnd);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top - 3, left + width + 3, top - 3 + 1, zIndex, borderStart, borderStart);
+ Screen.fillGradient(matrix4f, bufferBuilder, left - 3, top + height + 2, left + width + 3, top + height + 3, zIndex, borderEnd, borderEnd);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
@Inject(method = "renderTooltipInternal", at = @At(value = "TAIL"), locals = LocalCapture.CAPTURE_FAILEXCEPTION)
private void renderTooltipInternal(PoseStack poseStack, List<ClientTooltipComponent> components, int x, int y, CallbackInfo info, int tooltipWidth, int tooltipHeight, int postX, int postY)
{
@@ -44,7 +142,7 @@ public class ScreenMixin extends AbstractContainerEventHandler
if (hoveredSlot != null)
{
ItemStack tooltipStack = hoveredSlot.getItem();
- RenderTooltipEvents.POST.invoker().onPost(tooltipStack, components, poseStack, x, y, font, tooltipWidth, tooltipHeight, false);
+ RenderTooltipEvents.POST.invoker().onPost(tooltipStack, components, poseStack, x + 12, y - 12, font, tooltipWidth, tooltipHeight, false);
}
}
}