public void Update(float dt) { if (ws.api.Side == EnumAppSide.Client) { BlockPos pos = ws.capi.World.Player.Entity.Pos.AsBlockPos; int lightlevel = Math.Max( ws.capi.World.BlockAccessor.GetLightLevel(pos, EnumLightLevelType.OnlySunLight), ws.capi.World.BlockAccessor.GetLightLevel(pos.Up(), EnumLightLevelType.OnlySunLight) ); smoothedLightLevel += (lightlevel - smoothedLightLevel) * dt * 4; // light level > 17 = 100% fog // light level <= 2 = 0% fog float fogMultiplier = GameMath.Clamp(smoothedLightLevel / 20f, 0f, 1); // sealevel = 100% fog // 70% sealevel = 0% fog float fac = (float)GameMath.Clamp(ws.capi.World.Player.Entity.Pos.Y / ws.capi.World.SeaLevel, 0, 1); fac *= fac; fogMultiplier *= fac; BlendedAmbient.FlatFogDensity.Value = NewPattern.Ambient.FlatFogDensity.Value * Weight + OldPattern.Ambient.FlatFogDensity.Value * (1 - Weight); BlendedAmbient.FlatFogDensity.Weight = NewPattern.Ambient.FlatFogDensity.Weight * Weight + OldPattern.Ambient.FlatFogDensity.Weight * (1 - Weight); BlendedAmbient.FlatFogDensity.Weight *= fogMultiplier; BlendedAmbient.FlatFogYPos.Value = NewPattern.Ambient.FlatFogYPos.Value * Weight + OldPattern.Ambient.FlatFogYPos.Value * (1 - Weight); BlendedAmbient.FlatFogYPos.Weight = GameMath.Clamp(NewPattern.Ambient.FlatFogYPos.Weight + OldPattern.Ambient.FlatFogYPos.Weight, 0, 1); BlendedAmbient.FogDensity.Value = ws.capi.Ambient.Base.FogDensity.Value + NewPattern.Ambient.FogDensity.Value * Weight + OldPattern.Ambient.FogDensity.Value * (1 - Weight); BlendedAmbient.FogDensity.Weight = GameMath.Clamp(NewPattern.Ambient.FogDensity.Weight + OldPattern.Ambient.FogDensity.Weight, 0, 1); BlendedAmbient.FogDensity.Weight *= fogMultiplier; } if (Transitioning) { Weight += dt / TransitionDelay; if (Weight > 1) { Transitioning = false; Weight = 1; } } else { if (ws.api.Side == EnumAppSide.Server && rand.NextDouble() < OldPattern.ChanceOfWeatherChange * ws.api.World.Calendar.SpeedOfTime / 60.0) { TriggerTransition(); } } if (ws.api.Side == EnumAppSide.Client) { NewPattern.Update(dt); OldPattern.Update(dt); } }
public void TickEvery25ms(float dt) { if (ws.api.Side == EnumAppSide.Client) { clientUpdate(dt); } else { double nowTotalHours = ws.api.World.Calendar.TotalHours; while (nowTotalHours - LastUpdateTotalHours > 1) { TickEveryInGameHourServer(LastUpdateTotalHours); LastUpdateTotalHours++; } } if (Transitioning) { float speed = ws.api.World.Calendar.SpeedOfTime / 60f; Weight += dt / TransitionDelay * speed; if (Weight > 1) { Transitioning = false; Weight = 1; } } else { if (ws.autoChangePatterns && ws.api.Side == EnumAppSide.Server && ws.api.World.Calendar.TotalHours > NewWePattern.State.ActiveUntilTotalHours) { TriggerTransition(); } } if (ws.autoChangePatterns && ws.api.Side == EnumAppSide.Server) { bool sendPacket = false; if (ws.api.World.Calendar.TotalHours > CurWindPattern.State.ActiveUntilTotalHours) { CurWindPattern = WindPatterns[Rand.NextInt(WindPatterns.Length)]; CurWindPattern.OnBeginUse(); sendPacket = true; } if (ws.api.World.Calendar.TotalHours > CurWeatherEvent.State.ActiveUntilTotalHours || CurWeatherEvent.ShouldStop(weatherData.climateCond.Rainfall, weatherData.climateCond.Temperature)) { CurWeatherEvent = RandomWeatherEvent(); CurWeatherEvent.OnBeginUse(); sendPacket = true; } if (sendPacket) { wsServer.SendWeatherStateUpdate(new WeatherState() { RegionX = regionX, RegionZ = regionZ, NewPattern = NewWePattern.State, OldPattern = OldWePattern.State, WindPattern = CurWindPattern.State, WeatherEvent = CurWeatherEvent?.State, TransitionDelay = TransitionDelay, Transitioning = Transitioning, Weight = Weight, LcgCurrentSeed = Rand.currentSeed, LcgMapGenSeed = Rand.mapGenSeed, LcgWorldSeed = Rand.worldSeed }); } } NewWePattern.Update(dt); OldWePattern.Update(dt); CurWindPattern.Update(dt); CurWeatherEvent.Update(dt); float curWindSpeed = weatherData.curWindSpeed.X; float targetWindSpeed = (float)GetWindSpeed(ws.api.World.SeaLevel); curWindSpeed += GameMath.Clamp((targetWindSpeed - curWindSpeed) * dt, -0.001f, 0.001f); weatherData.curWindSpeed.X = curWindSpeed; quarterSecAccum += dt; if (quarterSecAccum > 0.25f) { regionCenterPos.Y = ws.api.World.BlockAccessor.GetRainMapHeightAt(regionCenterPos); if (regionCenterPos.Y == 0) { regionCenterPos.Y = ws.api.World.SeaLevel; // Map chunk might not be loaded. In that case y will be 0. } ClimateCondition nowcond = ws.api.World.BlockAccessor.GetClimateAt(regionCenterPos); if (nowcond != null) { weatherData.climateCond = nowcond; } quarterSecAccum = 0; } weatherData.BlendedPrecType = CurWeatherEvent.State.PrecType; }