Chisels & Bits - For Forge

Chisels & Bits - For Forge

131M Downloads

Crash on 1.20.1 forge when user in creative mode opens inventory

Pecl-ffdd opened this issue · 2 comments

commented

On forge 1.20.1 open inventory in creative mode.

crash-2025-07-17_17.03.13-client.txt

commented

I'm sorry for not adding tags, I didn't see an option to add them.

commented

Quick fix to prevent crashing - ModCreativeTabs.java:

package mod.chiselsandbits.registrars;

import com.communi.suggestu.scena.core.creativetab.ICreativeTabManager;
import com.communi.suggestu.scena.core.registries.IPlatformRegistryManager;
import com.communi.suggestu.scena.core.registries.deferred.IRegistrar;
import com.communi.suggestu.scena.core.registries.deferred.IRegistryObject;
import mod.chiselsandbits.api.blockinformation.IBlockInformation;
import mod.chiselsandbits.api.chiseling.eligibility.IEligibilityManager;
import mod.chiselsandbits.api.client.clipboard.ICreativeClipboardManager;
import mod.chiselsandbits.api.item.bit.IBitItem;
import mod.chiselsandbits.api.item.bit.IBitItemManager;
import mod.chiselsandbits.api.util.LocalStrings;
import mod.chiselsandbits.api.util.constants.Constants;
import mod.chiselsandbits.api.variant.state.IStateVariantManager;
import mod.chiselsandbits.block.ChiseledBlock;
import mod.chiselsandbits.blockinformation.BlockInformation;
import mod.chiselsandbits.api.item.multistate.IMultiStateItemStack;
import mod.chiselsandbits.item.BitBagItem;
import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.item.CreativeModeTab;
import net.minecraft.world.item.DyeColor;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Item; // Import pro Item
import net.minecraft.world.item.Items; // Import pro Items.AIR
import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.FlowingFluid;
import net.minecraft.world.level.material.Fluid;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import net.minecraft.core.registries.BuiltInRegistries;

import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Supplier;

public final class ModCreativeTabs
{
    private static final Logger LOGGER = LogManager.getLogger();
    private static final IRegistrar<CreativeModeTab> REGISTRAR = IRegistrar.create(Registries.CREATIVE_MODE_TAB, Constants.MOD_ID);

    public static IRegistryObject<CreativeModeTab> MAIN = REGISTRAR.register("main", () -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 1)
            .icon(() -> new ItemStack(ModItems.ITEM_CHISEL_NETHERITE.get()))
            .title(LocalStrings.ChiselsAndBitsName.getText())
            .displayItems((parameters, output) -> {
                try {
                    output.accept(new ItemStack(ModItems.ITEM_CHISEL_STONE.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_CHISEL_STONE do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_CHISEL_IRON.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_CHISEL_IRON do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_CHISEL_GOLD.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_CHISEL_GOLD do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_CHISEL_DIAMOND.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_CHISEL_DIAMOND do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_CHISEL_NETHERITE.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_CHISEL_NETHERITE do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_BIT_BAG_DEFAULT.get().asItem(), 1)); // Vytvoříme nový ItemStack bez NBT
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_BIT_BAG_DEFAULT do Creative Tabu: {}", e.getMessage()); }

                for (DyeColor color : DyeColor.values())
                {
                    try {
                        // Vytvoříme nový ItemStack z obarveného BitBagItemu, ale bez NBT dat pro Creative Tab
                        ItemStack dyedBag = BitBagItem.dyeBag(new ItemStack(ModItems.ITEM_BIT_BAG_DYED.get()), color);
                        if (dyedBag.getItem() != null && dyedBag.getItem() != Items.AIR && BuiltInRegistries.ITEM.getKey(dyedBag.getItem()) != null) {
                            output.accept(new ItemStack(dyedBag.getItem(), 1));
                        } else {
                            LOGGER.warn("Obarvená taška na bity s nullovým nebo neregistrovaným Itemem pro barvu: {}", color);
                        }
                    } catch (Exception e) { LOGGER.error("Chyba při přidávání obarvené tašky na bity pro barvu {} do Creative Tabu: {}", color, e.getMessage()); }
                }
                
                // Příklad zakomentování položek, které se nemají zobrazovat v kreativním inventáři
                // try { output.accept(new ItemStack(ModItems.MAGNIFYING_GLASS.get().asItem(), 1)); } catch (Exception e) { LOGGER.error("Chyba při přidávání MAGNIFYING_GLASS do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_BIT_STORAGE.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_BIT_STORAGE do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.ITEM_MODIFICATION_TABLE.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání ITEM_MODIFICATION_TABLE do Creative Tabu: {}", e.getMessage()); }
                // try { output.accept(new ItemStack(ModItems.MEASURING_TAPE.get().asItem(), 1)); } catch (Exception e) { LOGGER.error("Chyba při přidávání MEASURING_TAPE do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.SINGLE_USE_PATTERN_ITEM.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání SINGLE_USE_PATTERN_ITEM do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.MULTI_USE_PATTERN_ITEM.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání MULTI_USE_PATTERN_ITEM do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.QUILL.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání QUILL do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.SEALANT_ITEM.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání SEALANT_ITEM do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.CHISELED_PRINTER.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání CHISELED_PRINTER do Creative Tabu: {}", e.getMessage()); }
                try {
                    output.accept(new ItemStack(ModItems.MONOCLE_ITEM.get().asItem(), 1));
                } catch (Exception e) { LOGGER.error("Chyba při přidávání MONOCLE_ITEM do Creative Tabu: {}", e.getMessage()); }
            })
            .build());

    public static IRegistryObject<CreativeModeTab> BITS = REGISTRAR.register("bits", () -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 1)
            .icon(() -> new ItemStack(ModItems.ITEM_BLOCK_BIT.get()))
            .title(LocalStrings.CreativeTabBits.getText())
            .displayItems((parameters, output) -> {
                IPlatformRegistryManager.getInstance().getBlockRegistry().getValues()
                        .forEach(block -> {
                            if (block instanceof ChiseledBlock)
                                return;

                            BlockState blockState = block.defaultBlockState();
                            final Collection<IBlockInformation> defaultStateVariants = IStateVariantManager.getInstance().getAllDefaultVariants(blockState);

                            if (!defaultStateVariants.isEmpty()) {
                                defaultStateVariants.forEach(blockInformation -> {
                                    final ItemStack resultStack = IBitItemManager.getInstance().create(blockInformation);

                                    if (!resultStack.isEmpty() && resultStack.getItem() instanceof IBitItem) {
                                        try {
                                            // Vytvoříme ZCELA NOVÝ ItemStack s počtem 1 přímo z Itemu.
                                            // Tímto se explicitně zahodí veškerá NBT data z resultStack,
                                            // což by mohlo být příčinou problému.
                                            Item item = resultStack.getItem();
                                            if (item != null && item != Items.AIR && BuiltInRegistries.ITEM.getKey(item) != null) {
                                                output.accept(new ItemStack(item, 1));
                                            } else {
                                                LOGGER.warn("IBitItemManager.create vrátil IBitItem s nullovým, AIR nebo neregistrovaným Itemem pro informace o bloku: {}", blockInformation);
                                            }
                                        } catch (Exception e) {
                                            LOGGER.error("Chyba při přidávání bitu pro blok {} do Creative Tabu: {}", blockInformation, e.getMessage());
                                        }
                                    }
                                });
                                return;
                            }
                            
                            // Musíme se ujistit, že v rozhraní máme pouze klidné tekutiny!
                            if (blockState.getBlock() instanceof LiquidBlock liquidBlock) {
                                final Fluid fluid = liquidBlock.getFluidState(blockState).getType();
                                if (fluid instanceof FlowingFluid flowingFluid) {
                                    blockState = flowingFluid.getSource().defaultFluidState().createLegacyBlock();
                                }
                            }

                            final BlockInformation information = new BlockInformation(blockState, Optional.empty());

                            if (IEligibilityManager.getInstance().canBeChiseled(information)) {
                                final ItemStack resultStack = IBitItemManager.getInstance().create(information);

                                if (!resultStack.isEmpty() && resultStack.getItem() instanceof IBitItem) {
                                    try {
                                        // Vytvoříme ZCELA NOVÝ ItemStack s počtem 1 přímo z Itemu.
                                        // Tímto se explicitně zahodí veškerá NBT data z resultStack,
                                        // což by mohlo být příčinou problému.
                                        Item item = resultStack.getItem();
                                        if (item != null && item != Items.AIR && BuiltInRegistries.ITEM.getKey(item) != null) {
                                            output.accept(new ItemStack(item, 1));
                                        } else {
                                            LOGGER.warn("IBitItemManager.create vrátil IBitItem s nullovým, AIR nebo neregistrovaným Itemem pro informace o bloku: {}", information);
                                        }
                                    } catch (Exception e) {
                                        LOGGER.error("Chyba při přidávání bitu pro blok {} do Creative Tabu: {}", information, e.getMessage());
                                    }
                                }
                            }
                        });
            })
            .build());

    public static IRegistryObject<CreativeModeTab> CLIPBOARD = REGISTRAR.register("clipboard", () -> CreativeModeTab.builder(CreativeModeTab.Row.TOP, 1)
            .icon(() -> new ItemStack(ModItems.PATTERN_SCANNER.get()))
            .title(LocalStrings.CreativeTabClipboard.getText())
            .displayItems((parameters, output) -> {
                ICreativeClipboardManager.getInstance().getClipboard()
                        .stream()
                        .map(IMultiStateItemStack::toBlockStack)
                        .forEach(itemStack -> {
                            try {
                                // Zajišťujeme, že počet stacku je 1 před přijetím.
                                // Vytvoříme nový ItemStack bez NBT dat z původního itemStacku.
                                Item item = itemStack.getItem();
                                if (item != null && item != Items.AIR && BuiltInRegistries.ITEM.getKey(item) != null) {
                                    output.accept(new ItemStack(item, 1));
                                } else {
                                    LOGGER.warn("IMultiStateItemStack.toBlockStack vrátil nullový, AIR nebo neregistrovaný Item pro itemStack: {}", itemStack);
                                }
                            } catch (Exception e) {
                                LOGGER.error("Chyba při přidávání položky z clipboardu do Creative Tabu: {}", e.getMessage());
                            }
                        });
            })
            .build());

    private ModCreativeTabs()
    {
        throw new IllegalStateException("Tried to initialize: ModItemGroups but this is a Utility class.");
    }

    public static void onModConstruction()
    {
        LOGGER.info("Loaded item group configuration.");
    }
}