package net.minecraft.client.gui.screens.inventory; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphicsExtractor; import net.minecraft.client.gui.navigation.ScreenPosition; import net.minecraft.client.gui.screens.recipebook.CraftingRecipeBookComponent; import net.minecraft.client.input.MouseButtonEvent; import net.minecraft.client.renderer.RenderPipelines; import net.minecraft.client.renderer.entity.EntityRenderDispatcher; import net.minecraft.client.renderer.entity.EntityRenderer; import net.minecraft.client.renderer.entity.state.EntityRenderState; import net.minecraft.client.renderer.entity.state.LivingEntityRenderState; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.Pose; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.InventoryMenu; import org.joml.Quaternionf; import org.joml.Vector3f; @Environment(EnvType.CLIENT) public class InventoryScreen extends AbstractRecipeBookScreen { private float xMouse; private float yMouse; private boolean buttonClicked; private final EffectsInInventory effects; public InventoryScreen(final Player player) { super(player.inventoryMenu, new CraftingRecipeBookComponent(player.inventoryMenu), player.getInventory(), Component.translatable("container.crafting")); this.titleLabelX = 97; this.effects = new EffectsInInventory(this); } @Override public void containerTick() { super.containerTick(); if (this.minecraft.player.hasInfiniteMaterials()) { this.minecraft .gui .setScreen( new CreativeModeInventoryScreen(this.minecraft.player, this.minecraft.player.connection.enabledFeatures(), this.minecraft.options.operatorItemsTab().get()) ); } } @Override protected void init() { if (this.minecraft.player.hasInfiniteMaterials()) { this.minecraft .gui .setScreen( new CreativeModeInventoryScreen(this.minecraft.player, this.minecraft.player.connection.enabledFeatures(), this.minecraft.options.operatorItemsTab().get()) ); } else { super.init(); } } @Override protected ScreenPosition getRecipeBookButtonPosition() { return new ScreenPosition(this.leftPos + 104, this.height / 2 - 22); } @Override protected void onRecipeBookButtonClick() { this.buttonClicked = true; } @Override protected void extractLabels(final GuiGraphicsExtractor graphics, final int xm, final int ym) { graphics.text(this.font, this.title, this.titleLabelX, this.titleLabelY, -12566464, false); } @Override public void extractRenderState(final GuiGraphicsExtractor graphics, final int mouseX, final int mouseY, final float a) { this.effects.extractRenderState(graphics, mouseX, mouseY); super.extractRenderState(graphics, mouseX, mouseY, a); this.xMouse = mouseX; this.yMouse = mouseY; } @Override public boolean showsActiveEffects() { return this.effects.canSeeEffects(); } @Override protected boolean isBiggerResultSlot() { return false; } @Override public void extractBackground(final GuiGraphicsExtractor graphics, final int mouseX, final int mouseY, final float a) { super.extractBackground(graphics, mouseX, mouseY, a); int xo = this.leftPos; int yo = this.topPos; graphics.blit(RenderPipelines.GUI_TEXTURED, INVENTORY_LOCATION, xo, yo, 0.0F, 0.0F, this.imageWidth, this.imageHeight, 256, 256); extractEntityInInventoryFollowsMouse(graphics, xo + 26, yo + 8, xo + 75, yo + 78, 30, 0.0625F, this.xMouse, this.yMouse, this.minecraft.player); } public static void extractEntityInInventoryFollowsMouse( final GuiGraphicsExtractor graphics, final int x0, final int y0, final int x1, final int y1, final int size, final float offsetY, final float mouseX, final float mouseY, final LivingEntity entity ) { float centerX = (x0 + x1) / 2.0F; float centerY = (y0 + y1) / 2.0F; float xAngle = (float)Math.atan((centerX - mouseX) / 40.0F); float yAngle = (float)Math.atan((centerY - mouseY) / 40.0F); Quaternionf rotation = new Quaternionf().rotateZ((float) Math.PI); Quaternionf xRotation = new Quaternionf().rotateX(yAngle * 20.0F * (float) (Math.PI / 180.0)); rotation.mul(xRotation); EntityRenderState renderState = extractRenderState(entity); if (renderState instanceof LivingEntityRenderState livingRenderState) { livingRenderState.bodyRot = 180.0F + xAngle * 20.0F; livingRenderState.yRot = xAngle * 20.0F; if (livingRenderState.pose != Pose.FALL_FLYING) { livingRenderState.xRot = -yAngle * 20.0F; } else { livingRenderState.xRot = 0.0F; } livingRenderState.boundingBoxWidth = livingRenderState.boundingBoxWidth / livingRenderState.scale; livingRenderState.boundingBoxHeight = livingRenderState.boundingBoxHeight / livingRenderState.scale; livingRenderState.scale = 1.0F; } Vector3f translation = new Vector3f(0.0F, renderState.boundingBoxHeight / 2.0F + offsetY, 0.0F); graphics.entity(renderState, size, translation, rotation, xRotation, x0, y0, x1, y1); } private static EntityRenderState extractRenderState(final LivingEntity entity) { EntityRenderDispatcher entityRenderDispatcher = Minecraft.getInstance().getEntityRenderDispatcher(); EntityRenderer renderer = entityRenderDispatcher.getRenderer(entity); EntityRenderState renderState = renderer.createRenderState(entity, 1.0F); renderState.shadowPieces.clear(); renderState.outlineColor = 0; return renderState; } @Override public boolean mouseReleased(final MouseButtonEvent event) { if (this.buttonClicked) { this.buttonClicked = false; return true; } else { return super.mouseReleased(event); } } }