Ejemplo n.º 1
0
        private void InitWeatherSim()
        {
            weatherSim = new WeatherSimulation(this);
            if (api.Side == EnumAppSide.Client)
            {
                cloudRenderer = new CloudRenderer(capi, weatherSim);
            }

            weatherSim.Initialize();

            if (initialWeatherFromServer != null)
            {
                OnWeatherUpdate(initialWeatherFromServer);
                initialWeatherFromServer = null;
            }

            // Pre init the clouds.
            if (api.Side == EnumAppSide.Client)
            {
                capi.Ambient.UpdateAmbient(0.1f);
                CloudRenderer renderer = this.cloudRenderer as CloudRenderer;

                renderer.blendedCloudDensity          = capi.Ambient.BlendedCloudDensity;
                renderer.blendedGlobalCloudBrightness = capi.Ambient.BlendedCloudBrightness;
                renderer.UpdateWindAndClouds(0.1f);
            }
        }
Ejemplo n.º 2
0
        void ProcessWeatherUpdate(WeatherState msg)
        {
            WeatherSimulationRegion weatherSim = getOrCreateWeatherSimForRegion(msg.RegionX, msg.RegionZ);

            if (weatherSim == null)
            {
                Console.WriteLine("weatherSim for region {0}/{1} is null. No idea what to do here", msg.RegionX, msg.RegionZ);
                return;
            }

            if (msg.updateInstant)
            {
//                ReloadConfigs();
                weatherSim.ReloadPatterns(api.World.Seed);

                for (int i = 0; i < weatherSim.WeatherPatterns.Length; i++)
                {
                    weatherSim.WeatherPatterns[i].Initialize(i, api.World.Seed);
                }
            }

            weatherSim.NewWePattern       = weatherSim.WeatherPatterns[msg.NewPattern.Index];
            weatherSim.NewWePattern.State = msg.NewPattern;

            weatherSim.OldWePattern       = weatherSim.WeatherPatterns[msg.OldPattern.Index];
            weatherSim.OldWePattern.State = msg.OldPattern;

            weatherSim.TransitionDelay = msg.TransitionDelay;
            weatherSim.Transitioning   = msg.Transitioning;
            weatherSim.Weight          = msg.Weight;

            //bool windChanged = weatherSim.CurWindPattern.State.Index != msg.WindPattern.Index;
            weatherSim.CurWindPattern       = weatherSim.WindPatterns[msg.WindPattern.Index];
            weatherSim.CurWindPattern.State = msg.WindPattern;

            weatherSim.CurWeatherEvent       = weatherSim.WeatherEvents[msg.WeatherEvent.Index];
            weatherSim.CurWeatherEvent.State = msg.WeatherEvent;

            if (msg.updateInstant)
            {
                weatherSim.NewWePattern.OnBeginUse();
                cloudRenderer.instantTileBlend = true;
            }


            //api.World.Logger.Notification("Weather pattern update @{0}/{1}", weatherSim.regionX, weatherSim.regionZ);

            if (msg.Transitioning)
            {
                weatherSim.Weight = 0;
            }

            if (msg.updateInstant)
            {
                weatherSim.TickEvery25ms(0.025f);
                cloudRenderer.UpdateCloudTiles(short.MaxValue);
            }
        }
Ejemplo n.º 3
0
        internal void FromBytes(byte[] data)
        {
            if (data == null)
            {
                LoadRandomPattern();
                NewWePattern.OnBeginUse();
            }
            else
            {
                WeatherState state = SerializerUtil.Deserialize <WeatherState>(data);

                if (state.NewPattern != null)
                {
                    NewWePattern       = WeatherPatterns[state.NewPattern.Index];
                    NewWePattern.State = state.NewPattern;
                }
                else
                {
                    NewWePattern = WeatherPatterns[0];
                }

                if (state.OldPattern != null)
                {
                    OldWePattern       = WeatherPatterns[state.OldPattern.Index];
                    OldWePattern.State = state.OldPattern;
                }
                else
                {
                    OldWePattern = WeatherPatterns[0];
                }

                if (state.WindPattern != null)
                {
                    CurWindPattern       = WindPatterns[state.WindPattern.Index];
                    CurWindPattern.State = state.WindPattern;
                }

                Weight               = state.Weight;
                TransitionDelay      = state.TransitionDelay;
                Transitioning        = state.Transitioning;
                LastUpdateTotalHours = state.LastUpdateTotalHours;
                Rand.worldSeed       = state.LcgWorldSeed;
                Rand.currentSeed     = state.LcgCurrentSeed;
                Rand.mapGenSeed      = state.LcgMapGenSeed;
            }
        }
Ejemplo n.º 4
0
        public byte[] ToBytes()
        {
            WeatherState state = new WeatherState()
            {
                NewPattern           = NewWePattern?.State ?? null,
                OldPattern           = OldWePattern?.State ?? null,
                WindPattern          = CurWindPattern?.State ?? null,
                Weight               = Weight,
                TransitionDelay      = TransitionDelay,
                Transitioning        = Transitioning,
                LastUpdateTotalHours = LastUpdateTotalHours,
                LcgCurrentSeed       = Rand.currentSeed,
                LcgMapGenSeed        = Rand.mapGenSeed,
                LcgWorldSeed         = Rand.worldSeed
            };

            return(SerializerUtil.Serialize(state));
        }
Ejemplo n.º 5
0
        public void SendWeatherStateUpdate(WeatherState state)
        {
            int regionSize = sapi.WorldManager.RegionSize;

            foreach (var plr in sapi.World.AllOnlinePlayers)
            {
                int plrRegionX = (int)plr.Entity.ServerPos.X / regionSize;
                int plrRegionZ = (int)plr.Entity.ServerPos.Z / regionSize;

                if (Math.Abs(state.RegionX - plrRegionX) <= 1 && Math.Abs(state.RegionZ - plrRegionZ) <= 1)
                {
                    serverChannel.SendPacket(state, plr as IServerPlayer);
                }
            }

            // Instanty store the change, so that players that connect shortly after also get the update
            IMapRegion mapregion = sapi.WorldManager.GetMapRegion(state.RegionX, state.RegionZ);

            if (mapregion != null)
            {
                mapregion.SetModdata("weather", SerializerUtil.Serialize(state));
            }
        }
Ejemplo n.º 6
0
        private void OnSaveGameLoaded()
        {
            InitWeatherSim();

            if (sapi.WorldManager.SaveGame.IsNew)
            {
                weatherSim.LoadRandomPattern();
            }
            else
            {
                try
                {
                    WeatherState storedstate = SerializerUtil.Deserialize <WeatherState>(sapi.WorldManager.GetData("weatherState"));
                    weatherSim.NewPattern      = weatherSim.Patterns[storedstate.NewPatternIndex];
                    weatherSim.OldPattern      = weatherSim.Patterns[storedstate.OldPatternIndex];
                    weatherSim.Weight          = storedstate.Weight;
                    weatherSim.TransitionDelay = storedstate.TransitionDelay;
                    weatherSim.Transitioning   = storedstate.Transitioning;
                } catch (Exception)
                {
                    weatherSim.LoadRandomPattern();
                }
            }
        }
Ejemplo n.º 7
0
        private void OnWeatherUpdate(WeatherState msg)
        {
            if (weatherSim == null)
            {
                initialWeatherFromServer = msg;
                return;
            }

            weatherSim.NewPattern      = weatherSim.Patterns[msg.NewPatternIndex];
            weatherSim.OldPattern      = weatherSim.Patterns[msg.OldPatternIndex];
            weatherSim.TransitionDelay = msg.TransitionDelay;
            weatherSim.Transitioning   = msg.Transitioning;
            weatherSim.Weight          = msg.Weight;

            if (msg.Transitioning)
            {
                weatherSim.Weight = 0;

                if (weatherSim.NewPattern != weatherSim.OldPattern)
                {
                    weatherSim.NewPattern.OnBeginUse();
                }
            }
        }
 private void OnWeatherUpdate(WeatherState msg)
 {
     weatherUpdateQueue.Enqueue(msg);
 }
Ejemplo n.º 9
0
        internal void FromBytes(byte[] data)
        {
            if (data == null)
            {
                LoadRandomPattern();
                NewWePattern.OnBeginUse();
            }
            else
            {
                WeatherState state = SerializerUtil.Deserialize <WeatherState>(data);

                if (state.NewPattern != null)
                {
                    NewWePattern       = WeatherPatterns[state.NewPattern.Index];
                    NewWePattern.State = state.NewPattern;
                }
                else
                {
                    NewWePattern = WeatherPatterns[0];
                }

                if (state.OldPattern != null && state.OldPattern.Index < WeatherPatterns.Length)
                {
                    OldWePattern       = WeatherPatterns[state.OldPattern.Index];
                    OldWePattern.State = state.OldPattern;
                }
                else
                {
                    OldWePattern = WeatherPatterns[0];
                }

                if (state.WindPattern != null)
                {
                    CurWindPattern       = WindPatterns[state.WindPattern.Index];
                    CurWindPattern.State = state.WindPattern;
                }

                Weight               = state.Weight;
                TransitionDelay      = state.TransitionDelay;
                Transitioning        = state.Transitioning;
                LastUpdateTotalHours = state.LastUpdateTotalHours;
                Rand.worldSeed       = state.LcgWorldSeed;
                Rand.currentSeed     = state.LcgCurrentSeed;
                Rand.mapGenSeed      = state.LcgMapGenSeed;

                double nowTotalHours = ws.api.World.Calendar.TotalHours;
                // Cap that at max 1 year or we simulate forever on startup
                LastUpdateTotalHours = Math.Max(LastUpdateTotalHours, nowTotalHours - 12 * 12 * 24);

                SnowAccumSnapshots = new RingArray <SnowAccumSnapshot>((int)(ws.api.World.Calendar.DaysPerYear * ws.api.World.Calendar.HoursPerDay) + 1, state.SnowAccumSnapshots);

                if (state.WeatherEvent != null)
                {
                    CurWeatherEvent       = WeatherEvents[state.WeatherEvent.Index];
                    CurWeatherEvent.State = state.WeatherEvent;
                }

                if (CurWeatherEvent == null)
                {
                    CurWeatherEvent = RandomWeatherEvent();
                    CurWeatherEvent.OnBeginUse();
                }
            }
        }