Crash on 1.20.1 forge when user in creative mode opens inventory
Pecl-ffdd opened this issue · 2 comments
On forge 1.20.1 open inventory in creative mode.
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.");
}
}