package net.minecraft.client.gui.screens.inventory; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.mojang.blaze3d.platform.InputConstants; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; import javax.annotation.Nullable; import net.minecraft.ChatFormatting; import net.minecraft.client.HotbarManager; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.components.EditBox; import net.minecraft.client.multiplayer.ClientPacketListener; import net.minecraft.client.multiplayer.SessionSearchTrees; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.player.inventory.Hotbar; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.searchtree.SearchTree; import net.minecraft.core.HolderLookup; import net.minecraft.core.HolderSet; import net.minecraft.core.NonNullList; import net.minecraft.core.RegistryAccess; import net.minecraft.core.component.DataComponents; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.chat.CommonComponents; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.util.Mth; import net.minecraft.util.Unit; import net.minecraft.world.Container; import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.flag.FeatureFlagSet; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.ClickType; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.CreativeModeTab; import net.minecraft.world.item.CreativeModeTabs; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraft.world.item.TooltipFlag; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @OnlyIn(Dist.CLIENT) public class CreativeModeInventoryScreen extends AbstractContainerScreen { private static final ResourceLocation SCROLLER_SPRITE = ResourceLocation.withDefaultNamespace("container/creative_inventory/scroller"); private static final ResourceLocation SCROLLER_DISABLED_SPRITE = ResourceLocation.withDefaultNamespace("container/creative_inventory/scroller_disabled"); private static final ResourceLocation[] UNSELECTED_TOP_TABS = new ResourceLocation[]{ ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_1"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_2"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_3"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_4"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_5"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_6"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_unselected_7") }; private static final ResourceLocation[] SELECTED_TOP_TABS = new ResourceLocation[]{ ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_1"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_2"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_3"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_4"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_5"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_6"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_top_selected_7") }; private static final ResourceLocation[] UNSELECTED_BOTTOM_TABS = new ResourceLocation[]{ ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_1"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_2"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_3"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_4"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_5"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_6"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_unselected_7") }; private static final ResourceLocation[] SELECTED_BOTTOM_TABS = new ResourceLocation[]{ ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_1"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_2"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_3"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_4"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_5"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_6"), ResourceLocation.withDefaultNamespace("container/creative_inventory/tab_bottom_selected_7") }; private static final int NUM_ROWS = 5; private static final int NUM_COLS = 9; private static final int TAB_WIDTH = 26; private static final int TAB_HEIGHT = 32; private static final int SCROLLER_WIDTH = 12; private static final int SCROLLER_HEIGHT = 15; static final SimpleContainer CONTAINER = new SimpleContainer(45); private static final Component TRASH_SLOT_TOOLTIP = Component.translatable("inventory.binSlot"); private static final int TEXT_COLOR = 16777215; private static CreativeModeTab selectedTab = CreativeModeTabs.getDefaultTab(); private float scrollOffs; private boolean scrolling; private EditBox searchBox; @Nullable private List originalSlots; @Nullable private Slot destroyItemSlot; private CreativeInventoryListener listener; private boolean ignoreTextInput; private boolean hasClickedOutside; private final Set> visibleTags = new HashSet<>(); private final boolean displayOperatorCreativeTab; private final EffectsInInventory effects; public CreativeModeInventoryScreen(LocalPlayer p_344408_, FeatureFlagSet p_260074_, boolean p_259569_) { super(new CreativeModeInventoryScreen.ItemPickerMenu(p_344408_), p_344408_.getInventory(), CommonComponents.EMPTY); p_344408_.containerMenu = this.menu; this.imageHeight = 136; this.imageWidth = 195; this.displayOperatorCreativeTab = p_259569_; this.tryRebuildTabContents(p_344408_.connection.searchTrees(), p_260074_, this.hasPermissions(p_344408_), p_344408_.level().registryAccess()); this.effects = new EffectsInInventory(this); } private boolean hasPermissions(Player p_259959_) { return p_259959_.canUseGameMasterBlocks() && this.displayOperatorCreativeTab; } private void tryRefreshInvalidatedTabs(FeatureFlagSet p_259501_, boolean p_259713_, HolderLookup.Provider p_270898_) { ClientPacketListener clientpacketlistener = this.minecraft.getConnection(); if (this.tryRebuildTabContents(clientpacketlistener != null ? clientpacketlistener.searchTrees() : null, p_259501_, p_259713_, p_270898_)) { for (CreativeModeTab creativemodetab : CreativeModeTabs.allTabs()) { Collection collection = creativemodetab.getDisplayItems(); if (creativemodetab == selectedTab) { if (creativemodetab.getType() == CreativeModeTab.Type.CATEGORY && collection.isEmpty()) { this.selectTab(CreativeModeTabs.getDefaultTab()); } else { this.refreshCurrentTabContents(collection); } } } } } private boolean tryRebuildTabContents(@Nullable SessionSearchTrees p_342511_, FeatureFlagSet p_344947_, boolean p_345070_, HolderLookup.Provider p_343930_) { if (!CreativeModeTabs.tryRebuildTabContents(p_344947_, p_345070_, p_343930_)) { return false; } else { if (p_342511_ != null) { List list = List.copyOf(CreativeModeTabs.searchTab().getDisplayItems()); p_342511_.updateCreativeTooltips(p_343930_, list); p_342511_.updateCreativeTags(list); } return true; } } private void refreshCurrentTabContents(Collection p_261591_) { int i = this.menu.getRowIndexForScroll(this.scrollOffs); this.menu.items.clear(); if (selectedTab.getType() == CreativeModeTab.Type.SEARCH) { this.refreshSearchResults(); } else { this.menu.items.addAll(p_261591_); } this.scrollOffs = this.menu.getScrollForRowIndex(i); this.menu.scrollTo(this.scrollOffs); } @Override public void containerTick() { super.containerTick(); if (this.minecraft != null) { LocalPlayer localplayer = this.minecraft.player; if (localplayer != null) { this.tryRefreshInvalidatedTabs(localplayer.connection.enabledFeatures(), this.hasPermissions(localplayer), localplayer.level().registryAccess()); if (!localplayer.hasInfiniteMaterials()) { this.minecraft.setScreen(new InventoryScreen(localplayer)); } } } } @Override protected void slotClicked(@Nullable Slot p_98556_, int p_98557_, int p_98558_, ClickType p_98559_) { if (this.isCreativeSlot(p_98556_)) { this.searchBox.moveCursorToEnd(false); this.searchBox.setHighlightPos(0); } boolean flag = p_98559_ == ClickType.QUICK_MOVE; p_98559_ = p_98557_ == -999 && p_98559_ == ClickType.PICKUP ? ClickType.THROW : p_98559_; if (p_98559_ != ClickType.THROW || this.minecraft.player.canDropItems()) { this.onMouseClickAction(p_98556_, p_98559_); if (p_98556_ == null && selectedTab.getType() != CreativeModeTab.Type.INVENTORY && p_98559_ != ClickType.QUICK_CRAFT) { if (!this.menu.getCarried().isEmpty() && this.hasClickedOutside) { if (!this.minecraft.player.canDropItems()) { return; } if (p_98558_ == 0) { this.minecraft.player.drop(this.menu.getCarried(), true); this.minecraft.gameMode.handleCreativeModeItemDrop(this.menu.getCarried()); this.menu.setCarried(ItemStack.EMPTY); } if (p_98558_ == 1) { ItemStack itemstack5 = this.menu.getCarried().split(1); this.minecraft.player.drop(itemstack5, true); this.minecraft.gameMode.handleCreativeModeItemDrop(itemstack5); } } } else { if (p_98556_ != null && !p_98556_.mayPickup(this.minecraft.player)) { return; } if (p_98556_ == this.destroyItemSlot && flag) { for (int i = 0; i < this.minecraft.player.inventoryMenu.getItems().size(); i++) { this.minecraft.player.inventoryMenu.getSlot(i).set(ItemStack.EMPTY); this.minecraft.gameMode.handleCreativeModeItemAdd(ItemStack.EMPTY, i); } } else if (selectedTab.getType() == CreativeModeTab.Type.INVENTORY) { if (p_98556_ == this.destroyItemSlot) { this.menu.setCarried(ItemStack.EMPTY); } else if (p_98559_ == ClickType.THROW && p_98556_ != null && p_98556_.hasItem()) { ItemStack itemstack = p_98556_.remove(p_98558_ == 0 ? 1 : p_98556_.getItem().getMaxStackSize()); ItemStack itemstack1 = p_98556_.getItem(); this.minecraft.player.drop(itemstack, true); this.minecraft.gameMode.handleCreativeModeItemDrop(itemstack); this.minecraft.gameMode.handleCreativeModeItemAdd(itemstack1, ((CreativeModeInventoryScreen.SlotWrapper)p_98556_).target.index); } else if (p_98559_ == ClickType.THROW && p_98557_ == -999 && !this.menu.getCarried().isEmpty()) { this.minecraft.player.drop(this.menu.getCarried(), true); this.minecraft.gameMode.handleCreativeModeItemDrop(this.menu.getCarried()); this.menu.setCarried(ItemStack.EMPTY); } else { this.minecraft .player .inventoryMenu .clicked( p_98556_ == null ? p_98557_ : ((CreativeModeInventoryScreen.SlotWrapper)p_98556_).target.index, p_98558_, p_98559_, this.minecraft.player ); this.minecraft.player.inventoryMenu.broadcastChanges(); } } else if (p_98559_ != ClickType.QUICK_CRAFT && p_98556_.container == CONTAINER) { ItemStack itemstack4 = this.menu.getCarried(); ItemStack itemstack6 = p_98556_.getItem(); if (p_98559_ == ClickType.SWAP) { if (!itemstack6.isEmpty()) { this.minecraft.player.getInventory().setItem(p_98558_, itemstack6.copyWithCount(itemstack6.getMaxStackSize())); this.minecraft.player.inventoryMenu.broadcastChanges(); } return; } if (p_98559_ == ClickType.CLONE) { if (this.menu.getCarried().isEmpty() && p_98556_.hasItem()) { ItemStack itemstack8 = p_98556_.getItem(); this.menu.setCarried(itemstack8.copyWithCount(itemstack8.getMaxStackSize())); } return; } if (p_98559_ == ClickType.THROW) { if (!itemstack6.isEmpty()) { ItemStack itemstack7 = itemstack6.copyWithCount(p_98558_ == 0 ? 1 : itemstack6.getMaxStackSize()); this.minecraft.player.drop(itemstack7, true); this.minecraft.gameMode.handleCreativeModeItemDrop(itemstack7); } return; } if (!itemstack4.isEmpty() && !itemstack6.isEmpty() && ItemStack.isSameItemSameComponents(itemstack4, itemstack6)) { if (p_98558_ == 0) { if (flag) { itemstack4.setCount(itemstack4.getMaxStackSize()); } else if (itemstack4.getCount() < itemstack4.getMaxStackSize()) { itemstack4.grow(1); } } else { itemstack4.shrink(1); } } else if (!itemstack6.isEmpty() && itemstack4.isEmpty()) { int l = flag ? itemstack6.getMaxStackSize() : itemstack6.getCount(); this.menu.setCarried(itemstack6.copyWithCount(l)); } else if (p_98558_ == 0) { this.menu.setCarried(ItemStack.EMPTY); } else if (!this.menu.getCarried().isEmpty()) { this.menu.getCarried().shrink(1); } } else if (this.menu != null) { ItemStack itemstack3 = p_98556_ == null ? ItemStack.EMPTY : this.menu.getSlot(p_98556_.index).getItem(); this.menu.clicked(p_98556_ == null ? p_98557_ : p_98556_.index, p_98558_, p_98559_, this.minecraft.player); if (AbstractContainerMenu.getQuickcraftHeader(p_98558_) == 2) { for (int j = 0; j < 9; j++) { this.minecraft.gameMode.handleCreativeModeItemAdd(this.menu.getSlot(45 + j).getItem(), 36 + j); } } else if (p_98556_ != null && Inventory.isHotbarSlot(p_98556_.getContainerSlot()) && selectedTab.getType() != CreativeModeTab.Type.INVENTORY) { if (p_98559_ == ClickType.THROW && !itemstack3.isEmpty() && !this.menu.getCarried().isEmpty()) { int k = p_98558_ == 0 ? 1 : itemstack3.getCount(); ItemStack itemstack2 = itemstack3.copyWithCount(k); itemstack3.shrink(k); this.minecraft.player.drop(itemstack2, true); this.minecraft.gameMode.handleCreativeModeItemDrop(itemstack2); } this.minecraft.player.inventoryMenu.broadcastChanges(); } } } } } private boolean isCreativeSlot(@Nullable Slot p_98554_) { return p_98554_ != null && p_98554_.container == CONTAINER; } @Override protected void init() { if (this.minecraft.player.hasInfiniteMaterials()) { super.init(); this.searchBox = new EditBox(this.font, this.leftPos + 82, this.topPos + 6, 80, 9, Component.translatable("itemGroup.search")); this.searchBox.setMaxLength(50); this.searchBox.setBordered(false); this.searchBox.setVisible(false); this.searchBox.setTextColor(16777215); this.addWidget(this.searchBox); CreativeModeTab creativemodetab = selectedTab; selectedTab = CreativeModeTabs.getDefaultTab(); this.selectTab(creativemodetab); this.minecraft.player.inventoryMenu.removeSlotListener(this.listener); this.listener = new CreativeInventoryListener(this.minecraft); this.minecraft.player.inventoryMenu.addSlotListener(this.listener); if (!selectedTab.shouldDisplay()) { this.selectTab(CreativeModeTabs.getDefaultTab()); } } else { this.minecraft.setScreen(new InventoryScreen(this.minecraft.player)); } } @Override public void resize(Minecraft p_98595_, int p_98596_, int p_98597_) { int i = this.menu.getRowIndexForScroll(this.scrollOffs); String s = this.searchBox.getValue(); this.init(p_98595_, p_98596_, p_98597_); this.searchBox.setValue(s); if (!this.searchBox.getValue().isEmpty()) { this.refreshSearchResults(); } this.scrollOffs = this.menu.getScrollForRowIndex(i); this.menu.scrollTo(this.scrollOffs); } @Override public void removed() { super.removed(); if (this.minecraft.player != null && this.minecraft.player.getInventory() != null) { this.minecraft.player.inventoryMenu.removeSlotListener(this.listener); } } @Override public boolean charTyped(char p_98521_, int p_98522_) { if (this.ignoreTextInput) { return false; } else if (selectedTab.getType() != CreativeModeTab.Type.SEARCH) { return false; } else { String s = this.searchBox.getValue(); if (this.searchBox.charTyped(p_98521_, p_98522_)) { if (!Objects.equals(s, this.searchBox.getValue())) { this.refreshSearchResults(); } return true; } else { return false; } } } @Override public boolean keyPressed(int p_98547_, int p_98548_, int p_98549_) { this.ignoreTextInput = false; if (selectedTab.getType() != CreativeModeTab.Type.SEARCH) { if (this.minecraft.options.keyChat.matches(p_98547_, p_98548_)) { this.ignoreTextInput = true; this.selectTab(CreativeModeTabs.searchTab()); return true; } else { return super.keyPressed(p_98547_, p_98548_, p_98549_); } } else { boolean flag = !this.isCreativeSlot(this.hoveredSlot) || this.hoveredSlot.hasItem(); boolean flag1 = InputConstants.getKey(p_98547_, p_98548_).getNumericKeyValue().isPresent(); if (flag && flag1 && this.checkHotbarKeyPressed(p_98547_, p_98548_)) { this.ignoreTextInput = true; return true; } else { String s = this.searchBox.getValue(); if (this.searchBox.keyPressed(p_98547_, p_98548_, p_98549_)) { if (!Objects.equals(s, this.searchBox.getValue())) { this.refreshSearchResults(); } return true; } else { return this.searchBox.isFocused() && this.searchBox.isVisible() && p_98547_ != 256 ? true : super.keyPressed(p_98547_, p_98548_, p_98549_); } } } } @Override public boolean keyReleased(int p_98612_, int p_98613_, int p_98614_) { this.ignoreTextInput = false; return super.keyReleased(p_98612_, p_98613_, p_98614_); } private void refreshSearchResults() { this.menu.items.clear(); this.visibleTags.clear(); String s = this.searchBox.getValue(); if (s.isEmpty()) { this.menu.items.addAll(selectedTab.getDisplayItems()); } else { ClientPacketListener clientpacketlistener = this.minecraft.getConnection(); if (clientpacketlistener != null) { SessionSearchTrees sessionsearchtrees = clientpacketlistener.searchTrees(); SearchTree searchtree; if (s.startsWith("#")) { s = s.substring(1); searchtree = sessionsearchtrees.creativeTagSearch(); this.updateVisibleTags(s); } else { searchtree = sessionsearchtrees.creativeNameSearch(); } this.menu.items.addAll(searchtree.search(s.toLowerCase(Locale.ROOT))); } } this.scrollOffs = 0.0F; this.menu.scrollTo(0.0F); } private void updateVisibleTags(String p_98620_) { int i = p_98620_.indexOf(58); Predicate predicate; if (i == -1) { predicate = p_98609_ -> p_98609_.getPath().contains(p_98620_); } else { String s = p_98620_.substring(0, i).trim(); String s1 = p_98620_.substring(i + 1).trim(); predicate = p_98606_ -> p_98606_.getNamespace().contains(s) && p_98606_.getPath().contains(s1); } BuiltInRegistries.ITEM .getTags() .map(HolderSet.Named::key) .filter(p_205410_ -> predicate.test(p_205410_.location())) .forEach(this.visibleTags::add); } @Override protected void renderLabels(GuiGraphics p_283168_, int p_281774_, int p_281466_) { if (selectedTab.showTitle()) { p_283168_.drawString(this.font, selectedTab.getDisplayName(), 8, 6, 4210752, false); } } @Override public boolean mouseClicked(double p_98531_, double p_98532_, int p_98533_) { if (p_98533_ == 0) { double d0 = p_98531_ - this.leftPos; double d1 = p_98532_ - this.topPos; for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { if (this.checkTabClicked(creativemodetab, d0, d1)) { return true; } } if (selectedTab.getType() != CreativeModeTab.Type.INVENTORY && this.insideScrollbar(p_98531_, p_98532_)) { this.scrolling = this.canScroll(); return true; } } return super.mouseClicked(p_98531_, p_98532_, p_98533_); } @Override public boolean mouseReleased(double p_98622_, double p_98623_, int p_98624_) { if (p_98624_ == 0) { double d0 = p_98622_ - this.leftPos; double d1 = p_98623_ - this.topPos; this.scrolling = false; for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { if (this.checkTabClicked(creativemodetab, d0, d1)) { this.selectTab(creativemodetab); return true; } } } return super.mouseReleased(p_98622_, p_98623_, p_98624_); } private boolean canScroll() { return selectedTab.canScroll() && this.menu.canScroll(); } private void selectTab(CreativeModeTab p_98561_) { CreativeModeTab creativemodetab = selectedTab; selectedTab = p_98561_; this.quickCraftSlots.clear(); this.menu.items.clear(); this.clearDraggingState(); if (selectedTab.getType() == CreativeModeTab.Type.HOTBAR) { HotbarManager hotbarmanager = this.minecraft.getHotbarManager(); for (int i = 0; i < 9; i++) { Hotbar hotbar = hotbarmanager.get(i); if (hotbar.isEmpty()) { for (int j = 0; j < 9; j++) { if (j == i) { ItemStack itemstack = new ItemStack(Items.PAPER); itemstack.set(DataComponents.CREATIVE_SLOT_LOCK, Unit.INSTANCE); Component component = this.minecraft.options.keyHotbarSlots[i].getTranslatedKeyMessage(); Component component1 = this.minecraft.options.keySaveHotbarActivator.getTranslatedKeyMessage(); itemstack.set(DataComponents.ITEM_NAME, Component.translatable("inventory.hotbarInfo", component1, component)); this.menu.items.add(itemstack); } else { this.menu.items.add(ItemStack.EMPTY); } } } else { this.menu.items.addAll(hotbar.load(this.minecraft.level.registryAccess())); } } } else if (selectedTab.getType() == CreativeModeTab.Type.CATEGORY) { this.menu.items.addAll(selectedTab.getDisplayItems()); } if (selectedTab.getType() == CreativeModeTab.Type.INVENTORY) { AbstractContainerMenu abstractcontainermenu = this.minecraft.player.inventoryMenu; if (this.originalSlots == null) { this.originalSlots = ImmutableList.copyOf(this.menu.slots); } this.menu.slots.clear(); for (int k = 0; k < abstractcontainermenu.slots.size(); k++) { int l; int i1; if (k >= 5 && k < 9) { int k1 = k - 5; int i2 = k1 / 2; int k2 = k1 % 2; l = 54 + i2 * 54; i1 = 6 + k2 * 27; } else if (k >= 0 && k < 5) { l = -2000; i1 = -2000; } else if (k == 45) { l = 35; i1 = 20; } else { int j1 = k - 9; int l1 = j1 % 9; int j2 = j1 / 9; l = 9 + l1 * 18; if (k >= 36) { i1 = 112; } else { i1 = 54 + j2 * 18; } } Slot slot = new CreativeModeInventoryScreen.SlotWrapper(abstractcontainermenu.slots.get(k), k, l, i1); this.menu.slots.add(slot); } this.destroyItemSlot = new Slot(CONTAINER, 0, 173, 112); this.menu.slots.add(this.destroyItemSlot); } else if (creativemodetab.getType() == CreativeModeTab.Type.INVENTORY) { this.menu.slots.clear(); this.menu.slots.addAll(this.originalSlots); this.originalSlots = null; } if (selectedTab.getType() == CreativeModeTab.Type.SEARCH) { this.searchBox.setVisible(true); this.searchBox.setCanLoseFocus(false); this.searchBox.setFocused(true); if (creativemodetab != p_98561_) { this.searchBox.setValue(""); } this.refreshSearchResults(); } else { this.searchBox.setVisible(false); this.searchBox.setCanLoseFocus(true); this.searchBox.setFocused(false); this.searchBox.setValue(""); } this.scrollOffs = 0.0F; this.menu.scrollTo(0.0F); } @Override public boolean mouseScrolled(double p_98527_, double p_98528_, double p_98529_, double p_301127_) { if (super.mouseScrolled(p_98527_, p_98528_, p_98529_, p_301127_)) { return true; } else if (!this.canScroll()) { return false; } else { this.scrollOffs = this.menu.subtractInputFromScroll(this.scrollOffs, p_301127_); this.menu.scrollTo(this.scrollOffs); return true; } } @Override protected boolean hasClickedOutside(double p_98541_, double p_98542_, int p_98543_, int p_98544_, int p_98545_) { boolean flag = p_98541_ < p_98543_ || p_98542_ < p_98544_ || p_98541_ >= p_98543_ + this.imageWidth || p_98542_ >= p_98544_ + this.imageHeight; this.hasClickedOutside = flag && !this.checkTabClicked(selectedTab, p_98541_, p_98542_); return this.hasClickedOutside; } protected boolean insideScrollbar(double p_98524_, double p_98525_) { int i = this.leftPos; int j = this.topPos; int k = i + 175; int l = j + 18; int i1 = k + 14; int j1 = l + 112; return p_98524_ >= k && p_98525_ >= l && p_98524_ < i1 && p_98525_ < j1; } @Override public boolean mouseDragged(double p_98535_, double p_98536_, int p_98537_, double p_98538_, double p_98539_) { if (this.scrolling) { int i = this.topPos + 18; int j = i + 112; this.scrollOffs = ((float)p_98536_ - i - 7.5F) / (j - i - 15.0F); this.scrollOffs = Mth.clamp(this.scrollOffs, 0.0F, 1.0F); this.menu.scrollTo(this.scrollOffs); return true; } else { return super.mouseDragged(p_98535_, p_98536_, p_98537_, p_98538_, p_98539_); } } @Override public void render(GuiGraphics p_283000_, int p_281317_, int p_282770_, float p_281295_) { super.render(p_283000_, p_281317_, p_282770_, p_281295_); this.effects.render(p_283000_, p_281317_, p_282770_, p_281295_); for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { if (this.checkTabHovering(p_283000_, creativemodetab, p_281317_, p_282770_)) { break; } } if (this.destroyItemSlot != null && selectedTab.getType() == CreativeModeTab.Type.INVENTORY && this.isHovering(this.destroyItemSlot.x, this.destroyItemSlot.y, 16, 16, p_281317_, p_282770_)) { p_283000_.renderTooltip(this.font, TRASH_SLOT_TOOLTIP, p_281317_, p_282770_); } this.renderTooltip(p_283000_, p_281317_, p_282770_); } @Override public boolean showsActiveEffects() { return this.effects.canSeeEffects(); } @Override public List getTooltipFromContainerItem(ItemStack p_281769_) { boolean flag = this.hoveredSlot != null && this.hoveredSlot instanceof CreativeModeInventoryScreen.CustomCreativeSlot; boolean flag1 = selectedTab.getType() == CreativeModeTab.Type.CATEGORY; boolean flag2 = selectedTab.getType() == CreativeModeTab.Type.SEARCH; TooltipFlag.Default tooltipflag$default = this.minecraft.options.advancedItemTooltips ? TooltipFlag.Default.ADVANCED : TooltipFlag.Default.NORMAL; TooltipFlag tooltipflag = flag ? tooltipflag$default.asCreative() : tooltipflag$default; List list = p_281769_.getTooltipLines(Item.TooltipContext.of(this.minecraft.level), this.minecraft.player, tooltipflag); if (list.isEmpty()) { return list; } else if (flag1 && flag) { return list; } else { List list1 = Lists.newArrayList(list); if (flag2 && flag) { this.visibleTags.forEach(p_325383_ -> { if (p_281769_.is((TagKey)p_325383_)) { list1.add(1, Component.literal("#" + p_325383_.location()).withStyle(ChatFormatting.DARK_PURPLE)); } }); } int i = 1; for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { if (creativemodetab.getType() != CreativeModeTab.Type.SEARCH && creativemodetab.contains(p_281769_)) { list1.add(i++, creativemodetab.getDisplayName().copy().withStyle(ChatFormatting.BLUE)); } } return list1; } } @Override protected void renderBg(GuiGraphics p_282663_, float p_282504_, int p_282089_, int p_282249_) { for (CreativeModeTab creativemodetab : CreativeModeTabs.tabs()) { if (creativemodetab != selectedTab) { this.renderTabButton(p_282663_, creativemodetab); } } p_282663_.blit(RenderType::guiTextured, selectedTab.getBackgroundTexture(), this.leftPos, this.topPos, 0.0F, 0.0F, this.imageWidth, this.imageHeight, 256, 256); this.searchBox.render(p_282663_, p_282089_, p_282249_, p_282504_); int j = this.leftPos + 175; int k = this.topPos + 18; int i = k + 112; if (selectedTab.canScroll()) { ResourceLocation resourcelocation = this.canScroll() ? SCROLLER_SPRITE : SCROLLER_DISABLED_SPRITE; p_282663_.blitSprite(RenderType::guiTextured, resourcelocation, j, k + (int)((i - k - 17) * this.scrollOffs), 12, 15); } this.renderTabButton(p_282663_, selectedTab); if (selectedTab.getType() == CreativeModeTab.Type.INVENTORY) { InventoryScreen.renderEntityInInventoryFollowsMouse( p_282663_, this.leftPos + 73, this.topPos + 6, this.leftPos + 105, this.topPos + 49, 20, 0.0625F, p_282089_, p_282249_, this.minecraft.player ); } } private int getTabX(CreativeModeTab p_260136_) { int i = p_260136_.column(); int j = 27; int k = 27 * i; if (p_260136_.isAlignedRight()) { k = this.imageWidth - 27 * (7 - i) + 1; } return k; } private int getTabY(CreativeModeTab p_260181_) { int i = 0; if (p_260181_.row() == CreativeModeTab.Row.TOP) { i -= 32; } else { i += this.imageHeight; } return i; } protected boolean checkTabClicked(CreativeModeTab p_98563_, double p_98564_, double p_98565_) { int i = this.getTabX(p_98563_); int j = this.getTabY(p_98563_); return p_98564_ >= i && p_98564_ <= i + 26 && p_98565_ >= j && p_98565_ <= j + 32; } protected boolean checkTabHovering(GuiGraphics p_282317_, CreativeModeTab p_282244_, int p_283469_, int p_283411_) { int i = this.getTabX(p_282244_); int j = this.getTabY(p_282244_); if (this.isHovering(i + 3, j + 3, 21, 27, p_283469_, p_283411_)) { p_282317_.renderTooltip(this.font, p_282244_.getDisplayName(), p_283469_, p_283411_); return true; } else { return false; } } protected void renderTabButton(GuiGraphics p_283590_, CreativeModeTab p_283489_) { boolean flag = p_283489_ == selectedTab; boolean flag1 = p_283489_.row() == CreativeModeTab.Row.TOP; int i = p_283489_.column(); int j = this.leftPos + this.getTabX(p_283489_); int k = this.topPos - (flag1 ? 28 : -(this.imageHeight - 4)); ResourceLocation[] aresourcelocation; if (flag1) { aresourcelocation = flag ? SELECTED_TOP_TABS : UNSELECTED_TOP_TABS; } else { aresourcelocation = flag ? SELECTED_BOTTOM_TABS : UNSELECTED_BOTTOM_TABS; } p_283590_.blitSprite(RenderType::guiTextured, aresourcelocation[Mth.clamp(i, 0, aresourcelocation.length)], j, k, 26, 32); p_283590_.pose().pushPose(); p_283590_.pose().translate(0.0F, 0.0F, 100.0F); j += 5; k += 8 + (flag1 ? 1 : -1); ItemStack itemstack = p_283489_.getIconItem(); p_283590_.renderItem(itemstack, j, k); p_283590_.renderItemDecorations(this.font, itemstack, j, k); p_283590_.pose().popPose(); } public boolean isInventoryOpen() { return selectedTab.getType() == CreativeModeTab.Type.INVENTORY; } public static void handleHotbarLoadOrSave(Minecraft p_98599_, int p_98600_, boolean p_98601_, boolean p_98602_) { LocalPlayer localplayer = p_98599_.player; RegistryAccess registryaccess = localplayer.level().registryAccess(); HotbarManager hotbarmanager = p_98599_.getHotbarManager(); Hotbar hotbar = hotbarmanager.get(p_98600_); if (p_98601_) { List list = hotbar.load(registryaccess); for (int i = 0; i < Inventory.getSelectionSize(); i++) { ItemStack itemstack = list.get(i); localplayer.getInventory().setItem(i, itemstack); p_98599_.gameMode.handleCreativeModeItemAdd(itemstack, 36 + i); } localplayer.inventoryMenu.broadcastChanges(); } else if (p_98602_) { hotbar.storeFrom(localplayer.getInventory(), registryaccess); Component component = p_98599_.options.keyHotbarSlots[p_98600_].getTranslatedKeyMessage(); Component component1 = p_98599_.options.keyLoadHotbarActivator.getTranslatedKeyMessage(); Component component2 = Component.translatable("inventory.hotbarSaved", component1, component); p_98599_.gui.setOverlayMessage(component2, false); p_98599_.getNarrator().sayNow(component2); hotbarmanager.save(); } } @OnlyIn(Dist.CLIENT) static class CustomCreativeSlot extends Slot { public CustomCreativeSlot(Container p_98633_, int p_98634_, int p_98635_, int p_98636_) { super(p_98633_, p_98634_, p_98635_, p_98636_); } @Override public boolean mayPickup(Player p_98638_) { ItemStack itemstack = this.getItem(); return super.mayPickup(p_98638_) && !itemstack.isEmpty() ? itemstack.isItemEnabled(p_98638_.level().enabledFeatures()) && !itemstack.has(DataComponents.CREATIVE_SLOT_LOCK) : itemstack.isEmpty(); } } @OnlyIn(Dist.CLIENT) public static class ItemPickerMenu extends AbstractContainerMenu { public final NonNullList items = NonNullList.create(); private final AbstractContainerMenu inventoryMenu; public ItemPickerMenu(Player p_98641_) { super(null, 0); this.inventoryMenu = p_98641_.inventoryMenu; Inventory inventory = p_98641_.getInventory(); for (int i = 0; i < 5; i++) { for (int j = 0; j < 9; j++) { this.addSlot(new CreativeModeInventoryScreen.CustomCreativeSlot(CreativeModeInventoryScreen.CONTAINER, i * 9 + j, 9 + j * 18, 18 + i * 18)); } } this.addInventoryHotbarSlots(inventory, 9, 112); this.scrollTo(0.0F); } @Override public boolean stillValid(Player p_98645_) { return true; } protected int calculateRowCount() { return Mth.positiveCeilDiv(this.items.size(), 9) - 5; } protected int getRowIndexForScroll(float p_259664_) { return Math.max((int)(p_259664_ * this.calculateRowCount() + 0.5), 0); } protected float getScrollForRowIndex(int p_259315_) { return Mth.clamp((float)p_259315_ / this.calculateRowCount(), 0.0F, 1.0F); } protected float subtractInputFromScroll(float p_259841_, double p_260358_) { return Mth.clamp(p_259841_ - (float)(p_260358_ / this.calculateRowCount()), 0.0F, 1.0F); } public void scrollTo(float p_98643_) { int i = this.getRowIndexForScroll(p_98643_); for (int j = 0; j < 5; j++) { for (int k = 0; k < 9; k++) { int l = k + (j + i) * 9; if (l >= 0 && l < this.items.size()) { CreativeModeInventoryScreen.CONTAINER.setItem(k + j * 9, this.items.get(l)); } else { CreativeModeInventoryScreen.CONTAINER.setItem(k + j * 9, ItemStack.EMPTY); } } } } public boolean canScroll() { return this.items.size() > 45; } @Override public ItemStack quickMoveStack(Player p_98650_, int p_98651_) { if (p_98651_ >= this.slots.size() - 9 && p_98651_ < this.slots.size()) { Slot slot = this.slots.get(p_98651_); if (slot != null && slot.hasItem()) { slot.setByPlayer(ItemStack.EMPTY); } } return ItemStack.EMPTY; } @Override public boolean canTakeItemForPickAll(ItemStack p_98647_, Slot p_98648_) { return p_98648_.container != CreativeModeInventoryScreen.CONTAINER; } @Override public boolean canDragTo(Slot p_98653_) { return p_98653_.container != CreativeModeInventoryScreen.CONTAINER; } @Override public ItemStack getCarried() { return this.inventoryMenu.getCarried(); } @Override public void setCarried(ItemStack p_169751_) { this.inventoryMenu.setCarried(p_169751_); } } @OnlyIn(Dist.CLIENT) static class SlotWrapper extends Slot { final Slot target; public SlotWrapper(Slot p_98657_, int p_98658_, int p_98659_, int p_98660_) { super(p_98657_.container, p_98658_, p_98659_, p_98660_); this.target = p_98657_; } @Override public void onTake(Player p_169754_, ItemStack p_169755_) { this.target.onTake(p_169754_, p_169755_); } @Override public boolean mayPlace(ItemStack p_98670_) { return this.target.mayPlace(p_98670_); } @Override public ItemStack getItem() { return this.target.getItem(); } @Override public boolean hasItem() { return this.target.hasItem(); } @Override public void setByPlayer(ItemStack p_271008_, ItemStack p_299458_) { this.target.setByPlayer(p_271008_, p_299458_); } @Override public void set(ItemStack p_98679_) { this.target.set(p_98679_); } @Override public void setChanged() { this.target.setChanged(); } @Override public int getMaxStackSize() { return this.target.getMaxStackSize(); } @Override public int getMaxStackSize(ItemStack p_98675_) { return this.target.getMaxStackSize(p_98675_); } @Nullable @Override public ResourceLocation getNoItemIcon() { return this.target.getNoItemIcon(); } @Override public ItemStack remove(int p_98663_) { return this.target.remove(p_98663_); } @Override public boolean isActive() { return this.target.isActive(); } @Override public boolean mayPickup(Player p_98665_) { return this.target.mayPickup(p_98665_); } } }