Skip to content

Commit 0e5b9f3

Browse files
author
Arthur Simão
committed
Fix double-swap on repeated inventory open (1.0.6)
1 parent d7123d4 commit 0e5b9f3

4 files changed

Lines changed: 29 additions & 7 deletions

File tree

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ loader_version_range=[4,)
77
mod_id=seamlesshotbar
88
mod_name=Seamless Hotbar
99
mod_license=LGPL-3.0-only
10-
mod_version=1.0.5
10+
mod_version=1.0.6
1111
mod_authors=DenWav, Antigravity
1212
mod_description=Seamless Hotbar - a NeoForge 1.21.1 port of Extended Hotbar's Fluent mode.

src/main/java/dev/denwav/fluentbar/client/ClientEventHandler.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import net.neoforged.neoforge.client.event.ClientTickEvent;
2121
import net.neoforged.neoforge.client.event.RegisterKeyMappingsEvent;
2222
import net.neoforged.neoforge.client.event.ScreenEvent;
23+
import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent;
2324
import net.neoforged.neoforge.common.NeoForge;
2425
import org.lwjgl.glfw.GLFW;
2526

@@ -36,12 +37,20 @@ public static void init(IEventBus modEventBus) {
3637
modEventBus.addListener(ClientEventHandler::onRegisterKeyMappings);
3738
NeoForge.EVENT_BUS.addListener(ClientEventHandler::onScreenClosing);
3839
NeoForge.EVENT_BUS.addListener(ClientEventHandler::onClientTick);
40+
NeoForge.EVENT_BUS.addListener(ClientEventHandler::onLevelLoad);
3941
}
4042

4143
private static void onRegisterKeyMappings(RegisterKeyMappingsEvent event) {
4244
event.register(TOGGLE_KEY);
4345
}
4446

47+
private static void onLevelLoad(net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent.LoggingIn event) {
48+
// Reset render-swap state on world join/rejoin so stale state from a previous
49+
// session doesn't cause a phantom swap on the first inventory open.
50+
SeamlessLogger.debug("onLevelLoad: resetting swapRender state");
51+
Util.resetRenderedPosition();
52+
}
53+
4554
private static void onScreenClosing(ScreenEvent.Closing event) {
4655
Screen screen = event.getScreen();
4756
if (screen instanceof AbstractContainerScreen<?>) {

src/main/java/dev/denwav/fluentbar/mixin/MinecraftMixin.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,22 +99,35 @@ private void onSetScreen(final Screen screen, final CallbackInfo ci) {
9999
return;
100100
}
101101

102-
// HorseInventoryScreen extends AbstractContainerScreen, so no separate check needed
103102
if (screen instanceof AbstractContainerScreen<?>) {
104103
// In Creative mode, opening inventory goes: setScreen(InventoryScreen) -> init() ->
105-
// setScreen(CreativeInventoryScreen). We must skip the intermediate InventoryScreen
106-
// to avoid triggering a swap that gets immediately undone.
104+
// setScreen(CreativeModeInventoryScreen). Skip the intermediate screen to avoid a
105+
// swap that gets immediately undone.
107106
final MultiPlayerGameMode gameMode = Minecraft.getInstance().gameMode;
108107
if (gameMode != null && gameMode.hasInfiniteItems()) {
109108
if (!(screen instanceof CreativeModeInventoryScreen)) {
109+
SeamlessLogger.debug("setScreen: creative intermediate screen {}, skipping", screen.getClass().getSimpleName());
110110
return;
111111
}
112112
}
113113

114-
if (!Util.isRenderSwapped()) {
115-
SeamlessLogger.debug("setScreen: opening container while POSITION=RIGHT, triggering render swap + physical swap");
114+
// Guard: only swap if we haven't already swapped for display.
115+
// Also guard against the case where we're transitioning from one container
116+
// screen to another (e.g. FancyMenu screen replacements) — if a container
117+
// was already open we don't swap again.
118+
final boolean previousScreenIsContainer = this.screen instanceof AbstractContainerScreen<?>;
119+
if (!Util.isRenderSwapped() && !previousScreenIsContainer) {
120+
SeamlessLogger.debug(
121+
"setScreen: opening {} while POSITION=RIGHT, triggering render swap + physical swap",
122+
screen.getClass().getSimpleName()
123+
);
116124
Util.swapRenderedPosition();
117125
Util.performSwap(Minecraft.getInstance(), true);
126+
} else {
127+
SeamlessLogger.debug(
128+
"setScreen: skipping swap for {} (renderSwapped={}, previousIsContainer={})",
129+
screen.getClass().getSimpleName(), Util.isRenderSwapped(), previousScreenIsContainer
130+
);
118131
}
119132
}
120133
}

src/main/resources/META-INF/neoforge.mods.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ license="LGPL-3.0-only"
44

55
[[mods]]
66
modId="seamlesshotbar"
7-
version="1.0.5"
7+
version="1.0.6"
88
displayName="Seamless Hotbar"
99
logoFile="logo.png"
1010
authors="DenWav, Antigravity"

0 commit comments

Comments
 (0)