diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 91818fe5152..b4c194308a9 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -4865,6 +4865,8 @@ "item.gtceu.tool.wire_cutter": "ɹǝʇʇnƆ ǝɹıM %s", "item.gtceu.tool.wrench": "ɥɔuǝɹM %s", "item.gtceu.tool.wrench.tooltip": "sǝuıɥɔɐW ǝןʇuɐɯsıp oʇ ʞɔıןɔ ʇɟǝן pןoH8§", + "item.gtceu.tool_box": "xoᗺ ןoo⟘", + "item.gtceu.tool_box.empty": "˙sןooʇ 6 oʇ dn ǝɹoʇs uɐƆ", "item.gtceu.transistor": "ɹoʇsısuɐɹ⟘", "item.gtceu.transistor.tooltip": "ʇuǝuodɯoƆ ɔıuoɹʇɔǝןƎ ɔısɐᗺㄥ§", "item.gtceu.treated_wood_boat": "ʇɐoᗺ pooM pǝʇɐǝɹ⟘", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index aa05501a15c..61efc9de4bb 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -4865,6 +4865,8 @@ "item.gtceu.tool.wire_cutter": "%s Wire Cutter", "item.gtceu.tool.wrench": "%s Wrench", "item.gtceu.tool.wrench.tooltip": "§8Hold left click to dismantle Machines", + "item.gtceu.tool_box": "Tool Box", + "item.gtceu.tool_box.empty": "Can store up to 9 tools.", "item.gtceu.transistor": "Transistor", "item.gtceu.transistor.tooltip": "§7Basic Electronic Component", "item.gtceu.treated_wood_boat": "Treated Wood Boat", diff --git a/src/generated/resources/assets/gtceu/models/item/tool_box.json b/src/generated/resources/assets/gtceu/models/item/tool_box.json new file mode 100644 index 00000000000..8b5650b729d --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/tool_box.json @@ -0,0 +1,14 @@ +{ + "parent": "minecraft:item/generated", + "overrides": [ + { + "model": "gtceu:item/tool_box/opened", + "predicate": { + "gtceu:tool_box_opened": 1.0 + } + } + ], + "textures": { + "layer0": "gtceu:item/tool_box/closed" + } +} \ No newline at end of file diff --git a/src/generated/resources/assets/gtceu/models/item/tool_box/opened.json b/src/generated/resources/assets/gtceu/models/item/tool_box/opened.json new file mode 100644 index 00000000000..36c4ea72d5e --- /dev/null +++ b/src/generated/resources/assets/gtceu/models/item/tool_box/opened.json @@ -0,0 +1,6 @@ +{ + "parent": "minecraft:item/generated", + "textures": { + "layer0": "gtceu:item/tool_box/opened" + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index ac8df4a1755..b45b01aa784 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; +import com.gregtechceu.gtceu.api.recipe.ingredient.ToolIngredient; import com.gregtechceu.gtceu.api.registry.GTRegistries; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; @@ -68,6 +69,7 @@ import net.minecraftforge.common.TierSortingRegistry; import net.minecraftforge.event.ForgeEventFactory; +import com.google.common.base.Preconditions; import it.unimi.dsi.fastutil.chars.Char2ReferenceMap; import it.unimi.dsi.fastutil.chars.Char2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.chars.CharSet; @@ -145,6 +147,12 @@ public static GTToolType getToolFromSymbol(char symbol) { return symbols.get(symbol); } + public static ToolIngredient getIngredientFromSymbol(char symbol) { + GTToolType toolType = getToolFromSymbol(symbol); + Preconditions.checkNotNull(toolType, "No tool type with symbol '%s'", symbol); + return new ToolIngredient(toolType); + } + @UnmodifiableView public static CharSet getToolSymbols() { return CharSets.unmodifiable(symbols.keySet()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/ToolIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/ToolIngredient.java new file mode 100644 index 00000000000..4d3b20c2795 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/ingredient/ToolIngredient.java @@ -0,0 +1,102 @@ +package com.gregtechceu.gtceu.api.recipe.ingredient; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.item.ToolBoxBehavior; + +import net.minecraft.core.Holder; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.crafting.Ingredient; +import net.minecraftforge.common.crafting.AbstractIngredient; +import net.minecraftforge.common.crafting.IIngredientSerializer; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +public class ToolIngredient extends AbstractIngredient { + + public static final ResourceLocation TYPE = GTCEu.id("tool"); + private final GTToolType toolType; + private ItemStack[] cachedStacks; + + public ToolIngredient(GTToolType toolType) { + super(Stream.of(new Ingredient.TagValue(toolType.craftingTags.get(0)))); + this.toolType = toolType; + } + + @Override + public ItemStack @NotNull [] getItems() { + if (this.cachedStacks == null) { + List list = new ArrayList<>(); + for (Holder holder : BuiltInRegistries.ITEM.getTagOrEmpty(toolType.craftingTags.get(0))) { + list.add(new ItemStack(holder)); + } + list.add(GTItems.TOOL_BOX.asStack()); + this.cachedStacks = list.toArray(ItemStack[]::new); + } + return this.cachedStacks; + } + + @Override + public boolean test(@Nullable ItemStack input) { + if (input == null || input.isEmpty()) return false; + if (input.is(toolType.craftingTags.get(0))) { + return true; + } + if (input.is(GTItems.TOOL_BOX.asItem()) && + ToolBoxBehavior.getAvailableTools(input).contains(toolType.craftingTags.get(0))) { + input.getOrCreateTagElement("last_used_tool").putString("type", toolType.name); + return true; + } + return false; + } + + @Override + public boolean isSimple() { + return false; + } + + @Override + public @NotNull IIngredientSerializer getSerializer() { + return ToolIngredient.Serializer.INSTANCE; + } + + @Override + public @NotNull JsonElement toJson() { + JsonObject json = new JsonObject(); + json.addProperty("type", TYPE.toString()); + json.addProperty("toolType", toolType.name); + return json; + } + + public static class Serializer implements IIngredientSerializer { + + public static final ToolIngredient.Serializer INSTANCE = new ToolIngredient.Serializer(); + + @Override + public @NotNull ToolIngredient parse(FriendlyByteBuf buffer) { + return new ToolIngredient(GTToolType.getTypes().get(buffer.readUtf())); + } + + @Override + public @NotNull ToolIngredient parse(@NotNull JsonObject json) { + return new ToolIngredient(GTToolType.getTypes().get(json.get("toolType").getAsString())); + } + + @Override + public void write(FriendlyByteBuf buffer, ToolIngredient ingredient) { + buffer.writeUtf(ingredient.toolType.name); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java index 0f1a41b1a90..2ccb212801c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java +++ b/src/main/java/com/gregtechceu/gtceu/common/CommonProxy.java @@ -276,6 +276,7 @@ public void commonSetup(FMLCommonSetupEvent event) { CraftingHelper.register(IntProviderIngredient.TYPE, IntProviderIngredient.SERIALIZER); CraftingHelper.register(NBTPredicateIngredient.TYPE, NBTPredicateIngredient.Serializer.INSTANCE); CraftingHelper.register(FluidContainerIngredient.TYPE, FluidContainerIngredient.SERIALIZER); + CraftingHelper.register(ToolIngredient.TYPE, ToolIngredient.Serializer.INSTANCE); // register the map ingredient converters for all of our ingredients MapIngredientTypeManager.registerMapIngredient(FluidIngredient.class, FluidTagMapIngredient::from); diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java index 424ac52beee..6cfa79407d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTItems.java @@ -2171,6 +2171,24 @@ public static ItemEntry createFluidCell(Material mat, int capacit public static ItemEntry WIRELESS; public static ItemEntry CAMERA; + public static ItemEntry TOOL_BOX = REGISTRATE.item("tool_box", ComponentItem::create) + .lang("Tool Box") + .properties(p -> p.stacksTo(1)) + .onRegister(attach(ToolBoxBehavior.INSTANCE)) + .model((ctx, prov) -> { + var rootModel = prov.generated(ctx::getEntry, prov.modLoc("item/tool_box/closed")); + prov.getBuilder("item/tool_box/opened") + .parent(new ModelFile.UncheckedModelFile("item/generated")) + .texture("layer0", prov.modLoc("item/tool_box/opened")); + rootModel.override() + .predicate(ToolBoxBehavior.MODEL_OVERRIDE_KEY, 1.0f) + .model(new ModelFile.UncheckedModelFile(prov.modLoc("item/tool_box/opened"))) + .end(); + }) + .onRegister(modelPredicate(ToolBoxBehavior.MODEL_OVERRIDE_KEY, + () -> () -> (stack, level, entity, layer) -> ToolBoxBehavior.isOpened(stack) ? 1.0f : 0.0f)) + .register(); + public static ItemEntry TERMINAL = REGISTRATE.item("terminal", ComponentItem::create) .lang("Terminal") .properties(p -> p.stacksTo(1)) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index fd4de6fb9cb..49f33895e58 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -59,8 +59,11 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth) return createTitleBar(definition, panelWidth, background); } - public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { - var displayItem = definition.asStack(); + public static Flow createTitleBar(ItemStack displayItem, int panelWidth) { + return createTitleBar(displayItem, panelWidth, GTGuiTextures.BACKGROUND); + } + + public static Flow createTitleBar(ItemStack displayItem, int panelWidth, UITexture background) { String machineName = displayItem.getHoverName().getString(); machineName = machineName.replaceAll("§.", "").trim(); @@ -94,6 +97,10 @@ public static Flow createTitleBar(MachineDefinition definition, int panelWidth, .size(Math.min(minPanelWidth, textTitleWidth), textHeight)); } + public static Flow createTitleBar(MachineDefinition definition, int panelWidth, UITexture background) { + return createTitleBar(definition.asStack(), panelWidth, background); + } + public static ToggleButton createPowerButton(BooleanSupplier getter, BooleanConsumer setter, PanelSyncManager syncManager) { BooleanSyncValue power = new BooleanSyncValue(getter, setter); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/ToolBoxBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/ToolBoxBehavior.java new file mode 100644 index 00000000000..4b52b391b68 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/item/ToolBoxBehavior.java @@ -0,0 +1,207 @@ +package com.gregtechceu.gtceu.common.item; + +import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.capability.IElectricItem; +import com.gregtechceu.gtceu.api.item.IGTTool; +import com.gregtechceu.gtceu.api.item.component.IAddInformation; +import com.gregtechceu.gtceu.api.item.component.IInteractionItem; +import com.gregtechceu.gtceu.api.item.component.IRecipeRemainder; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.item.tool.ToolHelper; +import com.gregtechceu.gtceu.api.mui.base.IItemUIHolder; +import com.gregtechceu.gtceu.api.mui.factory.PlayerInventoryGuiData; +import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; +import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; +import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; +import com.gregtechceu.gtceu.client.mui.screen.UISettings; +import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.utils.GTUtil; + +import net.minecraft.ChatFormatting; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.tags.TagKey; +import net.minecraft.world.item.Item; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.TooltipFlag; +import net.minecraft.world.level.Level; +import net.minecraftforge.common.ForgeHooks; +import net.minecraftforge.items.ItemStackHandler; + +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import static com.gregtechceu.gtceu.api.item.component.ElectricStats.addCurrentChargeTooltip; +import static dev.emi.emi.search.EmiSearch.tooltips; + +public class ToolBoxBehavior implements IInteractionItem, IItemUIHolder, IRecipeRemainder, IAddInformation { + + private static final int SLOTS = 9; + + public static final ToolBoxBehavior INSTANCE = new ToolBoxBehavior(); + private static final String INV_TAG = "inventory"; + private static final String SYNC_KEY = "toolbox_slot"; + + private ToolBoxBehavior() {} + + public static final ResourceLocation MODEL_OVERRIDE_KEY = new ResourceLocation(GTCEu.MOD_ID, "tool_box_opened"); + + public static boolean isOpened(ItemStack stack) { + return stack.hasTag() && stack.getTag().getBoolean("is_opened"); + } + + public static CustomItemStackHandler getInventory(ItemStack stack) { + CustomItemStackHandler handler = new CustomItemStackHandler(SLOTS); + + handler.setFilter(s -> { + if (s.getItem() instanceof IGTTool tool) { + var toolType = tool.getToolType(); + return toolType != null; + } + return false; + }); + + CompoundTag tag = stack.getTag(); + if (tag != null && tag.contains(INV_TAG)) { + handler.deserializeNBT(tag.getCompound(INV_TAG)); + } + + handler.setOnContentsChanged(() -> { + stack.getOrCreateTag().put(INV_TAG, handler.serializeNBT()); + }); + + return handler; + } + + @Override + public ModularPanel buildUI(PlayerInventoryGuiData data, PanelSyncManager syncManager, UISettings settings) { + ItemStack stack = data.getUsedItemStack(); + CustomItemStackHandler inventory = getInventory(stack); + // TODO: Open/closed state + + // stack.getOrCreateTag().putBoolean("is_opened", true); + syncManager.registerSlotGroup("toolbox_slots", SLOTS); + for (int i = 0; i < SLOTS; i++) { + syncManager.itemSlot(SYNC_KEY, i, new ModularSlot(inventory, i).slotGroup("toolbox_slots")); + } + + ParentWidget grid = new ParentWidget<>() + .size(18 * SLOTS, 18); + for (int i = 0; i < SLOTS; i++) { + grid.child(new ItemSlot().syncHandler(SYNC_KEY, i).pos(i * 18, 0)); + } + + ModularPanel panel = new ModularPanel("tool_box") + .height(113) + .child(GTMuiWidgets.createTitleBar(stack, 172).right(48)) + .child(grid.top(7).left(7)); + + panel.bindPlayerInventory(); + + syncManager.bindPlayerInventory(data.getPlayer(), (inv, index) -> { + ModularSlot slot = new ModularSlot(inv, index); + if (inv.getStackInSlot(index) == stack) { + slot.accessibility(false, false); + } + return slot; + }); + + // panel.onCloseAction(() -> { + // ItemStack finalStack = data.getUsedItemStack(); + // if (!finalStack.isEmpty()) { + // finalStack.getOrCreateTag().putBoolean("is_opened", false); + // finalStack.getOrCreateTag().put(INV_TAG, inventory.serializeNBT()); + // data.getPlayer().setItemInHand(data.getPlayer().getUsedItemHand(), finalStack); + // } + // }); + return panel; + } + + @Override + public ItemStack getRecipeRemained(ItemStack stack) { + ItemStack result = stack.copy(); + ItemStackHandler handler = getInventory(result); + boolean changed = false; + String typeName = stack.getOrCreateTagElement("last_used_tool").getString("type"); + GTToolType lastType = GTToolType.getTypes().get(typeName); + if (lastType == null) return result; + + var player = ForgeHooks.getCraftingPlayer(); + + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack inner = handler.getStackInSlot(i); + if (inner.getItem() instanceof IGTTool tool) { + if (tool.getToolType().craftingTags.get(0).equals(lastType.craftingTags.get(0))) { + ToolHelper.damageItemWhenCrafting(inner, player); + handler.setStackInSlot(i, inner); + changed = true; + break; + } + } + } + + if (changed) { + result.getOrCreateTag().put(INV_TAG, handler.serializeNBT()); + } + return result; + } + + public static Set> getAvailableTools(ItemStack stack) { + CustomItemStackHandler inventory = getInventory(stack); + Set> result = new HashSet<>(); + for (int i = 0; i < inventory.getSlots(); i++) { + if (inventory.getStackInSlot(i).getItem() instanceof IGTTool tool) { + result.add(tool.getToolType().craftingTags.get(0)); + } + } + return result; + } + + private static List getTooltip(ItemStack inner, @Nullable Level level) { + List tooltip = new ArrayList<>(); + tooltip.add(Component.literal(" • ").append(inner.getHoverName().copy() + .append(Component.literal( + " §a%d / %d".formatted(inner.getMaxDamage() - inner.getDamageValue(), inner.getMaxDamage()))))); + + if (inner.getItem() instanceof IGTTool tool) { + if (tool.isElectric()) { + IElectricItem item = GTCapabilityHelper.getElectricItem(inner); + if (item != null) { + if (GTUtil.isShiftDown()) { + addCurrentChargeTooltip(tooltip, item.getCharge(), item.getMaxCharge(), item.getTier(), false); + tooltip.set(tooltip.size() - 1, + Component.literal(" ").append(tooltip.get(tooltip.size() - 1))); + } + } + } + } + + return tooltip; + } + + @Override + public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltip, TooltipFlag flag) { + CustomItemStackHandler handler = getInventory(stack); + List tooltips = new ArrayList(); + for (int i = 0; i < handler.getSlots(); i++) { + ItemStack inner = handler.getStackInSlot(i); + if (!inner.isEmpty()) { + tooltips.addAll(getTooltip(inner, level)); + } + } + if (tooltips.isEmpty()) { + tooltip.add(Component.translatable("item.gtceu.tool_box.empty").withStyle(ChatFormatting.GRAY)); + } else { + tooltip.addAll(tooltips); + } + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java index 65059797241..08dd06702aa 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java +++ b/src/main/java/com/gregtechceu/gtceu/data/lang/ItemLang.java @@ -61,6 +61,7 @@ private static void initItemNames(RegistrateLangProvider provider) { private static void initItemTooltips(RegistrateLangProvider provider) { provider.add("item.gtceu.empty_mold.tooltip", "§7Raw Plate to make Molds and Extrude Shapes"); provider.add("item.gtceu.nano_saber.tooltip", "§7Ryujin no ken wo kurae!"); + provider.add("item.gtceu.tool_box.empty", "Can store up to 9 tools."); provider.add("item.gtceu.plate_casting_mold.tooltip", "§7Mold for making Plates"); provider.add("item.gtceu.casing_casting_mold.tooltip", "§7Mold for making Item Casings"); provider.add("item.gtceu.gear_casting_mold.tooltip", "§7Mold for making Gears"); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ee3b7ff2257..6f370673ca0 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -344,7 +344,7 @@ public static void addShapedRecipe(Consumer provider, boolean se } for (var it = foundTools.iterator(); it.hasNext();) { char c = it.nextChar(); - builder.define(c, ToolHelper.getToolFromSymbol(c).craftingTags.get(0)); + builder.define(c, ToolHelper.getIngredientFromSymbol(c)); } builder.save(provider); @@ -436,7 +436,7 @@ public static void addShapedEnergyTransferRecipe(Consumer provid } for (var it = foundTools.iterator(); it.hasNext();) { char c = it.nextChar(); - builder.define(c, ToolHelper.getToolFromSymbol(c).craftingTags.get(0)); + builder.define(c, ToolHelper.getIngredientFromSymbol(c)); } builder.save(provider); @@ -508,7 +508,7 @@ public static void addShapedFluidContainerRecipe(Consumer provid } for (var it = foundTools.iterator(); it.hasNext();) { char c = it.nextChar(); - builder.define(c, ToolHelper.getToolFromSymbol(c).craftingTags.get(0)); + builder.define(c, ToolHelper.getIngredientFromSymbol(c)); } builder.save(provider); @@ -575,7 +575,7 @@ public static void addShapelessRecipe(Consumer provider, @NotNul } else if (content instanceof ItemProviderEntry entry) { builder.requires(entry.asStack()); } else if (content instanceof Character c) { - builder.requires(ToolHelper.getToolFromSymbol(c).craftingTags.get(0)); + builder.requires(ToolHelper.getIngredientFromSymbol(c)); } } builder.save(provider); diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java index df745a5e92b..65991491a44 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/misc/MiscRecipeLoader.java @@ -53,6 +53,9 @@ public static void init(Consumer provider) { new MaterialEntry(dust, Tin), new MaterialEntry(dust, Tin), new MaterialEntry(dust, Lead)); + // Tool Box recipe + VanillaRecipeHelper.addShapedRecipe(provider, true, "tool_box", TOOL_BOX.asStack(), + "SGS", "SSS", " ", 'S', new MaterialEntry(plate, Bronze), 'G', Tags.Items.CHESTS_WOODEN); MIXER_RECIPES.recipeBuilder("fermented_spider_eye_brown").duration(100).EUt(VA[ULV]) .inputItems(dust, Sugar) diff --git a/src/main/resources/assets/gtceu/textures/item/tool_box/closed.png b/src/main/resources/assets/gtceu/textures/item/tool_box/closed.png new file mode 100644 index 00000000000..8d02372e6d0 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/tool_box/closed.png differ diff --git a/src/main/resources/assets/gtceu/textures/item/tool_box/opened.png b/src/main/resources/assets/gtceu/textures/item/tool_box/opened.png new file mode 100644 index 00000000000..e430a1d2f00 Binary files /dev/null and b/src/main/resources/assets/gtceu/textures/item/tool_box/opened.png differ