104 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.gui.screens.recipebook;
 | |
| 
 | |
| import java.util.List;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.client.gui.components.WidgetSprites;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.recipebook.PlaceRecipeHelper;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import net.minecraft.util.context.ContextMap;
 | |
| import net.minecraft.world.entity.player.StackedItemContents;
 | |
| import net.minecraft.world.inventory.AbstractCraftingMenu;
 | |
| import net.minecraft.world.inventory.Slot;
 | |
| import net.minecraft.world.item.Items;
 | |
| import net.minecraft.world.item.crafting.RecipeBookCategories;
 | |
| import net.minecraft.world.item.crafting.display.RecipeDisplay;
 | |
| import net.minecraft.world.item.crafting.display.ShapedCraftingRecipeDisplay;
 | |
| import net.minecraft.world.item.crafting.display.ShapelessCraftingRecipeDisplay;
 | |
| import net.minecraft.world.item.crafting.display.SlotDisplay;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class CraftingRecipeBookComponent extends RecipeBookComponent<AbstractCraftingMenu> {
 | |
| 	private static final WidgetSprites FILTER_BUTTON_SPRITES = new WidgetSprites(
 | |
| 		ResourceLocation.withDefaultNamespace("recipe_book/filter_enabled"),
 | |
| 		ResourceLocation.withDefaultNamespace("recipe_book/filter_disabled"),
 | |
| 		ResourceLocation.withDefaultNamespace("recipe_book/filter_enabled_highlighted"),
 | |
| 		ResourceLocation.withDefaultNamespace("recipe_book/filter_disabled_highlighted")
 | |
| 	);
 | |
| 	private static final Component ONLY_CRAFTABLES_TOOLTIP = Component.translatable("gui.recipebook.toggleRecipes.craftable");
 | |
| 	private static final List<RecipeBookComponent.TabInfo> TABS = List.of(
 | |
| 		new RecipeBookComponent.TabInfo(SearchRecipeBookCategory.CRAFTING),
 | |
| 		new RecipeBookComponent.TabInfo(Items.IRON_AXE, Items.GOLDEN_SWORD, RecipeBookCategories.CRAFTING_EQUIPMENT),
 | |
| 		new RecipeBookComponent.TabInfo(Items.BRICKS, RecipeBookCategories.CRAFTING_BUILDING_BLOCKS),
 | |
| 		new RecipeBookComponent.TabInfo(Items.LAVA_BUCKET, Items.APPLE, RecipeBookCategories.CRAFTING_MISC),
 | |
| 		new RecipeBookComponent.TabInfo(Items.REDSTONE, RecipeBookCategories.CRAFTING_REDSTONE)
 | |
| 	);
 | |
| 
 | |
| 	public CraftingRecipeBookComponent(AbstractCraftingMenu menu) {
 | |
| 		super(menu, TABS);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected boolean isCraftingSlot(Slot slot) {
 | |
| 		return this.menu.getResultSlot() == slot || this.menu.getInputGridSlots().contains(slot);
 | |
| 	}
 | |
| 
 | |
| 	private boolean canDisplay(RecipeDisplay recipeDisplay) {
 | |
| 		int i = this.menu.getGridWidth();
 | |
| 		int j = this.menu.getGridHeight();
 | |
| 
 | |
| 		return switch (recipeDisplay) {
 | |
| 			case ShapedCraftingRecipeDisplay shapedCraftingRecipeDisplay -> i >= shapedCraftingRecipeDisplay.width() && j >= shapedCraftingRecipeDisplay.height();
 | |
| 			case ShapelessCraftingRecipeDisplay shapelessCraftingRecipeDisplay -> i * j >= shapelessCraftingRecipeDisplay.ingredients().size();
 | |
| 			default -> false;
 | |
| 		};
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected void fillGhostRecipe(GhostSlots ghostSlots, RecipeDisplay recipeDisplay, ContextMap contextMap) {
 | |
| 		ghostSlots.setResult(this.menu.getResultSlot(), contextMap, recipeDisplay.result());
 | |
| 		switch (recipeDisplay) {
 | |
| 			case ShapedCraftingRecipeDisplay shapedCraftingRecipeDisplay:
 | |
| 				List<Slot> list = this.menu.getInputGridSlots();
 | |
| 				PlaceRecipeHelper.placeRecipe(
 | |
| 					this.menu.getGridWidth(),
 | |
| 					this.menu.getGridHeight(),
 | |
| 					shapedCraftingRecipeDisplay.width(),
 | |
| 					shapedCraftingRecipeDisplay.height(),
 | |
| 					shapedCraftingRecipeDisplay.ingredients(),
 | |
| 					(slotDisplay, ix, jx, k) -> {
 | |
| 						Slot slot = (Slot)list.get(ix);
 | |
| 						ghostSlots.setInput(slot, contextMap, slotDisplay);
 | |
| 					}
 | |
| 				);
 | |
| 				break;
 | |
| 			case ShapelessCraftingRecipeDisplay shapelessCraftingRecipeDisplay:
 | |
| 				label15: {
 | |
| 					List<Slot> list2 = this.menu.getInputGridSlots();
 | |
| 					int i = Math.min(shapelessCraftingRecipeDisplay.ingredients().size(), list2.size());
 | |
| 
 | |
| 					for (int j = 0; j < i; j++) {
 | |
| 						ghostSlots.setInput((Slot)list2.get(j), contextMap, (SlotDisplay)shapelessCraftingRecipeDisplay.ingredients().get(j));
 | |
| 					}
 | |
| 					break label15;
 | |
| 				}
 | |
| 			default:
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected void initFilterButtonTextures() {
 | |
| 		this.filterButton.initTextureValues(FILTER_BUTTON_SPRITES);
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected Component getRecipeFilterName() {
 | |
| 		return ONLY_CRAFTABLES_TOOLTIP;
 | |
| 	}
 | |
| 
 | |
| 	@Override
 | |
| 	protected void selectMatchingRecipes(RecipeCollection possibleRecipes, StackedItemContents stackedItemContents) {
 | |
| 		possibleRecipes.selectRecipes(stackedItemContents, this::canDisplay);
 | |
| 	}
 | |
| }
 |