예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
        }