From b38937cdea1e77cd22970ce388468824901c5e6f Mon Sep 17 00:00:00 2001 From: Mario Date: Tue, 21 Jul 2026 12:39:31 +0200 Subject: [PATCH] Bug Fixes --- .../main/java/de/blight/game/BlightGame.java | 25 +++++++++++++++++++ .../de/blight/game/config/GraphicsScreen.java | 1 + .../java/de/blight/game/scene/WorldScene.java | 1 + .../java/de/blight/game/state/DrownState.java | 21 +++++++++++++--- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/blight-game/src/main/java/de/blight/game/BlightGame.java b/blight-game/src/main/java/de/blight/game/BlightGame.java index c3b1c80..c407b38 100644 --- a/blight-game/src/main/java/de/blight/game/BlightGame.java +++ b/blight-game/src/main/java/de/blight/game/BlightGame.java @@ -23,6 +23,7 @@ import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFWVidMode; import org.lwjgl.system.MemoryStack; import com.jme3.system.lwjgl.LwjglWindow; +import de.blight.game.state.DrownState; import de.blight.game.state.HotbarState; import de.blight.game.state.HudState; import de.blight.game.state.LoadingScreenState; @@ -63,6 +64,7 @@ public class BlightGame extends SimpleApplication { private long pendingFullscreenFixAt = Long.MAX_VALUE; private boolean firstLaunch = true; // false nach dem ersten simpleInitApp() private boolean initialFixDone = false; // Initial-Fix bei 0.5s bereits gelaufen + private boolean pendingMenuRebuild = false; // nur true nach explizitem app.restart() private JWindow splashWindow; @@ -427,6 +429,12 @@ public class BlightGame extends SimpleApplication { pendingFullscreenFixAt = System.currentTimeMillis() + 1000; } + /** Wird von GraphicsScreen vor app.restart() aufgerufen – erlaubt beim nächsten + * reshape() die Menü-States neu aufzubauen. Darf NICHT beim Startup-Fix feuern. */ + public void scheduleMenuRebuild() { + pendingMenuRebuild = true; + } + // ── Render-Loop ────────────────────────────────────────────────────────── @Override @@ -479,6 +487,16 @@ public class BlightGame extends SimpleApplication { rebuildState(HudState.class); rebuildState(HotbarState.class); rebuildState(LoadingScreenState.class); + if (pendingMenuRebuild) { + pendingMenuRebuild = false; + rebuildEnabled(mainMenuState); + rebuildEnabled(pauseMenu); + rebuildEnabled(configScreen); + rebuildEnabled(audioScreen); + rebuildEnabled(graphicsScreen); + } + DrownState drown = stateManager.getState(DrownState.class); + if (drown != null) drown.rebuild(); JmeConsole console = stateManager.getState(JmeConsole.class); if (console != null) console.rebuild(); } @@ -491,6 +509,13 @@ public class BlightGame extends SimpleApplication { } } + private void rebuildEnabled(com.jme3.app.state.BaseAppState state) { + if (state != null && state.isEnabled()) { + state.setEnabled(false); + state.setEnabled(true); + } + } + // ── Konsolen-Befehle ───────────────────────────────────────────────────── private void registerGameCommands(JmeConsole console) { diff --git a/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java b/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java index 2ef4b2a..ba76927 100644 --- a/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java +++ b/blight-game/src/main/java/de/blight/game/config/GraphicsScreen.java @@ -219,6 +219,7 @@ public class GraphicsScreen extends MenuScreen { s.setVSync(live.vsync); s.setSamples(live.samples); app.setSettings(s); + ((BlightGame) getApplication()).scheduleMenuRebuild(); if (live.fullscreen) { ((BlightGame) getApplication()).scheduleFullscreenFix(); } diff --git a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java index b77dad5..85ca548 100644 --- a/blight-game/src/main/java/de/blight/game/scene/WorldScene.java +++ b/blight-game/src/main/java/de/blight/game/scene/WorldScene.java @@ -736,6 +736,7 @@ public class WorldScene extends BaseAppState { // Schatten als Filter – vermeidet das Setzen von ShadowMap-Texturen in Scene-Materialien fpp.addFilter(shadowFilter); + // Globales Wasser bei Y=0 (bedeckt die gesamte Karte unterhalb der Wasserlinie) try { DynamicWaterFilter waterFilter = new DynamicWaterFilter(rootNode, sunDir); diff --git a/blight-game/src/main/java/de/blight/game/state/DrownState.java b/blight-game/src/main/java/de/blight/game/state/DrownState.java index 045499d..0acb63e 100644 --- a/blight-game/src/main/java/de/blight/game/state/DrownState.java +++ b/blight-game/src/main/java/de/blight/game/state/DrownState.java @@ -79,13 +79,26 @@ public class DrownState extends BaseAppState { @Override protected void initialize(Application application) { - app = (SimpleApplication) application; - float w = app.getCamera().getWidth(); - float h = app.getCamera().getHeight(); - overlay = new Geometry("drown_overlay", new Quad(w, h)); + app = (SimpleApplication) application; overlayMat = new Material(app.getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md"); overlayMat.setColor("Color", new ColorRGBA(0f, 0f, 0f, 0f)); overlayMat.getAdditionalRenderState().setBlendMode(RenderState.BlendMode.Alpha); + buildOverlay(); + } + + /** Neu aufrufen wenn sich die Auflösung ändert. */ + public void rebuild() { + if (app == null) return; + boolean wasAttached = overlay != null && overlay.getParent() != null; + detachOverlay(); + buildOverlay(); + if (wasAttached) attachOverlay(); + } + + private void buildOverlay() { + float w = app.getCamera().getWidth(); + float h = app.getCamera().getHeight(); + overlay = new Geometry("drown_overlay", new Quad(w, h)); overlay.setMaterial(overlayMat); overlay.setQueueBucket(RenderQueue.Bucket.Gui); overlay.setLocalTranslation(0f, 0f, 50f);