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); } }
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); } }
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; } }
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)); }
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)); } }
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(); } } }
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); }
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(); } } }