From 5e8d42e7ddf986cd3b66e44c1435693f16059f8c Mon Sep 17 00:00:00 2001 From: shartte Date: Sat, 9 Mar 2024 19:53:32 +0100 Subject: [PATCH] Prevent the cursor from re-centering when switching between AE2 screens (#7735) --- .../menu/implementations/MenuTypeBuilder.java | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/src/main/java/appeng/menu/implementations/MenuTypeBuilder.java b/src/main/java/appeng/menu/implementations/MenuTypeBuilder.java index 8c131552abe..46bafd0fceb 100644 --- a/src/main/java/appeng/menu/implementations/MenuTypeBuilder.java +++ b/src/main/java/appeng/menu/implementations/MenuTypeBuilder.java @@ -32,7 +32,6 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.MenuProvider; import net.minecraft.world.Nameable; -import net.minecraft.world.SimpleMenuProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -148,14 +147,30 @@ private boolean open(Player player, MenuHostLocator locator, boolean fromSubMenu Component title = menuTitleStrategy.apply(accessInterface); - MenuProvider menu = new SimpleMenuProvider((wnd, p, pl) -> { - M m = factory.create(wnd, p, accessInterface); - // Set the original locator on the opened server-side menu for it to more - // easily remember how to re-open after being closed. - m.setLocator(locator); - return m; - }, title); - player.openMenu(menu, buffer -> { + class AppEngMenuProvider implements MenuProvider { + @Override + public Component getDisplayName() { + return title; + } + + @Nullable + @Override + public AbstractContainerMenu createMenu(int wnd, Inventory p, Player pl) { + M m = factory.create(wnd, p, accessInterface); + // Set the original locator on the opened server-side menu for it to more + // easily remember how to re-open after being closed. + m.setLocator(locator); + return m; + } + + @Override + public boolean shouldTriggerClientSideContainerClosingOnOpen() { + // Do not send close packets when switching between AE menus + return !(player.containerMenu instanceof AEBaseMenu); + } + } + + player.openMenu(new AppEngMenuProvider(), buffer -> { MenuLocators.writeToPacket(buffer, locator); buffer.writeBoolean(fromSubMenu); if (initialDataSerializer != null) {