Here is my code
@Mod(Main.modId)
public final class Main {
public static final String modId = "tfcworldmap";
public static final Logger logger = LogManager.getLogger(modId);
private static final DeferredRegister<Item> itemRegister = DeferredRegister.create(ForgeRegistries.ITEMS, modId);
private static final DeferredRegister<CreativeModeTab> creativeModTabRegister = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, modId);
private static final DeferredRegister<MenuType<?>> menuRegister = DeferredRegister.create(ForgeRegistries.MENU_TYPES, modId);
public Main() {
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
itemRegister.register(modEventBus);
creativeModTabRegister.register(modEventBus);
menuRegister.register(modEventBus);
RegistryObjects.mapItem = itemRegister.register("map", MapItem::new);
RegistryObjects.atlasItem = itemRegister.register("atlas", AtlasItem::new);
RegistryObjects.mainCreativeModTab = creativeModTabRegister.register("main", () -> CreativeModeTab.builder()
.title(Component.translatable(String.format("creative_mod_tab.%s.main", Main.modId)))
.icon(() -> new ItemStack(RegistryObjects.atlasItem.get()))
.displayItems((param, output) -> {
output.accept(RegistryObjects.mapItem.get());
output.accept(RegistryObjects.atlasItem.get());
})
.build());
RegistryObjects.atlasMenu = menuRegister.register("atlas", () -> IForgeMenuType.create(AtlasMenu::new));
}
public static class RegistryObjects {
public static RegistryObject<Item> mapItem;
public static RegistryObject<Item> atlasItem;
public static RegistryObject<CreativeModeTab> mainCreativeModTab;
public static RegistryObject<MenuType<AtlasMenu>> atlasMenu;
}
}
public class AtlasMenu extends AbstractContainerMenu {
protected AtlasMenu(int id, Inventory inventory) {
super(Main.RegistryObjects.atlasMenu.get(), id);
}
protected AtlasMenu(int id, Inventory inventory, FriendlyByteBuf buf) {
super(Main.RegistryObjects.atlasMenu.get(), id);
}
@Override
public ItemStack quickMoveStack(@Nonnull Player player, int index) {
throw new UnsupportedOperationException("Unimplemented method 'quickMoveStack'");
}
@Override
public boolean stillValid(@Nonnull Player player) {
return true;
}
public static class Provider implements MenuProvider {
@Override
@Nullable
public AbstractContainerMenu createMenu(int id, @Nonnull Inventory inventory, @Nonnull Player player) {
return new AtlasMenu(id , inventory);
}
@Override
public Component getDisplayName() {
return Component.translatable("menu.tfcworldmap.atlas.title");
}
}
}
public class AtlasScreen extends AbstractContainerScreen<AtlasMenu> {
public AtlasScreen(AtlasMenu menu, Inventory inventory, Component title) {
super(menu, inventory, title);
}
@Override
public boolean isPauseScreen() {
return false;
}
@Override
protected void renderBg(@Nonnull GuiGraphics guiGraphics, float partialTick, int mouseX, int mouseY) {
return;
}
}
public class AtlasItem extends Item {
public AtlasItem() {
super(new Item.Properties()
.rarity(Rarity.UNCOMMON)
.stacksTo(1));
}
@Override
public InteractionResultHolder<ItemStack> use(@Nonnull Level level, @Nonnull Player player, @Nonnull InteractionHand usedHand) {
ItemStack itemStack = player.getItemInHand(usedHand);
if (itemStack.getTagElement("countMap") == null) {
itemStack.addTagElement("countMap", IntTag.valueOf(0));
}
if (itemStack.getTagElement("countInk") == null) {
itemStack.addTagElement("countInk", DoubleTag.valueOf(0));
}
if (!level.isClientSide) {
ServerPlayer serverPlayer = (ServerPlayer)player;
NetworkHooks.openScreen(serverPlayer, new AtlasMenu.Provider());
}
return InteractionResultHolder.sidedSuccess(itemStack, level.isClientSide);
}
}