2025-11-24 22:52:51 +03:00

173 lines
6.7 KiB
Java

/*
* Decompiled with CFR 0.152.
*
* Could not load the following classes:
* org.jspecify.annotations.Nullable
*/
package net.minecraft.world.inventory;
import java.util.List;
import java.util.Optional;
import net.minecraft.network.protocol.game.ClientboundContainerSetSlotPacket;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.Container;
import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.inventory.AbstractCraftingMenu;
import net.minecraft.world.inventory.ContainerLevelAccess;
import net.minecraft.world.inventory.CraftingContainer;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.RecipeBookType;
import net.minecraft.world.inventory.ResultContainer;
import net.minecraft.world.inventory.Slot;
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.minecraft.world.item.crafting.RecipeType;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Blocks;
import org.jspecify.annotations.Nullable;
public class CraftingMenu
extends AbstractCraftingMenu {
private static final int CRAFTING_GRID_WIDTH = 3;
private static final int CRAFTING_GRID_HEIGHT = 3;
public static final int RESULT_SLOT = 0;
private static final int CRAFT_SLOT_START = 1;
private static final int CRAFT_SLOT_COUNT = 9;
private static final int CRAFT_SLOT_END = 10;
private static final int INV_SLOT_START = 10;
private static final int INV_SLOT_END = 37;
private static final int USE_ROW_SLOT_START = 37;
private static final int USE_ROW_SLOT_END = 46;
private final ContainerLevelAccess access;
private final Player player;
private boolean placingRecipe;
public CraftingMenu(int containerId, Inventory inventory) {
this(containerId, inventory, ContainerLevelAccess.NULL);
}
public CraftingMenu(int containerId, Inventory inventory, ContainerLevelAccess access) {
super(MenuType.CRAFTING, containerId, 3, 3);
this.access = access;
this.player = inventory.player;
this.addResultSlot(this.player, 124, 35);
this.addCraftingGridSlots(30, 17);
this.addStandardInventorySlots(inventory, 8, 84);
}
protected static void slotChangedCraftingGrid(AbstractContainerMenu menu, ServerLevel level, Player player, CraftingContainer container, ResultContainer resultSlots, @Nullable RecipeHolder<CraftingRecipe> recipeHint) {
CraftingInput input = container.asCraftInput();
ServerPlayer serverPlayer = (ServerPlayer)player;
ItemStack result = ItemStack.EMPTY;
Optional<RecipeHolder<CraftingRecipe>> maybeRecipe = level.getServer().getRecipeManager().getRecipeFor(RecipeType.CRAFTING, input, (Level)level, recipeHint);
if (maybeRecipe.isPresent()) {
ItemStack recipeResult;
RecipeHolder<CraftingRecipe> recipeHolder = maybeRecipe.get();
CraftingRecipe craftingRecipe = recipeHolder.value();
if (resultSlots.setRecipeUsed(serverPlayer, recipeHolder) && (recipeResult = craftingRecipe.assemble(input, level.registryAccess())).isItemEnabled(level.enabledFeatures())) {
result = recipeResult;
}
}
resultSlots.setItem(0, result);
menu.setRemoteSlot(0, result);
serverPlayer.connection.send(new ClientboundContainerSetSlotPacket(menu.containerId, menu.incrementStateId(), 0, result));
}
@Override
public void slotsChanged(Container container) {
if (!this.placingRecipe) {
this.access.execute((level, pos) -> {
if (level instanceof ServerLevel) {
ServerLevel serverLevel = (ServerLevel)level;
CraftingMenu.slotChangedCraftingGrid(this, serverLevel, this.player, this.craftSlots, this.resultSlots, null);
}
});
}
}
@Override
public void beginPlacingRecipe() {
this.placingRecipe = true;
}
@Override
public void finishPlacingRecipe(ServerLevel level, RecipeHolder<CraftingRecipe> recipe) {
this.placingRecipe = false;
CraftingMenu.slotChangedCraftingGrid(this, level, this.player, this.craftSlots, this.resultSlots, recipe);
}
@Override
public void removed(Player player) {
super.removed(player);
this.access.execute((level, pos) -> this.clearContainer(player, this.craftSlots));
}
@Override
public boolean stillValid(Player player) {
return CraftingMenu.stillValid(this.access, player, Blocks.CRAFTING_TABLE);
}
@Override
public ItemStack quickMoveStack(Player player, int slotIndex) {
ItemStack clicked = ItemStack.EMPTY;
Slot slot = (Slot)this.slots.get(slotIndex);
if (slot != null && slot.hasItem()) {
ItemStack stack = slot.getItem();
clicked = stack.copy();
if (slotIndex == 0) {
stack.getItem().onCraftedBy(stack, player);
if (!this.moveItemStackTo(stack, 10, 46, true)) {
return ItemStack.EMPTY;
}
slot.onQuickCraft(stack, clicked);
} else if (slotIndex >= 10 && slotIndex < 46 ? !this.moveItemStackTo(stack, 1, 10, false) && (slotIndex < 37 ? !this.moveItemStackTo(stack, 37, 46, false) : !this.moveItemStackTo(stack, 10, 37, false)) : !this.moveItemStackTo(stack, 10, 46, false)) {
return ItemStack.EMPTY;
}
if (stack.isEmpty()) {
slot.setByPlayer(ItemStack.EMPTY);
} else {
slot.setChanged();
}
if (stack.getCount() == clicked.getCount()) {
return ItemStack.EMPTY;
}
slot.onTake(player, stack);
if (slotIndex == 0) {
player.drop(stack, false);
}
}
return clicked;
}
@Override
public boolean canTakeItemForPickAll(ItemStack carried, Slot target) {
return target.container != this.resultSlots && super.canTakeItemForPickAll(carried, target);
}
@Override
public Slot getResultSlot() {
return (Slot)this.slots.get(0);
}
@Override
public List<Slot> getInputGridSlots() {
return this.slots.subList(1, 10);
}
@Override
public RecipeBookType getRecipeBookType() {
return RecipeBookType.CRAFTING;
}
@Override
protected Player owner() {
return this.player;
}
}