Einige Bug Fixes (Camera, Thumbnails), Terrain

This commit is contained in:
2026-08-15 00:11:29 +02:00
parent f2944c9a91
commit 9807a958f4
81 changed files with 865 additions and 321 deletions

View File

@@ -21,10 +21,6 @@ import java.nio.ByteBuffer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
/**
* Regen-Partikel, Nass-Effekt, Gewitter-Blitz und Donner-Audio.
@@ -69,8 +65,8 @@ public class RainState extends BaseAppState {
private float thunderTimer = 0f;
private int thunderIdx = 0;
// ── Persistenz ────────────────────────────────────────────────────────────
private float saveTimer = 60f;
// ── Spielstand ────────────────────────────────────────────────────────────
private de.blight.common.SaveGame save;
// ─────────────────────────────────────────────────────────────────────────
@@ -156,8 +152,12 @@ public class RainState extends BaseAppState {
root.attachChild(thunderAudio[i]);
}
loadWetness();
log.info("[Rain] initialisiert.");
SaveGameState sgs = app.getStateManager().getState(SaveGameState.class);
if (sgs != null) {
save = sgs.getSave();
wetness = save.world.wetness;
}
log.info("[Rain] initialisiert (wetness={})", wetness);
}
@Override
@@ -170,9 +170,6 @@ public class RainState extends BaseAppState {
WeatherState.Weather weather = ws.getActiveWeather();
boolean stormy = weather == WeatherState.Weather.THUNDERSTORM;
saveTimer -= tpf;
if (saveTimer <= 0f) { saveTimer = 60f; saveWetness(); }
// ── Wetness ───────────────────────────────────────────────────────────
float wetnessTarget = intensity > 0.01f ? FastMath.clamp(intensity + 0.25f, 0f, 1f) : 0f;
if (wetness < wetnessTarget) {
@@ -180,6 +177,7 @@ public class RainState extends BaseAppState {
} else {
wetness = Math.max(wetnessTarget, wetness - WET_RATE_DOWN * tpf);
}
if (save != null) save.world.wetness = wetness;
// ── Partikel ──────────────────────────────────────────────────────────
Vector3f cam = getApplication().getCamera().getLocation();
@@ -277,7 +275,7 @@ public class RainState extends BaseAppState {
@Override
protected void cleanup(Application app) {
saveWetness();
if (save != null) save.world.wetness = wetness;
Node root = ((SimpleApplication) app).getRootNode();
if (lightningLight != null) root.removeLight(lightningLight);
if (rainNode != null) root.detachChild(rainNode);
@@ -287,36 +285,6 @@ public class RainState extends BaseAppState {
for (AudioNode tn : thunderAudio) { if (tn != null) root.detachChild(tn); }
}
// ── Persistenz ────────────────────────────────────────────────────────────
private static File wetFile() {
File dir = new File(System.getProperty("user.home"), ".blight");
dir.mkdirs();
return new File(dir, "rain.properties");
}
private void saveWetness() {
Properties p = new Properties();
p.setProperty("wetness", String.valueOf(wetness));
try (FileWriter fw = new FileWriter(wetFile())) {
p.store(fw, null);
} catch (Exception e) {
log.warn("[Rain] Speichern fehlgeschlagen: {}", e.getMessage());
}
}
private void loadWetness() {
File f = wetFile();
if (!f.exists()) return;
Properties p = new Properties();
try (FileReader fr = new FileReader(f)) {
p.load(fr);
wetness = Float.parseFloat(p.getProperty("wetness", "0"));
} catch (Exception e) {
log.warn("[Rain] Laden fehlgeschlagen: {}", e.getMessage());
}
}
// ── Helpers ───────────────────────────────────────────────────────────────
private static Texture2D createRainTexture() {

View File

@@ -13,10 +13,7 @@ import jme3utilities.sky.SkyControl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Properties;
import de.blight.common.SaveGame;
public class WeatherState extends BaseAppState {
@@ -204,7 +201,8 @@ public class WeatherState extends BaseAppState {
private Weather active = Weather.SUNNY;
private float changeTimer = 180f;
private float saveTimer = 60f;
private SaveGame save;
private float fogDensity = FOG_DENSITY[0];
private float fogDistance = FOG_DISTANCE[0];
@@ -279,12 +277,16 @@ public class WeatherState extends BaseAppState {
@Override
protected void initialize(Application app) {
load();
SaveGameState sgs = app.getStateManager().getState(SaveGameState.class);
if (sgs != null) {
save = sgs.getSave();
restoreFrom(save.world.weather);
}
}
@Override
protected void cleanup(Application app) {
save();
writeTo(save);
}
@Override protected void onEnable() {}
@@ -297,11 +299,7 @@ public class WeatherState extends BaseAppState {
pickNextWeather();
}
saveTimer -= tpf;
if (saveTimer <= 0f) {
saveTimer = 60f;
save();
}
if (save != null) writeTo(save);
int i = active.ordinal();
@@ -382,86 +380,53 @@ public class WeatherState extends BaseAppState {
// ── Persistenz ────────────────────────────────────────────────────────────
private static File saveFile() {
File dir = new File(System.getProperty("user.home"), ".blight");
dir.mkdirs();
return new File(dir, "weather.properties");
private void writeTo(SaveGame sg) {
if (sg == null) return;
SaveGame.WeatherSave ws = sg.world.weather;
ws.weather = active.name();
ws.changeTimer = changeTimer;
ws.windAngle = windAngle;
ws.windAngleTgt = windAngleTgt;
ws.fogDensity = fogDensity;
ws.fogDistance = fogDistance;
ws.windSpeed = windSpeed;
ws.waveSpeed = waveSpeed;
ws.waveAmp = waveAmp;
ws.waveScale = waveScale;
ws.waterTrans = waterTrans;
ws.foamIntensity = foamIntensity;
ws.cloudOpacity = cloudOpacity;
ws.fogColorR = fogColor.r;
ws.fogColorG = fogColor.g;
ws.fogColorB = fogColor.b;
ws.waterColorR = waterColor.r;
ws.waterColorG = waterColor.g;
ws.waterColorB = waterColor.b;
ws.deepWaterR = deepWaterColor.r;
ws.deepWaterG = deepWaterColor.g;
ws.deepWaterB = deepWaterColor.b;
if (dayTime != null) ws.timeOfDay = dayTime.getTimeOfDay();
}
public void save() {
Properties p = new Properties();
p.setProperty("weather", active.name());
if (dayTime != null) p.setProperty("timeOfDay", String.valueOf(dayTime.getTimeOfDay()));
p.setProperty("changeTimer", String.valueOf(changeTimer));
p.setProperty("windAngle", String.valueOf(windAngle));
p.setProperty("windAngleTgt", String.valueOf(windAngleTgt));
p.setProperty("fogDensity", String.valueOf(fogDensity));
p.setProperty("fogDistance", String.valueOf(fogDistance));
p.setProperty("windSpeed", String.valueOf(windSpeed));
p.setProperty("waveSpeed", String.valueOf(waveSpeed));
p.setProperty("waveAmp", String.valueOf(waveAmp));
p.setProperty("waveScale", String.valueOf(waveScale));
p.setProperty("waterTrans", String.valueOf(waterTrans));
p.setProperty("foamIntensity", String.valueOf(foamIntensity));
p.setProperty("cloudOpacity", String.valueOf(cloudOpacity));
p.setProperty("fogColorR", String.valueOf(fogColor.r));
p.setProperty("fogColorG", String.valueOf(fogColor.g));
p.setProperty("fogColorB", String.valueOf(fogColor.b));
p.setProperty("waterColorR", String.valueOf(waterColor.r));
p.setProperty("waterColorG", String.valueOf(waterColor.g));
p.setProperty("waterColorB", String.valueOf(waterColor.b));
p.setProperty("deepWaterR", String.valueOf(deepWaterColor.r));
p.setProperty("deepWaterG", String.valueOf(deepWaterColor.g));
p.setProperty("deepWaterB", String.valueOf(deepWaterColor.b));
try (FileWriter fw = new FileWriter(saveFile())) {
p.store(fw, "Blight weather state");
} catch (Exception e) {
log.warn("[Weather] Speichern fehlgeschlagen: {}", e.getMessage());
}
}
private void load() {
File f = saveFile();
if (!f.exists()) return;
Properties p = new Properties();
try (FileReader fr = new FileReader(f)) {
p.load(fr);
active = Weather.valueOf(p.getProperty("weather", "SUNNY"));
changeTimer = Float.parseFloat(p.getProperty("changeTimer", "180"));
windAngle = Float.parseFloat(p.getProperty("windAngle", "0"));
windAngleTgt = Float.parseFloat(p.getProperty("windAngleTgt", "0.4"));
fogDensity = Float.parseFloat(p.getProperty("fogDensity", String.valueOf(FOG_DENSITY[0])));
fogDistance = Float.parseFloat(p.getProperty("fogDistance", String.valueOf(FOG_DISTANCE[0])));
windSpeed = Float.parseFloat(p.getProperty("windSpeed", String.valueOf(WIND_SPEED[0])));
waveSpeed = Float.parseFloat(p.getProperty("waveSpeed", String.valueOf(WAVE_SPEED[0])));
waveAmp = Float.parseFloat(p.getProperty("waveAmp", String.valueOf(WAVE_AMP[0])));
waveScale = Float.parseFloat(p.getProperty("waveScale", String.valueOf(WAVE_SCALE[0])));
waterTrans = Float.parseFloat(p.getProperty("waterTrans", String.valueOf(WATER_TRANS[0])));
foamIntensity = Float.parseFloat(p.getProperty("foamIntensity", String.valueOf(FOAM_INTENSITY[0])));
cloudOpacity = Float.parseFloat(p.getProperty("cloudOpacity", String.valueOf(CLOUD_OPACITY[0])));
fogColor.set(
Float.parseFloat(p.getProperty("fogColorR", String.valueOf(FOG_COLOR[0].r))),
Float.parseFloat(p.getProperty("fogColorG", String.valueOf(FOG_COLOR[0].g))),
Float.parseFloat(p.getProperty("fogColorB", String.valueOf(FOG_COLOR[0].b))),
1f);
waterColor.set(
Float.parseFloat(p.getProperty("waterColorR", String.valueOf(WATER_COLOR[0].r))),
Float.parseFloat(p.getProperty("waterColorG", String.valueOf(WATER_COLOR[0].g))),
Float.parseFloat(p.getProperty("waterColorB", String.valueOf(WATER_COLOR[0].b))),
1f);
deepWaterColor.set(
Float.parseFloat(p.getProperty("deepWaterR", String.valueOf(DEEP_WATER_COLOR[0].r))),
Float.parseFloat(p.getProperty("deepWaterG", String.valueOf(DEEP_WATER_COLOR[0].g))),
Float.parseFloat(p.getProperty("deepWaterB", String.valueOf(DEEP_WATER_COLOR[0].b))),
1f);
String savedTime = p.getProperty("timeOfDay");
if (savedTime != null && dayTime != null) {
dayTime.setTimeOfDay(Float.parseFloat(savedTime));
}
log.info("[Weather] Geladen: {} (noch {}s)", active, (int) changeTimer);
} catch (Exception e) {
log.warn("[Weather] Laden fehlgeschlagen: {}", e.getMessage());
}
private void restoreFrom(SaveGame.WeatherSave ws) {
try { active = Weather.valueOf(ws.weather); } catch (Exception e) { active = Weather.SUNNY; }
changeTimer = ws.changeTimer;
windAngle = ws.windAngle;
windAngleTgt = ws.windAngleTgt;
fogDensity = ws.fogDensity;
fogDistance = ws.fogDistance;
windSpeed = ws.windSpeed;
waveSpeed = ws.waveSpeed;
waveAmp = ws.waveAmp;
waveScale = ws.waveScale;
waterTrans = ws.waterTrans;
foamIntensity = ws.foamIntensity;
cloudOpacity = ws.cloudOpacity;
fogColor.set(ws.fogColorR, ws.fogColorG, ws.fogColorB, 1f);
waterColor.set(ws.waterColorR, ws.waterColorG, ws.waterColorB, 1f);
deepWaterColor.set(ws.deepWaterR, ws.deepWaterG, ws.deepWaterB, 1f);
if (dayTime != null) dayTime.setTimeOfDay(ws.timeOfDay);
log.info("[Weather] Geladen: {} (noch {}s)", active, (int) changeTimer);
}
// ── Helpers ───────────────────────────────────────────────────────────────