private void cmdSnowAccum(IServerPlayer player, int groupId, CmdArgs args) { WeatherSystemServer wsys = api.ModLoader.GetModSystem <WeatherSystemServer>(); string cmd = args.PopWord(); if (cmd == "on") { wsys.snowSimSnowAccu.ProcessChunks = true; player.SendMessage(groupId, "Snow accum process chunks on", EnumChatType.CommandSuccess); return; } if (cmd == "off") { wsys.snowSimSnowAccu.ProcessChunks = false; player.SendMessage(groupId, "Snow accum process chunks off", EnumChatType.CommandSuccess); return; } if (cmd == "processhere") { BlockPos plrPos = player.Entity.Pos.AsBlockPos; int chunksize = api.World.BlockAccessor.ChunkSize; Vec2i chunkPos = new Vec2i(plrPos.X / chunksize, plrPos.Z / chunksize); wsys.snowSimSnowAccu.AddToCheckQueue(chunkPos); player.SendMessage(groupId, "Ok, added to check queue", EnumChatType.CommandSuccess); return; } if (cmd == "info") { BlockPos plrPos = player.Entity.Pos.AsBlockPos; int chunksize = api.World.BlockAccessor.ChunkSize; Vec2i chunkPos = new Vec2i(plrPos.X / chunksize, plrPos.Z / chunksize); IServerMapChunk mc = sapi.WorldManager.GetMapChunk(chunkPos.X, chunkPos.Y); double lastSnowAccumUpdateTotalHours = mc.GetModdata <double>("lastSnowAccumUpdateTotalHours"); player.SendMessage(groupId, "lastSnowAccumUpdateTotalHours: " + lastSnowAccumUpdateTotalHours, EnumChatType.CommandSuccess); int regionX = (int)player.Entity.Pos.X / sapi.World.BlockAccessor.RegionSize; int regionZ = (int)player.Entity.Pos.Z / sapi.World.BlockAccessor.RegionSize; WeatherSystemServer wsysServer = sapi.ModLoader.GetModSystem <WeatherSystemServer>(); long index2d = wsysServer.MapRegionIndex2D(regionX, regionZ); WeatherSimulationRegion simregion; wsysServer.weatherSimByMapRegion.TryGetValue(index2d, out simregion); int reso = WeatherSimulationRegion.snowAccumResolution; SnowAccumSnapshot sumsnapshot = new SnowAccumSnapshot() { //SumTemperatureByRegionCorner = new API.FloatDataMap3D(reso, reso, reso), SnowAccumulationByRegionCorner = new FloatDataMap3D(reso, reso, reso) }; float[] sumdata = sumsnapshot.SnowAccumulationByRegionCorner.Data; // Can't grow bigger than one full snow block float max = 3 + 0.5f; int len = simregion.SnowAccumSnapshots.Length; int i = simregion.SnowAccumSnapshots.Start; // This code here causes wacky snow patterns // The lerp itself is fine!!! while (len-- > 0) { SnowAccumSnapshot hoursnapshot = simregion.SnowAccumSnapshots[i]; i = (i + 1) % simregion.SnowAccumSnapshots.Length; float[] snowaccumdata = hoursnapshot.SnowAccumulationByRegionCorner.Data; for (int j = 0; j < snowaccumdata.Length; j++) { sumdata[j] = GameMath.Clamp(sumdata[j] + snowaccumdata[j], -max, max); } lastSnowAccumUpdateTotalHours = Math.Max(lastSnowAccumUpdateTotalHours, hoursnapshot.TotalHours); } for (int j = 0; j < sumdata.Length; j++) { player.SendMessage(groupId, j + ": " + sumdata[j], EnumChatType.CommandSuccess); } return; } if (cmd == "here") { float amount = (float)args.PopFloat(0); BlockPos plrPos = player.Entity.Pos.AsBlockPos; int chunksize = api.World.BlockAccessor.ChunkSize; Vec2i chunkPos = new Vec2i(plrPos.X / chunksize, plrPos.Z / chunksize); IServerMapChunk mc = sapi.WorldManager.GetMapChunk(chunkPos.X, chunkPos.Y); int reso = WeatherSimulationRegion.snowAccumResolution; SnowAccumSnapshot sumsnapshot = new SnowAccumSnapshot() { SumTemperatureByRegionCorner = new FloatDataMap3D(reso, reso, reso), SnowAccumulationByRegionCorner = new FloatDataMap3D(reso, reso, reso) }; sumsnapshot.SnowAccumulationByRegionCorner.Data.Fill(amount); var updatepacket = wsys.snowSimSnowAccu.UpdateSnowLayer(sumsnapshot, true, mc, chunkPos, null); wsys.snowSimSnowAccu.accum = 1f; var ba = sapi.World.GetBlockAccessorBulkMinimalUpdate(true, false); ba.UpdateSnowAccumMap = false; wsys.snowSimSnowAccu.processBlockUpdates(mc, updatepacket, ba); ba.Commit(); player.SendMessage(groupId, "Ok, test snow accum gen complete", EnumChatType.CommandSuccess); return; } }
private void cmdWeatherServer(IServerPlayer player, int groupId, CmdArgs args) { WeatherSystemServer wsysServer = sapi.ModLoader.GetModSystem <WeatherSystemServer>(); int regionX = (int)player.Entity.Pos.X / sapi.World.BlockAccessor.RegionSize; int regionZ = (int)player.Entity.Pos.Z / sapi.World.BlockAccessor.RegionSize; string arg = args.PopWord(); if (arg == "setprecip") { if (args.Length == 0) { if (wsysServer.OverridePrecipitation == null) { player.SendMessage(groupId, "Currently no precipitation override active.", EnumChatType.CommandSuccess); } else { player.SendMessage(groupId, string.Format("Override precipitation value is currently at {0}.", wsysServer.OverridePrecipitation), EnumChatType.CommandSuccess); } return; } string val = args.PopWord(); if (val == "auto") { wsysServer.OverridePrecipitation = null; player.SendMessage(groupId, "Ok auto precipitation on", EnumChatType.CommandSuccess); } else { float level = val.ToFloat(0); wsysServer.OverridePrecipitation = level; player.SendMessage(groupId, string.Format("Ok precipitation set to {0}", level), EnumChatType.CommandSuccess); } wsysServer.serverChannel.BroadcastPacket(new WeatherConfigPacket() { OverridePrecipitation = wsysServer.OverridePrecipitation, RainCloudDaysOffset = wsysServer.RainCloudDaysOffset }); return; } if (arg == "cloudypos" || arg == "cyp") { if (args.Length == 0) { player.SendMessage(groupId, "Cloud level rel = " + wsysServer.CloudLevelRel, EnumChatType.CommandSuccess); return; } wsysServer.CloudLevelRel = (float)args.PopDouble(0.95f); wsysServer.serverChannel.BroadcastPacket(new WeatherCloudYposPacket() { CloudYRel = wsysServer.CloudLevelRel }); player.SendMessage(groupId, string.Format("Cloud level rel {0:0.##} set. (y={1})", wsysServer.CloudLevelRel, (int)(wsysServer.CloudLevelRel * wsysServer.api.World.BlockAccessor.MapSizeY)), EnumChatType.CommandSuccess); return; } if (arg == "stoprain") { rainStopFunc(player, groupId, true); wsysServer.broadCastConfigUpdate(); return; } if (arg == "acp") { wsysServer.autoChangePatterns = !wsysServer.autoChangePatterns; player.SendMessage(groupId, "Ok autochange weather patterns now " + (wsysServer.autoChangePatterns ? "on" : "off"), EnumChatType.CommandSuccess); return; } if (arg == "lp") { string patterns = string.Join(", ", wsysServer.WeatherConfigs.Select(c => c.Code)); player.SendMessage(groupId, "Patterns: " + patterns, EnumChatType.CommandSuccess); return; } if (arg == "t") { foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.TriggerTransition(); } player.SendMessage(groupId, "Ok transitioning to another weather pattern", EnumChatType.CommandSuccess); return; } if (arg == "c") { foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.TriggerTransition(1f); } player.SendMessage(groupId, "Ok selected another weather pattern", EnumChatType.CommandSuccess); return; } if (arg == "setw") { wsysServer.ReloadConfigs(); string code = args.PopWord(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.ReloadPatterns(api.World.Seed); ok &= val.Value.SetWindPattern(code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such wind pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok wind pattern set", EnumChatType.CommandSuccess); } return; } if (arg == "setev" || arg == "setevr" || arg == "setevf") { wsysServer.ReloadConfigs(); string code = args.PopWord(); WeatherSimulationRegion weatherSim; if (arg == "setevr") { long index2d = wsysServer.MapRegionIndex2D(regionX, regionZ); wsysServer.weatherSimByMapRegion.TryGetValue(index2d, out weatherSim); if (weatherSim == null) { player.SendMessage(groupId, "Weather sim not loaded (yet) for this region", EnumChatType.CommandError); return; } if (weatherSim.SetWeatherEvent(code, true)) { weatherSim.CurWeatherEvent.AllowStop = arg != "setevf"; weatherSim.CurWeatherEvent.OnBeginUse(); weatherSim.TickEvery25ms(0.025f); player.SendMessage(groupId, "Ok weather event for this region set", EnumChatType.CommandSuccess); } else { player.SendMessage(groupId, "No such weather event found", EnumChatType.CommandError); } } else { bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { ok &= val.Value.SetWeatherEvent(code, true); val.Value.CurWeatherEvent.AllowStop = arg != "setevf"; if (ok) { val.Value.CurWeatherEvent.OnBeginUse(); val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such weather event found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok weather event set for all loaded regions", EnumChatType.CommandSuccess); } } return; } if (arg == "set" || arg == "seti") { wsysServer.ReloadConfigs(); string code = args.PopWord(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.ReloadPatterns(api.World.Seed); ok &= val.Value.SetWeatherPattern(code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok weather pattern set for all loaded regions", EnumChatType.CommandSuccess); } return; } if (arg == "setirandom") { wsysServer.ReloadConfigs(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { ok &= val.Value.SetWeatherPattern(val.Value.RandomWeatherPattern().config.Code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok random weather pattern set", EnumChatType.CommandSuccess); } return; } if (arg == "setir") { wsysServer.ReloadConfigs(); string code = args.PopWord(); WeatherSimulationRegion weatherSim; long index2d = wsysServer.MapRegionIndex2D(regionX, regionZ); wsysServer.weatherSimByMapRegion.TryGetValue(index2d, out weatherSim); if (weatherSim == null) { player.SendMessage(groupId, "Weather sim not loaded (yet) for this region", EnumChatType.CommandError); return; } if (weatherSim.SetWeatherPattern(code, true)) { weatherSim.TickEvery25ms(0.025f); player.SendMessage(groupId, "Ok weather pattern set for current region", EnumChatType.CommandSuccess); } else { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } return; } string text = getWeatherInfo <WeatherSystemServer>(player); player.SendMessage(groupId, text, EnumChatType.CommandSuccess); }
private void cmdWeatherServer(IServerPlayer player, int groupId, CmdArgs args) { WeatherSystemServer wsysServer = sapi.ModLoader.GetModSystem <WeatherSystemServer>(); int regionX = (int)player.Entity.Pos.X / sapi.World.BlockAccessor.RegionSize; int regionZ = (int)player.Entity.Pos.Z / sapi.World.BlockAccessor.RegionSize; string arg = args.PopWord(); if (arg == "acp") { wsysServer.autoChangePatterns = !wsysServer.autoChangePatterns; player.SendMessage(groupId, "Ok autochange weather patterns now " + (wsysServer.autoChangePatterns ? "on" : "off"), EnumChatType.CommandSuccess); return; } if (arg == "lp") { string patterns = string.Join(", ", wsysServer.weatherConfigs.Select(c => c.Code)); player.SendMessage(groupId, "Patterns: " + patterns, EnumChatType.CommandSuccess); return; } if (arg == "t") { foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.TriggerTransition(); } player.SendMessage(groupId, "Ok transitioning to another weather pattern", EnumChatType.CommandSuccess); return; } if (arg == "c") { foreach (var val in wsysServer.weatherSimByMapRegion) { val.Value.TriggerTransition(1f); } player.SendMessage(groupId, "Ok selected another weather pattern", EnumChatType.CommandSuccess); return; } if (arg == "setw") { wsysServer.ReloadConfigs(); string code = args.PopWord(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { ok &= val.Value.SetWindPattern(code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such wind pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok wind pattern set", EnumChatType.CommandSuccess); } return; } if (arg == "set" || arg == "seti") { wsysServer.ReloadConfigs(); string code = args.PopWord(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { ok &= val.Value.SetWeatherPattern(code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok weather pattern set", EnumChatType.CommandSuccess); } return; } if (arg == "setirandom") { wsysServer.ReloadConfigs(); bool ok = true; foreach (var val in wsysServer.weatherSimByMapRegion) { ok &= val.Value.SetWeatherPattern(val.Value.RandomWeatherPattern().config.Code, true); if (ok) { val.Value.TickEvery25ms(0.025f); } } if (!ok) { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } else { player.SendMessage(groupId, "Ok weather pattern set", EnumChatType.CommandSuccess); } return; } if (arg == "setir") { wsysServer.ReloadConfigs(); string code = args.PopWord(); WeatherSimulationRegion weatherSim; long index2d = wsysServer.MapRegionIndex2D(regionX, regionZ); wsysServer.weatherSimByMapRegion.TryGetValue(index2d, out weatherSim); if (weatherSim == null) { player.SendMessage(groupId, "Weather sim not loaded (yet) for this region", EnumChatType.CommandError); return; } if (weatherSim.SetWeatherPattern(code, true)) { weatherSim.TickEvery25ms(0.025f); player.SendMessage(groupId, "Ok weather pattern set", EnumChatType.CommandSuccess); } else { player.SendMessage(groupId, "No such weather pattern found", EnumChatType.CommandError); } return; } string text = getWeatherInfo <WeatherSystemServer>(player); player.SendMessage(groupId, text, EnumChatType.CommandSuccess); }