diff --git a/Commands/CPE/CmdEnvironment.cs b/Commands/CPE/CmdEnvironment.cs
index ae8466ecc..27fb9f451 100644
--- a/Commands/CPE/CmdEnvironment.cs
+++ b/Commands/CPE/CmdEnvironment.cs
@@ -1,7 +1,7 @@
/*
Copyright 2011 MCForge
- Dual-licensed under the Educational Community License, Version 2.0 and
+ Dual-licensed under the Educational Community License, Version 2.0 and
the GNU General Public License, Version 3 (the "Licenses"); you may
not use this file except in compliance with the Licenses. You may
obtain a copy of the Licenses at
@@ -53,55 +53,55 @@ namespace MCGalaxy.Commands {
Level lvl = p.level;
switch (variable) {
case "fog":
- SetColour(p, value, 2, "fog", ref lvl.FogColor); break;
+ LevelEnv.SetColour(p, value, 2, "fog", ref lvl.FogColor); break;
case "cloud":
case "clouds":
- SetColour(p, value, 1, "cloud", ref lvl.CloudColor); break;
+ LevelEnv.SetColour(p, value, 1, "cloud", ref lvl.CloudColor); break;
case "sky":
- SetColour(p, value, 0, "sky", ref lvl.SkyColor); break;
+ LevelEnv.SetColour(p, value, 0, "sky", ref lvl.SkyColor); break;
case "dark":
case "shadow":
- SetColour(p, value, 3, "shadow", ref lvl.ShadowColor); break;
+ LevelEnv.SetColour(p, value, 3, "shadow", ref lvl.ShadowColor); break;
case "sun":
case "light":
case "sunlight":
- SetColour(p, value, 4, "sunlight", ref lvl.LightColor); break;
+ LevelEnv.SetColour(p, value, 4, "sunlight", ref lvl.LightColor); break;
case "weather":
- SetWeather(p, value); break;
+ LevelEnv.SetWeather(p, p.level, value); break;
case "cloudsheight":
case "cloudheight":
- SetShort(p, value, EnvProp.CloudsLevel,
+ LevelEnv.SetShort(p, value, EnvProp.CloudsLevel,
"clouds height", (short)(lvl.Height + 2), ref lvl.CloudsHeight); break;
case "waterlevel":
case "edgelevel":
case "level":
- SetShort(p, value, EnvProp.EdgeLevel,
+ LevelEnv.SetShort(p, value, EnvProp.EdgeLevel,
"water level", (short)(lvl.Height / 2), ref lvl.EdgeLevel); break;
case "maxfogdistance":
case "maxfog":
case "fogdistance":
case "fogdist":
- SetShort(p, value, EnvProp.MaxFog,
+ LevelEnv.SetShort(p, value, EnvProp.MaxFog,
"max fog distance", 0, ref lvl.MaxFogDistance); break;
case "cloudspeed":
case "cloudsspeed":
- SetFloat(p, value, EnvProp.CloudsSpeed, 256, "clouds speed",
+ LevelEnv.SetFloat(p, value, EnvProp.CloudsSpeed, 256, "clouds speed",
256, ref lvl.CloudsSpeed, -32767, 32767); break;
case "weatherspeed":
- SetFloat(p, value, EnvProp.WeatherSpeed, 256, "weather speed",
+ LevelEnv.SetFloat(p, value, EnvProp.WeatherSpeed, 256, "weather speed",
256, ref lvl.WeatherSpeed, -32767, 32767); break;
case "weatherfade":
- SetFloat(p, value, EnvProp.WeatherFade, 128, "weather fade rate",
+ LevelEnv.SetFloat(p, value, EnvProp.WeatherFade, 128, "weather fade rate",
128, ref lvl.WeatherFade, 0, 255); break;
case "horizon":
case "edge":
case "water":
- SetBlock(p, value, EnvProp.EdgeBlock,
+ LevelEnv.SetBlock(p, value, EnvProp.EdgeBlock,
"edge block", Block.waterstill, ref lvl.HorizonBlock); break;
case "side":
case "border":
case "bedrock":
- SetBlock(p, value, EnvProp.SidesBlock,
+ LevelEnv.SetBlock(p, value, EnvProp.SidesBlock,
"sides block", Block.blackrock, ref lvl.EdgeBlock); break;
case "preset":
if (!SetPreset(p, value)) return;
@@ -115,130 +115,19 @@ namespace MCGalaxy.Commands {
static void ResetEnv(Player p) {
Level lvl = p.level;
SetPreset(p, "normal");
- SetWeather(p, "normal");
+ LevelEnv.SetWeather(p, lvl, "normal");
- SetBlock(p, "normal", EnvProp.EdgeBlock,
+ LevelEnv.SetBlock(p, "normal", EnvProp.EdgeBlock,
"edge block", Block.waterstill, ref lvl.HorizonBlock);
- SetBlock(p, "normal", EnvProp.SidesBlock,
+ LevelEnv.SetBlock(p, "normal", EnvProp.SidesBlock,
"sides block", Block.blackrock, ref lvl.EdgeBlock);
- SetShort(p, "normal", EnvProp.EdgeLevel,
+ LevelEnv.SetShort(p, "normal", EnvProp.EdgeLevel,
"water level", (short)(lvl.Height / 2), ref lvl.EdgeLevel);
- SetShort(p, "normal", EnvProp.CloudsLevel,
+ LevelEnv.SetShort(p, "normal", EnvProp.CloudsLevel,
"clouds height", (short)(lvl.Height + 2), ref lvl.CloudsHeight);
}
- static void SetWeather(Player p, string value) {
- byte weather = 255;
- if (IsResetString(value)) {
- Player.Message(p, "Reset weather for {0}%S to 0 (sun)", p.level.name);
- weather = 0;
- } else {
- if (byte.TryParse(value, out weather)) {
- } else if (value.CaselessEq("sun")) { weather = 0;
- } else if (value.CaselessEq("rain")) { weather = 1;
- } else if (value.CaselessEq("snow")) { weather = 2;
- }
-
- if (weather > 2) {
- Player.Message(p, "Please use a valid integer (0,1,2) or string (sun,rain,snow)"); return;
- }
- string type = weather == 0 ? "%SSun" : (weather == 1 ? "&1Rain" : "&fSnow");
- Player.Message(p, "&aSet weather for {0}&a to {1} ({2}&a)", p.level.name, weather, type);
- }
-
- p.level.Weather = weather;
- // Send the changed colour to all players affected by the command.
- Player[] players = PlayerInfo.Online.Items;
- foreach (Player pl in players) {
- if (pl.level == p.level && pl.HasCpeExt(CpeExt.EnvWeatherType))
- pl.SendSetMapWeather(weather);
- }
- }
-
- static void SetBlock(Player p, string value, EnvProp prop,
- string variable, byte defValue, ref byte target) {
- if (IsResetString(value)) {
- Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
- target = defValue;
- } else {
- if (!CheckBlock(p, value, variable, ref target)) return;
- }
- SendCurrentMapAppearance(p.level, prop, target);
- }
-
- static void SetShort(Player p, string value, EnvProp prop,
- string variable, short defValue, ref int target) {
- if (IsResetString(value)) {
- Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
- target = defValue;
- } else {
- if (!CheckShort(p, value, variable, ref target)) return;
- }
- SendCurrentMapAppearance(p.level, prop, target);
- }
-
- static void SetFloat(Player p, string value, EnvProp prop, int scale, string variable,
- short defValue, ref int target, int min, int max) {
- if (IsResetString(value)) {
- Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
- target = defValue;
- } else {
- if (!CheckFloat(p, value, variable, ref target, scale, min, max)) return;
- }
- SendCurrentMapAppearance(p.level, prop, target);
- }
-
- static bool CheckBlock(Player p, string value, string variable, ref byte modify) {
- byte extBlock = 0;
- byte block = DrawCmd.GetBlock(p, value, out extBlock, false);
- if (block == Block.Zero) return false;
- if (block >= Block.CpeCount && block != Block.custom_block) {
- Player.Message(p, "Cannot use physics block ids for /env."); return false;
- }
-
- if (block == Block.shrub || block == Block.yellowflower || block == Block.redflower ||
- block == Block.mushroom || block == Block.redmushroom || block == Block.rope || block == Block.fire) {
- Player.Message(p, "Env: Cannot use {0} for {1}.", block, variable);
- } else {
- modify = block == Block.custom_block ? extBlock : block;
- Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, modify);
- return true;
- }
- return false;
- }
-
- static bool CheckShort(Player p, string raw, string variable, ref int modify) {
- short value;
- if (!short.TryParse(raw, out value)) {
- Player.Message(p, "Env: \"{0}\" is not a valid integer.", value);
- return false;
- } else {
- modify = value;
- Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, value);
- return true;
- }
- }
-
- static bool CheckFloat(Player p, string raw, string variable,
- ref int modify, int scale, float min, float max) {
- float value;
- min /= scale; max /= scale;
-
- if (!float.TryParse(raw, out value)) {
- Player.Message(p, "Env: \"{0}\" is not a valid decimal.", value);
- return false;
- } else if (value < min || value > max) {
- Player.Message(p, "Env: \"{0}\" must be between {1} and {2}.",
- value, min.ToString("F2"), max.ToString("F2"));
- return false;
- } else {
- modify = (int)(value * scale);
- Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, value.ToString("F2"));
- return true;
- }
- }
-
static bool SetPreset(Player p, string value) {
EnvPreset preset = null; // fog, sky, clouds, sun, shadow
if (value.CaselessEq("midnight")) {
@@ -264,15 +153,15 @@ namespace MCGalaxy.Commands {
}
if( preset != null ) {
- SendEnvColorPackets(p, 0, preset.Sky);
+ LevelEnv.SendEnvColorPackets(p, 0, preset.Sky);
p.level.SkyColor = preset.Sky;
- SendEnvColorPackets(p, 1, preset.Clouds);
+ LevelEnv.SendEnvColorPackets(p, 1, preset.Clouds);
p.level.CloudColor = preset.Clouds;
- SendEnvColorPackets(p, 2, preset.Fog);
+ LevelEnv.SendEnvColorPackets(p, 2, preset.Fog);
p.level.FogColor = preset.Fog;
- SendEnvColorPackets(p, 3, preset.Shadow);
+ LevelEnv.SendEnvColorPackets(p, 3, preset.Shadow);
p.level.ShadowColor = preset.Shadow;
- SendEnvColorPackets(p, 4, preset.Sun);
+ LevelEnv.SendEnvColorPackets(p, 4, preset.Sun);
p.level.LightColor = preset.Sun;
return true;
} else {
@@ -290,69 +179,7 @@ namespace MCGalaxy.Commands {
Sun = sun; Shadow = shadow;
}
}
-
- static bool IsValidHex(string hex) {
- for (int i = 0; i < hex.Length; i++) {
- if (!Colors.IsStandardColor(hex[i])) return false;
- }
- return true;
- }
-
- static bool IsResetString(string value) {
- return value.CaselessEq("-1") || value.CaselessEq("normal") ||
- value.CaselessEq("reset") || value.CaselessEq("default");
- }
-
-
- static void SendCurrentMapAppearance(Level lvl, EnvProp prop, int value) {
- Player[] players = PlayerInfo.Online.Items;
- foreach (Player pl in players) {
- if (pl.level != lvl) continue;
-
- if (pl.HasCpeExt(CpeExt.EnvMapAspect))
- pl.SendSetEnvMapProperty(prop, value);
- else
- pl.SendCurrentMapAppearance();
- }
- }
-
- static void SetColour(Player p, string value, byte envType, string envTypeName, ref string target) {
- if (IsResetString(value)) {
- Player.Message(p, "Reset {0} color for {1}%S to normal", envTypeName, p.level.name);
- target = null;
- } else {
- if (value.Length > 0 && value[0] == '#')
- value = value.Substring(1);
- if (value.Length != 6 || !IsValidHex(value)) {
- p.SendMessage(string.Format("Env: \"#{0}\" is not a valid HEX color code.", value));
- return;
- }
-
- Player.Message(p, "Set {0} color for {1}%S to #{2}", envTypeName, p.level.name, value);
- target = value;
- }
- SendEnvColorPackets(p, envType, value);
- }
-
- static void SendEnvColorPackets(Player p, byte envType, string value) {
- Player[] players = PlayerInfo.Online.Items;
- foreach (Player pl in players) {
- if (pl.level == p.level)
- SendEnvColorPacket(pl, envType, value);
- }
- }
-
- static void SendEnvColorPacket(Player p, byte envType, string value) {
- if (p.HasCpeExt(CpeExt.EnvColors)) {
- try {
- System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#" + value.ToUpper());
- p.SendEnvColor(envType, col.R, col.G, col.B);
- } catch {
- p.SendEnvColor(envType, -1, -1, -1);
- }
- }
- }
-
+
static void SendPresetsMessage(Player p) {
p.SendMessage("/env preset [type] -- Uses an env preset on your current map");
p.SendMessage("Valid types: Cartoon/Midnight/Midnight2/Noir/Normal/Trippy/Watery/Sunset/Gloomy/Cloudy");
diff --git a/Commands/CmdOverseer.cs b/Commands/CmdOverseer.cs
index 4159f3347..9ed428a8c 100644
--- a/Commands/CmdOverseer.cs
+++ b/Commands/CmdOverseer.cs
@@ -103,16 +103,12 @@ namespace MCGalaxy.Commands
if (type == "FOG" || type == "CLOUD" || type == "SKY" || type == "SHADOW" || type == "SUN" ||
type == "LEVEL" || type == "CLOUDHEIGHT" || type == "HORIZON" || type == "BORDER" || type == "MAXFOG") {
string col = value == "" ? "normal" : value;
- Command.all.Find("env").Use(p, "l " + type.ToLower() + " " + col);
+ Command.all.Find("env").Use(p, type.ToLower() + " " + col);
} else if (type == "WEATHER") {
- if (value.CaselessEq("SUN") || value.CaselessEq("NORMAL")) {
- Command.all.Find("env").Use(p, "weather 0");
- } else if (value.CaselessEq("RAIN")) {
- Command.all.Find("env").Use(p, "weather 1");
- } else if (value.CaselessEq("SNOW")) {
- Command.all.Find("env").Use(p, "weather 2");
- } else {
+ if (value == "") {
Player.Message(p, "/os env weather [sun/rain/snow/normal] -- Changes the weather of your map.");
+ } else {
+ LevelEnv.SetWeather(p, p.level, value);
}
} else {
Player.Message(p, "/os env [fog/cloud/sky/shadow/sun] [hex color code] -- Changes env colors of your map");
diff --git a/Commands/World/CmdPhysics.cs b/Commands/World/CmdPhysics.cs
index ca956065a..ee9f749cb 100644
--- a/Commands/World/CmdPhysics.cs
+++ b/Commands/World/CmdPhysics.cs
@@ -67,7 +67,7 @@ namespace MCGalaxy.Commands {
Player.Message(p, "Physics killed on all levels.");
}
- static void SetPhysics(Level lvl, int state) {
+ internal static void SetPhysics(Level lvl, int state) {
lvl.setPhysics(state);
if (state == 0) lvl.ClearPhysics();
string stateDesc = states[state];
diff --git a/Commands/building/CmdUndo.cs b/Commands/building/CmdUndo.cs
index 00ebdc6e8..e028f8bb2 100644
--- a/Commands/building/CmdUndo.cs
+++ b/Commands/building/CmdUndo.cs
@@ -156,7 +156,7 @@ namespace MCGalaxy.Commands.Building {
if (p != null && !p.group.CanExecute("physics")) {
Player.Message(p, "You can only undo physics if you can use /physics."); return;
}
- Command.all.Find("physics").Use(p, "0");
+ CmdPhysics.SetPhysics(p.level, 0);
UndoPhysicsDrawOp op = new UndoPhysicsDrawOp();
op.seconds = seconds;
DrawOp.DoDrawOp(op, null, p, new Vec3S32[] { Vec3U16.MaxVal, Vec3U16.MaxVal } );
diff --git a/Levels/LevelEnv.cs b/Levels/LevelEnv.cs
new file mode 100644
index 000000000..6fa896c5a
--- /dev/null
+++ b/Levels/LevelEnv.cs
@@ -0,0 +1,196 @@
+/*
+ Copyright 2015 MCGalaxy team
+
+ Dual-licensed under the Educational Community License, Version 2.0 and
+ the GNU General Public License, Version 3 (the "Licenses"); you may
+ not use this file except in compliance with the Licenses. You may
+ obtain a copy of the Licenses at
+
+ http://www.opensource.org/licenses/ecl2.php
+ http://www.gnu.org/licenses/gpl-3.0.html
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the Licenses are distributed on an "AS IS"
+ BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ or implied. See the Licenses for the specific language governing
+ permissions and limitations under the Licenses.
+ */
+using System;
+using MCGalaxy.Commands.Building;
+
+namespace MCGalaxy {
+ public static class LevelEnv {
+
+ public static void SetWeather(Player p, Level lvl, string value) {
+ byte weather = 255;
+ if (IsResetString(value)) {
+ Player.Message(p, "Reset weather for {0}%S to 0 (sun)", lvl.name);
+ weather = 0;
+ } else {
+ if (byte.TryParse(value, out weather)) {
+ } else if (value.CaselessEq("sun")) { weather = 0;
+ } else if (value.CaselessEq("rain")) { weather = 1;
+ } else if (value.CaselessEq("snow")) { weather = 2;
+ }
+
+ if (weather > 2) {
+ Player.Message(p, "Weather can be either sun, rain, or snow."); return;
+ }
+ string type = weather == 0 ? "%SSun" : (weather == 1 ? "&1Rain" : "&fSnow");
+ Player.Message(p, "&aSet weather for {0}&a to {1} ({2}&a)", lvl.name, weather, type);
+ }
+
+ lvl.Weather = weather;
+ Player[] players = PlayerInfo.Online.Items;
+ foreach (Player pl in players) {
+ if (pl.level == lvl && pl.HasCpeExt(CpeExt.EnvWeatherType))
+ pl.SendSetMapWeather(weather);
+ }
+ }
+
+ public static void SetBlock(Player p, string value, EnvProp prop,
+ string variable, byte defValue, ref byte target) {
+ if (IsResetString(value)) {
+ Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
+ target = defValue;
+ } else {
+ if (!CheckBlock(p, value, variable, ref target)) return;
+ }
+ SendCurrentMapAppearance(p.level, prop, target);
+ }
+
+ public static void SetShort(Player p, string value, EnvProp prop,
+ string variable, short defValue, ref int target) {
+ if (IsResetString(value)) {
+ Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
+ target = defValue;
+ } else {
+ if (!CheckShort(p, value, variable, ref target)) return;
+ }
+ SendCurrentMapAppearance(p.level, prop, target);
+ }
+
+ public static void SetFloat(Player p, string value, EnvProp prop, int scale, string variable,
+ short defValue, ref int target, int min, int max) {
+ if (IsResetString(value)) {
+ Player.Message(p, "Reset {0} for {0}%S to normal", variable, p.level.name);
+ target = defValue;
+ } else {
+ if (!CheckFloat(p, value, variable, ref target, scale, min, max)) return;
+ }
+ SendCurrentMapAppearance(p.level, prop, target);
+ }
+
+ public static void SetColour(Player p, string value, byte envType, string envTypeName, ref string target) {
+ if (IsResetString(value)) {
+ Player.Message(p, "Reset {0} color for {1}%S to normal", envTypeName, p.level.name);
+ target = null;
+ } else {
+ if (value.Length > 0 && value[0] == '#')
+ value = value.Substring(1);
+ if (value.Length != 6 || !IsValidHex(value)) {
+ p.SendMessage(string.Format("Env: \"#{0}\" is not a valid HEX color code.", value));
+ return;
+ }
+
+ Player.Message(p, "Set {0} color for {1}%S to #{2}", envTypeName, p.level.name, value);
+ target = value;
+ }
+ SendEnvColorPackets(p, envType, value);
+ }
+
+ static bool CheckBlock(Player p, string value, string variable, ref byte modify) {
+ byte extBlock = 0;
+ byte block = DrawCmd.GetBlock(p, value, out extBlock, false);
+ if (block == Block.Zero) return false;
+ if (block >= Block.CpeCount && block != Block.custom_block) {
+ Player.Message(p, "Cannot use physics block ids for /env."); return false;
+ }
+
+ if (block == Block.shrub || block == Block.yellowflower || block == Block.redflower ||
+ block == Block.mushroom || block == Block.redmushroom || block == Block.rope || block == Block.fire) {
+ Player.Message(p, "Env: Cannot use {0} for {1}.", block, variable);
+ } else {
+ modify = block == Block.custom_block ? extBlock : block;
+ Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, modify);
+ return true;
+ }
+ return false;
+ }
+
+ static bool CheckShort(Player p, string raw, string variable, ref int modify) {
+ short value;
+ if (!short.TryParse(raw, out value)) {
+ Player.Message(p, "Env: \"{0}\" is not a valid integer.", value);
+ return false;
+ } else {
+ modify = value;
+ Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, value);
+ return true;
+ }
+ }
+
+ static bool CheckFloat(Player p, string raw, string variable,
+ ref int modify, int scale, float min, float max) {
+ float value;
+ min /= scale; max /= scale;
+
+ if (!float.TryParse(raw, out value)) {
+ Player.Message(p, "Env: \"{0}\" is not a valid decimal.", value);
+ return false;
+ } else if (value < min || value > max) {
+ Player.Message(p, "Env: \"{0}\" must be between {1} and {2}.",
+ value, min.ToString("F2"), max.ToString("F2"));
+ return false;
+ } else {
+ modify = (int)(value * scale);
+ Player.Message(p, "Set {0} for {1}%S to {2}", variable, p.level.name, value.ToString("F2"));
+ return true;
+ }
+ }
+
+ static bool IsValidHex(string hex) {
+ for (int i = 0; i < hex.Length; i++) {
+ if (!Colors.IsStandardColor(hex[i])) return false;
+ }
+ return true;
+ }
+
+ static bool IsResetString(string value) {
+ return value.CaselessEq("-1") || value.CaselessEq("normal") ||
+ value.CaselessEq("reset") || value.CaselessEq("default");
+ }
+
+
+ static void SendCurrentMapAppearance(Level lvl, EnvProp prop, int value) {
+ Player[] players = PlayerInfo.Online.Items;
+ foreach (Player pl in players) {
+ if (pl.level != lvl) continue;
+
+ if (pl.HasCpeExt(CpeExt.EnvMapAspect))
+ pl.SendSetEnvMapProperty(prop, value);
+ else
+ pl.SendCurrentMapAppearance();
+ }
+ }
+
+ internal static void SendEnvColorPackets(Player p, byte envType, string value) {
+ Player[] players = PlayerInfo.Online.Items;
+ foreach (Player pl in players) {
+ if (pl.level == p.level)
+ SendEnvColorPacket(pl, envType, value);
+ }
+ }
+
+ static void SendEnvColorPacket(Player p, byte envType, string value) {
+ if (p.HasCpeExt(CpeExt.EnvColors)) {
+ try {
+ System.Drawing.Color col = System.Drawing.ColorTranslator.FromHtml("#" + value.ToUpper());
+ p.SendEnvColor(envType, col.R, col.G, col.B);
+ } catch {
+ p.SendEnvColor(envType, -1, -1, -1);
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/MCGalaxy_.csproj b/MCGalaxy_.csproj
index 2693b8c83..91853855b 100644
--- a/MCGalaxy_.csproj
+++ b/MCGalaxy_.csproj
@@ -489,6 +489,7 @@
+