Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
package com.wintercogs.beyonddimensions.client.gui;

import com.wintercogs.beyonddimensions.common.menu.DimensionsCraftMenuTerminal;
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.gui.components.AbstractWidget;
import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.gui.screens.recipebook.RecipeBookComponent;
import net.minecraft.client.gui.screens.recipebook.RecipeUpdateListener;
import net.minecraft.network.chat.Component;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.ClickType;
import net.minecraft.world.inventory.Slot;
import org.jetbrains.annotations.NotNull;

public class DimensionsTerminalCraftGUI extends DimensionsCraftGUI<DimensionsCraftMenuTerminal>
public class DimensionsTerminalCraftGUI extends DimensionsCraftGUI<DimensionsCraftMenuTerminal> implements RecipeUpdateListener
{
private final RecipeBookComponent recipeBookComponent = new RecipeBookComponent();
private boolean widthTooNarrow;
private ImageButton recipeBookButton;

public DimensionsTerminalCraftGUI(DimensionsCraftMenuTerminal container, Inventory playerInventory, Component title)
{
Expand All @@ -16,11 +27,137 @@ public DimensionsTerminalCraftGUI(DimensionsCraftMenuTerminal container, Invento
protected void init()
{
super.init();
widthTooNarrow = width < imageWidth + 203;
recipeBookComponent.init(width, height, minecraft, widthTooNarrow, menu);
int previousLeft = leftPos;
leftPos = recipeBookComponent.updateScreenPosition(width, imageWidth);
moveMainWidgets(leftPos - previousLeft);
recipeBookButton = new ImageButton(
leftPos + 5,
topPos + imageHeight - 112,
20,
18,
RecipeBookComponent.RECIPE_BUTTON_SPRITES,
button ->
{
recipeBookComponent.toggleVisibility();
int oldLeft = leftPos;
leftPos = recipeBookComponent.updateScreenPosition(width, imageWidth);
moveMainWidgets(leftPos - oldLeft);
recipeBookButton.setPosition(leftPos + 5, topPos + imageHeight - 112);
}
);
addRenderableWidget(recipeBookButton);
addWidget(recipeBookComponent);
}

private void moveMainWidgets(int offset)
{
if (offset == 0) return;
for (var child : children())
{
if (child instanceof AbstractWidget widget && widget != recipeBookButton)
widget.setX(widget.getX() + offset);
}
}

@Override
public void containerTick()
{
super.containerTick();
recipeBookComponent.tick();
}

@Override
public void render(@NotNull GuiGraphics guiGraphics, int mouseX, int mouseY, float partialTick)
{
if (recipeBookComponent.isVisible() && widthTooNarrow)
{
renderBackground(guiGraphics, mouseX, mouseY, partialTick);
recipeBookComponent.render(guiGraphics, mouseX, mouseY, partialTick);
}
else
{
super.render(guiGraphics, mouseX, mouseY, partialTick);
recipeBookComponent.render(guiGraphics, mouseX, mouseY, partialTick);
recipeBookComponent.renderGhostRecipe(guiGraphics, leftPos, topPos, true, partialTick);
}

recipeBookComponent.renderTooltip(guiGraphics, leftPos, topPos, mouseX, mouseY);
}

@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers)
{
return recipeBookComponent.keyPressed(keyCode, scanCode, modifiers)
|| super.keyPressed(keyCode, scanCode, modifiers);
}

@Override
public boolean charTyped(char codePoint, int modifiers)
{
return recipeBookComponent.charTyped(codePoint, modifiers)
|| super.charTyped(codePoint, modifiers);
}

@Override
protected boolean isHovering(int x, int y, int width, int height, double mouseX, double mouseY)
{
return (!widthTooNarrow || !recipeBookComponent.isVisible())
&& super.isHovering(x, y, width, height, mouseX, mouseY);
}

@Override
public boolean mouseClicked(double mouseX, double mouseY, int button)
{
if (recipeBookComponent.mouseClicked(mouseX, mouseY, button))
{
setFocused(recipeBookComponent);
return true;
}
return widthTooNarrow && recipeBookComponent.isVisible()
|| super.mouseClicked(mouseX, mouseY, button);
}

@Override
protected boolean hasClickedOutside(double mouseX, double mouseY, int guiLeft, int guiTop, int mouseButton)
{
boolean outside = mouseX < guiLeft
|| mouseY < guiTop
|| mouseX >= guiLeft + imageWidth
|| mouseY >= guiTop + imageHeight;
return recipeBookComponent.hasClickedOutside(
mouseX,
mouseY,
leftPos,
topPos,
imageWidth,
imageHeight,
mouseButton
) && outside;
}

@Override
protected void slotClicked(Slot slot, int slotId, int mouseButton, ClickType type)
{
super.slotClicked(slot, slotId, mouseButton, type);
recipeBookComponent.slotClicked(slot);
}

@Override
public void recipesUpdated()
{
recipeBookComponent.recipesUpdated();
}

@Override
public RecipeBookComponent getRecipeBookComponent()
{
return recipeBookComponent;
}

@Override
protected void addCraftButton()
{
// 清空
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,12 @@
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.player.StackedContents;
import net.minecraft.world.inventory.*;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.CraftingInput;
import net.minecraft.world.item.crafting.CraftingRecipe;
import net.minecraft.world.item.crafting.RecipeHolder;
import net.neoforged.neoforge.network.PacketDistributor;
import org.anti_ad.mc.ipn.api.IPNIgnore;
import org.jetbrains.annotations.NotNull;
Expand All @@ -25,7 +29,7 @@
// 定义一些用于 超越维度 模组的ui界面的基本方法。
// 主要是重写网络同步和点击事件,确保父类机制不处理StoredStackSlot的相关内容
@IPNIgnore
public abstract class BDBaseMenu extends AbstractContainerMenu
public abstract class BDBaseMenu extends RecipeBookMenu<CraftingInput, CraftingRecipe>
{

public final Player player;
Expand All @@ -47,6 +51,58 @@ protected BDBaseMenu(@Nullable MenuType<?> menuType, int containerId, Inventory
this.player = playerInventory.player;
}

@Override
public void fillCraftSlotsStackedContents(StackedContents itemHelper)
{
}

@Override
public void clearCraftingContent()
{
}

@Override
public boolean recipeMatches(RecipeHolder<CraftingRecipe> recipe)
{
return false;
}

@Override
public int getResultSlotIndex()
{
return -1;
}

@Override
public int getGridWidth()
{
return 0;
}

@Override
public int getGridHeight()
{
return 0;
}

@Override
public int getSize()
{
return 0;
}

@Override
public RecipeBookType getRecipeBookType()
{
return RecipeBookType.CRAFTING;
}

@Override
public boolean shouldMoveToInventory(int slotIndex)
{
return false;
}

protected void addSlotGroupSync(SlotGroupSync slotGroupSync)
{
slotGroupSyncs.add(slotGroupSync);
Expand Down
Loading